Plugin de pruebas unitarias
Haga clic en el icono (doble check) de la barra de iconos para pasar al plugin Solidity Unit Testing
.
Si no ha utilizado este plugin antes y no ve el icono de doble check
, tiene que activarlo desde el gestor de plugins de Remix.
Vaya al gestor de plugins haciendo clic en el icono (plug) y active el plugin Solidity Unit Testing
.
Ahora aparecerá el icono doble check
en la barra de iconos del lado izquierdo. Al hacer clic en el icono se cargará el plugin en el panel lateral.
Alternativamente, sólo tiene que seleccionar el entorno Solidity
en la pestaña Home
de Remix IDE. Esto activará el plugin Solidity Unit Testing
junto con los plugins Solidity Compiler
, Deploy & Run Transactions
& Solidity Static Analysis
.
Después de cargarlo correctamente, el plugin tiene este aspecto:
Directorio de prueba
El plugin le pide que proporcione un directorio que será su espacio de trabajo sólo para este plugin. Para seleccionar el directorio, en cuanto añada /
a la ruta, le mostrará las opciones posibles.
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
Seleccione el archivo solidity que desea probar y pulse el botón Generar
. Se generará un archivo de prueba dedicado al archivo seleccionado en el directorio de prueba.
Si no se selecciona ningún archivo, se creará igualmente un archivo con nombre genérico como nuevoArchivo_prueba.sol
.
Este archivo contiene información suficiente para comprender mejor la elaboración de pruebas para un contrato.
El archivo genérico tiene el siguiente aspecto:
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 inyecta una biblioteca assert
incorporada que puede utilizarse para realizar pruebas. Puede visitar la documentación de la biblioteca here.
Aparte de esto, Remix permite el uso de algunas funciones especiales en el archivo de prueba para hacer las pruebas más estructurales. Son las siguientes:
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
Una vez que haya terminado de escribir las pruebas, seleccione el/los archivo(s) y haga clic en Ejecutar
para ejecutar las pruebas. La ejecución se llevará a cabo en un entorno independiente. Tras completar la ejecución de un archivo, se mostrará un resumen de la prueba como el que se muestra a continuación:
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
.