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 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

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:

  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.