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 prueba

  • beforeAll() - Se ejecuta antes de todas las pruebas

  • afterEach() - Se ejecuta después de cada prueba

  • afterAll() - 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:

  1. Los parámetros deben definirse en el NatSpec del método

  2. Cada clave de parámetro debe ir precedida de una almohadilla (#) y terminar con dos puntos después de un espacio () como #sender: & #value:

  3. Por ahora, la personalización sólo está disponible para los parámetros sender & value.

  4. El remitente es la dirección from de una transacción a la que se accede utilizando msg.sender dentro de un método de contrato. Debe definirse en un formato fijo como `cuenta-<account_index>”

  5. <account_index> varía de 0-2 antes del lanzamiento de remix-ide v0.10.0 y 0-9 después

  6. remix_accounts.sol debe ser importado en su archivo de prueba para utilizar sender personalizado

  7. El valor es el valor enviado junto con una transacción en wei al que se accede utilizando msg.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 y 10 después

  • Aunque es posible que un archivo de prueba que importe remix_accounts.sol no compile correctamente con el plugin Solidity Compiler, no se preocupe, esto no influirá en su éxito con el plugin Solidity Unit Testing.