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.