Iniziare a Sviluppare Smart Contract in Ethereum con Hardhat. Testing

30 dicembre 2021

Nella lezione precedente abbiamo visto come inizializzare uno Smart Contract di esempio con Hardhat. A questo punto vale la pena introdurre i test. I test sono molto importanti per verificare automaticamente che i nostri Smart Contract si comportino come previsto. Infatti potrebbe costare molto caro accorgersi troppo tardi (dopo averli inseriti su Ethereum) che c'è qualche problema e gli Smart Contract non funzionano come dovrebbero!

È possibile trovare un esempio di test per lo Smart Contract che abbiamo inizializzato con Hardhat all'interno della cartella test.

sample-test.js
const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("Greeter", function () {
  it("Should return the new greeting once it's changed", async function () {
    const Greeter = await ethers.getContractFactory("Greeter");
    const greeter = await Greeter.deploy("Hello, world!");
    await greeter.deployed();

    expect(await greeter.greet()).to.equal("Hello, world!");

    const setGreetingTx = await greeter.setGreeting("Hola, mundo!");

    // wait until the transaction is mined
    await setGreetingTx.wait();

    expect(await greeter.greet()).to.equal("Hola, mundo!");
  });
});

Questo esempio utilizza la libreria Chai per eseguire i test in Javascript, ed ethers per la gestione dello Smart Contract.

describe("Greeter", function () {
  it("Should return the new greeting once it's changed", async function () {
     [...]
  });
});

Questo blocco di codice definisce un test e ne descrive le funzionalità (questo è utilep perchè quando i test vengono eseguiti è possibile vedere esattamente quali funzionalità passano il test e quali invece falliscono).

const Greeter = await ethers.getContractFactory('Greeter');
const greeter = await Greeter.deploy('Hello, world!');
await greeter.deployed();

Queste linee servono ad effettuare il deploy dello Smart Contract, e lo inizializzano con la classica stringa "Hello, world!", che viene quindi assegnata alla variabile di stato greeting. L'ultima linea attende che lo Smart Contract sia stato effettivamente inserito in Blockchain per poter continuare con i test.

expect(await greeter.greet()).to.equal('Hello, world!');

Questa linea richiama il metodo greet() dello Smart Contract e verifica che l'output sia "Hello, world!" come atteso.

const setGreetingTx = await greeter.setGreeting('Hola, mundo!');

// wait until the transaction is mined
await setGreetingTx.wait();

Queste linee creano una transazione per chiamare il metodo setGreeting() dello Smart Contract assegnando la stringa "Hola, mundo!" come nuovo saluto (che quindi verrà assegnato alla variabile di stato greeting). L'ultima linea attende che la transazione sia stata effettivamente inserita in Blockchain.

expect(await greeter.greet()).to.equal('Hola, mundo!');

Quest'ultima linea richiama nuovamente in metodo greet() dello Smart Contract e verifica che l'output ora sia la stringa che abbiamo impostato precedentemente: "Hola, mundo!".

Per eseguire il test e verificare che tutto funzioni correttamente possiamo utilizzare il comando:

npx hardhat test

  Greeter
Deploying a Greeter with greeting: Hello, world!
Changing greeting from 'Hello, world!' to 'Hola, mundo!'
  ✓ Should return the new greeting once it's changed (818ms)

1 passing (821ms)