Interfaz de línea de comandos
remix-tests
remix-tests
es una herramienta que puede ser utilizada como una solución CLI (Command Line Interface) para ejecutar las pruebas unitarias de solidity. Esta es la misma herramienta que funciona como una librería bajo el plugin Solidity Unit Testing
de Remix. Está disponible en NPM como @remix-project/remix-tests
.
Empezar
Puede instalarlo utilizando NPM:
Como dependencia dev:
npm install --save-dev @remix-project/remix-tests
Como módulo NPM global:
npm install -g @remix-project/remix-tests
Para confirmar la instalación, ejecute:
$ remix-tests version
0.1.36
La versión debe ser la misma que en NPM.
Cómo utilizarlo
Puede ver todas las opciones disponibles utilizando el comando 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 estructura general de un comando es la siguiente
$ remix-tests <options> <file/directory path>
Para ejecutar todos los archivos de prueba dentro del directorio `examples
$ remix-tests examples/
Para ejecutar un único archivo de prueba llamado simple_storage_test.sol
dentro del directorio `examples
$ remix-tests examples/simple_storage_test.sol
NOTA: remix-tests
asumirá que el nombre del archivo de la(s) prueba(s) termina en "_prueba.sol"
. por ejemplo simple_almacenamiento_prueba.sol
.
Ejemplo
Considere para un contrato de almacenamiento simple llamado 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;
}
}
Archivo de prueba simple_storage_test.sol
puede ser como:
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");
}
}
Si ejecuta el archivo simple_storage_test.sol
obtendrá el siguiente resultado:
$ 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
Contexto de compilador personalizado
La mayoría de las opciones de remix-tests
están ahí para definir un contexto de compilador personalizado. Con un contexto de compilador personalizado extendido, la ejecución del archivo de prueba anterior irá como:
$ 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
Remember, custom compiler version will require internet connection to load compiler.
Como solución de IC
remix-tests
también puede utilizarse para pruebas de integración continua (CI).
Para ver un ejemplo de implementación, consulte Su Squares contract y Travis build que utiliza remix-tests
para la integración continua.