Plugin Unit Testing

Clicca l” (ricontrolla) icona dalla barra delle icone per spostarti 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.

Vai al plugin manager cliccando sull’icona (plug) e attiva il 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.

Dopo averlo caricato con successo, il plugin ha questo aspetto:

Cartella dei test

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 volta selezionata, questa cartella verrà utilizzata per caricare i file di test e per archiviare i file di test appena generati.

La directory di test predefinita è browser/tests.

Genera

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");
    }
}

Scrivi dei Test

Scrivi un numero sufficiente di test unitari per garantire che il contratto funzioni come previsto in diversi scenari.

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() - Eseguita prima di ogni test

  • beforeAll() - Eseguita prima di tutti i test

  • afterEach() - Eseguita dopo ogni test

  • afterAll() - Eseguita dopo tutti i test

Per iniziare, vedere questo semplice esempio.

Esegui

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:

Per i test falliti, ci saranno più dettagli sull’asserzione per analizzare il problema. Facendo clic su un test fallito, si evidenzierà la relativa riga di codice nell’editor.

Interrompi

Se hai selezionato più file per eseguire i test e vuoi interrompere l’esecuzione, fai clic sul pulsante Interrompi. L’esecuzione verrà interrotta dopo aver eseguito i test per il file attuale.

Personalizzazione

Remix agevola gli utenti con vari tipi di personalizzazioni per testare correttamente un contratto.

1. Contesto del Compilatore Personalizzato

Solidity Unit Testing si riferisce al plugin Compilatori di Solidity per le configurazioni del compilatore. Configurare Compilatore, Versione EMV, Abilita ottimizzazione & Esegui nel plugin Compilatore di Solidity e questo sarà usato nel plugin Solidity Unit Testing per la compilazione del contratto prima di eseguire i test unitari.

2. Contesto della Transazione Personalizzata

Per interagire con il metodo di un contratto, i parametri principali di una transazione sono l’indirizzo da cui proviene, il valore e il carburante. In genere, il comportamento di un metodo viene testato con diversi valori di questi parametri.

È possibile inserire valori personalizzati per msg.sender e msg.value della transazione utilizzando i commenti NatSpec, come ad esempio:

/// #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");
}

Istruzioni da usare:

  1. I parametri devono essere definiti nella NatSpec del metodo

  2. Ogni chiave di parametro deve essere preceduta da un cancelletto (#) e terminare con i due punti seguiti da un spazio (), come #mittente: e #valore:

  3. Per il momento, la personalizzazione è disponibile solo per i parametri mittente e valore

  4. Il mittente è l’indirizzo da cui arriva una transazione e vi si accede utilizzando msg.sender all’interno di un metodo di contratto. Deve essere definito in un formato prestabilito come “account-<account_index>”

  5. `<account_index> varia da 0-2 prima della release di remix-ide v0.10.0 e da 0-9 in avanti

  6. `remix_accounts.sol deve essere importato nel file di prova per utilizzare il «mittente» personalizzato

  7. Il valore è il valore inviato con una transazione in wei, a cui si accede usando msg.value all’interno di un metodo di contratto. Dovrebbe essere un numero.

Per quanto riguarda il carburante, Remix stima internamente il carburante necessario per ogni transazione. Tuttavia, se la distribuzione di un contratto fallisce con un errore di carburante esaurito, tenta di distribuirlo nuovamente raddoppiando il carburante. Se la distribuzione fallisce con il doppio del carburante, viene visualizzato l’errore: distribuzione del contratto fallita dopo aver provato due volte: Il codice del contratto non ha potuto essere archiviato, si prega di controllare il limite di carburante

Various test examples can be seen in examples section.

Punti da ricordare

  • Un contratto di test non può avere un metodo con parametri. Se si ha un metodo di questo tipo, viene mostrato l’errore: Il metodo 'methodname' non può avere parametri all'interno di un contratto di test

  • Il numero di account di prova è di 3 prima del rilascio di remix-ide v0.10.0 e di 10 dopo

  • Anche se un file di prova che importa remix_accounts.sol non dovesse compilare con successo con il plugin Compilatore di Solidity, non preoccuparti, questo non avrà alcun impatto sul suo successo con il plugin Solidity Unit Testing.