Plugin Unit Testing

Clicca l” (ricontrolla) icona dalla barra delle icone per spostarti al plugin Solidity Unit Testing.

Se non hai mai usato questo plugin e non vedi l’icona della doppia spunta, devi attivarlo dal gestore dei plugin di Remix.

Vai al plugin manager cliccando sull’icona (plug) e attiva il plugin Solidity Unit Testing.

A questo punto, nella barra delle icone di sinistra apparirà l’icona della doppia spunta. Facendo clic sull’icona si caricherà il plugin nel pannello laterale.

In alternativa, basta selezionare l’ambiente Solidity dalla Pagina Iniziale di remix IDE. Questo attiverà il plugin Solidity Unit Testing insieme ai plugin Compilatore di Solidity, Distribuisci & Esegui Transazioni e Analisi Statica di Solidity.

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

Cartella dei test

Il plugin ti chiede di fornire una cartella che sarà l’area di lavoro solo per questo plugin. Per selezionare la cartella, non appena si aggiunge / al percorso, vengono mostrate le possibili opzioni.

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

Selezionare un file di solidity che si desidera testare e fare clic sul pulsante Genera. Genererà un file di test dedicato al file selezionato nella directory dei test.

Se nessun file è selezionato, verrà comunque creato un file con nome generico come newFile_test.sol.

Questo file contiene informazioni sufficienti per comprendere meglio lo sviluppo di test per un contratto.

Il file generico sembra come:

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 inietta una libreria assert integrata che può essere usata per i test. Puoi visitare la documentazione della libreria here.

Oltre a questo, Remix permette di utilizzare alcune funzioni speciali per rendere i test più strutturali. Esse sono:

  • 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

Una volta terminata la scrittura dei test, selezionare i file e fare clic su Esegui per eseguirli. L’esecuzione avverrà in un ambiente separato. Dopo aver completato l’esecuzione di un file, verrà mostrato un riepilogo dei test come di seguito riportato:

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.