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.