Plugin de pruebas unitarias
Haga clic en el icono (doble check) de la barra de iconos para pasar al plugin Solidity Unit Testing
.
If you haven’t used this plugin before and are not seeing the double check
icon, you have to activate it from Remix plugin manager.
Vaya al gestor de plugins haciendo clic en el icono (plug) y active el plugin Solidity Unit Testing
.
Now the double check
icon will appear on the left side icon bar. Clicking on the icon will load the plugin in the side panel.
Alternatively, select Solidity
environment from Remix IDE Home
tab. This will activate Solidity Unit Testing
plugin along with Solidity Compiler
, Deploy & Run Transactions
& Solidity Static Analysis
plugins.
Después de cargarlo correctamente, el plugin tiene este aspecto:
Directorio de prueba
Plugin asks you to provide a directory which will be your unit testing workspace (not to be confused with a Workspace in the File Explorer). To select directory, as soon as you add /
to the path, it shows the possible options. [Rob Edit]
Una vez seleccionado, este directorio se utilizará para cargar los archivos de prueba y para almacenar los archivos de prueba recién generados.
El directorio de pruebas por defecto es browser/tests
.
Genere
Select the Solidity file which you want to test and click on the Generate
button. In the test
directory, a test file will be created for your selected file.
If no file is selected, a generic test file named, newFile_test.sol
will be created.
This file contains information about developing tests for a contract.
Below is an example of a generic test file:
pragma solidity >=0.4.22 <0.8.0;
import "remix_tests.sol"; // this import is automatically injected by Remix.
import "remix_accounts.sol";
// Import here the file to test.
// File name has to end with '_test.sol', this file can contain more than one testSuite contracts
contract testSuite {
/// 'beforeAll' runs before all other tests
/// More special functions are: 'beforeEach', 'beforeAll', 'afterEach' & 'afterAll'
function beforeAll() public {
// Here should instantiate tested contract
Assert.equal(uint(1), uint(1), "1 should be equal to 1");
}
function checkSuccess() public {
// Use 'Assert' to test the contract,
// See documentation: https://remix-ide.readthedocs.io/en/latest/assert_library.html
Assert.equal(uint(2), uint(2), "2 should be equal to 2");
Assert.notEqual(uint(2), uint(3), "2 should not be equal to 3");
}
function checkSuccess2() public pure returns (bool) {
// Use the return value (true or false) to test the contract
return true;
}
function checkFailure() public {
Assert.equal(uint(1), uint(2), "1 is not equal to 2");
}
/// Custom Transaction Context
/// See more: https://remix-ide.readthedocs.io/en/latest/unittesting.html#customization
/// #sender: account-1
/// #value: 100
function checkSenderAndValue() public payable {
// account index varies 0-9, value is in wei
Assert.equal(msg.sender, TestsAccounts.getAccount(1), "Invalid sender");
Assert.equal(msg.value, 100, "Invalid value");
}
}
Pruebas de escritura
Escriba suficientes pruebas unitarias para asegurarse de que su contrato funciona como se espera en diferentes escenarios.
Remix injects a built-in assert
library for testing. You can visit the library documentation here.
Additionally, Remix allows the usage of special functions in the test file to make testing more structural. They are:
beforeEach()
- Se ejecuta antes de cada pruebabeforeAll()
- Se ejecuta antes de todas las pruebasafterEach()
- Se ejecuta después de cada pruebaafterAll()
- Se ejecuta después de todas las pruebas
Para empezar, consulte este sencillo ejemplo.
Ejecute
Once you are done with writing tests, select the file(s) and click on Run
to execute the tests. The execution will run in a separate environment. After completing the execution of one file, a test summary will be shown:
En el caso de las pruebas fallidas, habrá más detalles de las afirmaciones para analizar el problema. Al hacer clic en la prueba fallida se resaltará la línea de código correspondiente en el editor.
Stop
Si ha seleccionado varios archivos para ejecutar las pruebas y desea detener la ejecución, pulse el botón Stop
. Detendrá la ejecución después de ejecutar las pruebas para el archivo actual.
Personalización
Remix facilita a los usuarios varios tipos de personalizaciones para probar un contrato correctamente.
1. Contexto de compilador personalizado
Solidity Unit Testing
hace referencia al plugin Solidity Compiler
para las configuraciones del compilador. Configure Compiler
, EVM Version
, Enable Optimization
& runs
en el plugin Solidity Compiler
y esto se utilizará en el plugin Solidity Unit Testing
para la compilación de contratos antes de ejecutar las pruebas unitarias.
2. Contexto de transacción personalizado
Para interactuar con el método de un contrato, los parámetros principales de una transacción son la dirección from
, value
y gas
. Normalmente, el comportamiento de un método se prueba con diferentes valores de estos parámetros.
Se pueden introducir valores personalizados para msg.sender
& msg.value
de transacción utilizando comentarios NatSpec, como:
/// #sender: account-0
/// #value: 10
function checkSenderIs0AndValueis10 () public payable {
Assert.equal(msg.sender, TestsAccounts.getAccount(0), "wrong sender in checkSenderIs0AndValueis10");
Assert.equal(msg.value, 10, "wrong value in checkSenderIs0AndValueis10");
}
Instrucciones de uso:
Los parámetros deben definirse en el NatSpec del método
Cada clave de parámetro debe ir precedida de una almohadilla (#) y terminar con dos puntos después de un espacio (: ) como
#sender:
&#value:
Por ahora, la personalización sólo está disponible para los parámetros
sender
&value
.El remitente es la dirección
from
de una transacción a la que se accede utilizandomsg.sender
dentro de un método de contrato. Debe definirse en un formato fijo como `cuenta-<account_index>”<account_index>
varía de0-2
antes del lanzamiento de remix-ide v0.10.0 y0-9
despuésremix_accounts.sol
debe ser importado en su archivo de prueba para utilizarsender
personalizadoEl valor es el
valor
enviado junto con una transacción enwei
al que se accede utilizandomsg.value
dentro de un método de contrato. Debe ser un número.
En cuanto al gas
, Remix estima internamente el gas necesario para cada transacción. Aún así, si el despliegue de un contrato falla con el error Out-of-Gas
, intenta volver a desplegarlo duplicando el gas. El despliegue que falle con el doble de gas mostrará el error: el despliegue del contrato ha fallado tras intentarlo dos veces: El código del contrato no ha podido ser almacenado, por favor compruebe su límite de gas
.
Various test examples can be seen in examples section.
Puntos a recordar
Un contrato de prueba no puede tener un método con parámetros. Tener un método de este tipo mostrará el error:
Method 'methodname' can not have parameters inside a test contract
.El número de cuentas de prueba es
3
antes del lanzamiento de remix-ide v0.10.0 y10
despuésAunque es posible que un archivo de prueba que importe
remix_accounts.sol
no compile correctamente con el pluginSolidity Compiler
, no se preocupe, esto no influirá en su éxito con el pluginSolidity Unit Testing
.