Interface de ligne de commande

remix-tests

remix-tests est un outil qui peut être utilisé comme une solution CLI (Command Line Interface) pour exécuter les tests unitaires de Solidity. C’est le même outil qui fonctionne comme une bibliothèque sous le plugin Solidity Unit Testing de Remix. Il est disponible sur NPM en tant que @remix-project/remix-tests.

Commencez

Vous pouvez l’installer en utilisant NPM :

  • En tant que dépendance de développement :

npm install --save-dev @remix-project/remix-tests

  • En tant que module NPM global :

npm install -g @remix-project/remix-tests

Pour confirmer l’installation, exécutez :

$ remix-tests version
0.1.36

La version doit être la même que sur NPM.

Comment l’utiliser ?

Vous pouvez voir toutes les options disponibles en utilisant la commande help.

$ remix-tests help           
Usage: remix-tests [options] [command]

Options:
  -V, --version            output the version number
  -c, --compiler <string>  set compiler version (e.g: 0.6.1, 0.7.1 etc)
  -e, --evm <string>       set EVM version (e.g: petersburg, istanbul etc)
  -o, --optimize <bool>    enable/disable optimization
  -r, --runs <number>      set runs (e.g: 150, 250 etc)
  -v, --verbose <level>    set verbosity level (0 to 5)
  -h, --help               output usage information

Commands:
  version                  output the version number
  help                     output usage information

La structure générale d’une commande est la suivante :

$ remix-tests <options> <file/directory path>

Pour exécuter tous les fichiers de test contenus dans le répertoire examples, procédez comme suit

$ remix-tests examples/

Pour exécuter un seul fichier de test nommé simple_storage_test.sol dans le répertoire examples.

$ remix-tests examples/simple_storage_test.sol

REMARQUE: remix-tests supposera que le nom du fichier de test(s) se termine par "_test.sol". par exemple simple_storage_test.sol

Exemple

Considérons un contrat de stockage simple nommé simple_storage.sol :

pragma solidity >=0.4.22 <=0.8.0;

contract SimpleStorage {
  uint public storedData;

  constructor() public {
    storedData = 100;
  }

  function set(uint x) public {
    storedData = x;
  }

  function get() public view returns (uint retVal) {
    return storedData;
  }
}

Le fichier de test simple_storage_test.sol peut être comme :

pragma solidity >=0.4.22 <=0.8.0;
import "remix_tests.sol"; // injected by remix-tests
import "./simple_storage.sol";

contract MyTest {
  SimpleStorage foo;

  function beforeAll() public {
    foo = new SimpleStorage();
  }

  function initialValueShouldBe100() public returns (bool) {
    return Assert.equal(foo.get(), 100, "initial value is not correct");
  }

  function initialValueShouldNotBe200() public returns (bool) {
    return Assert.notEqual(foo.get(), 200, "initial value is not correct");
  }

  function shouldTriggerOneFail() public {
    Assert.equal(uint(1), uint(2), "uint test 1 fails");
    Assert.notEqual(uint(1), uint(2), "uint test 2 passes");
  }

  function shouldTriggerOnePass() public {
    Assert.equal(uint(1), uint(1), "uint test 3 passes");
  }
}

L’exécution du fichier simple_storage_test.sol produira le résultat suivant :

$ remix-tests simple_storage_test.sol

	👁	:: Running remix-tests - Unit testing for solidity ::	👁

'creation of library remix_tests.sol:Assert pending...'

	  MyTest
	  Initial value should be100
	  Initial value should not be200
	  Should trigger one fail
	  Should trigger one pass


3 passing (0.282s)
1 failing

  1) MyTest: Should trigger one fail

	 error: uint test 1 fails
	 expected value to be equal to: 2
	 returned: 1

Contexte de compilation personnalisé

La plupart des options de remix-tests sont là pour définir un contexte de compilation personnalisé. Avec un contexte de compilateur personnalisé étendu, l’exécution du fichier de test ci-dessus se déroulera comme suit :

$ remix-tests --compiler 0.7.4 --evm istanbul --optimize true --runs 300 simple_storage_test.sol

	👁	:: Running remix-tests - Unit testing for solidity ::	👁

[14:03:18] info: Compiler version set to 0.7.4. Latest version is 0.8.0
[14:03:18] info: EVM set to istanbul
[14:03:18] info: Optimization is enabled
[14:03:18] info: Runs set to 300
Loading remote solc version v0.7.4+commit.3f05b770 ...
'creation of library remix_tests.sol:Assert pending...'

	  MyTest
	  Initial value should be100
	  Initial value should not be200
	  Should trigger one fail
	  Should trigger one pass


3 passing (0.316s)
1 failing

  1) MyTest: Should trigger one fail

	 error: uint test 1 fails
	 expected value to be equal to: 2
	 returned: 1

N’oubliez pas que la version personnalisée du compilateur nécessite une connexion internet pour charger le compilateur.

En tant que solution d’IC

remix-tests peut également être utilisé pour les tests d’intégration continue (CI).

Pour un exemple d’implémentation, voir Su Squares contract et Travis build qui utilise remix-tests pour l’intégration continue.