SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
04.12.2024

Aula 222: Escrevendo Testes com Hardhat

No mundo dos contratos inteligentes Ethereum, garantir que seu código esteja livre de erros e se comporte como esperado é crucial. Os testes são uma parte integral do processo de desenvolvimento, e o Hardhat fornece um framework robusto para facilitar a escrita, execução e gerenciamento desses testes. Nesta aula, abordaremos como escrever testes para seus contratos Solidity usando Hardhat.

Configurando Seu Projeto Hardhat

Antes de começarmos a escrever os testes, vamos garantir que você tenha um projeto Hardhat configurado. Se você ainda não fez isso, siga estes passos:

  1. Crie um Novo Diretório:

    mkdir hardhat-testing
    cd hardhat-testing
  2. Inicialize um Novo Projeto Hardhat:

    npx hardhat

    Siga as instruções para criar um projeto de exemplo.

  3. Instale Dependências: Certifique-se de que você tem as bibliotecas necessárias instaladas:

    npm install --save-dev hardhat @nomiclabs/hardhat-ethers ethers

Criando um Contrato Inteligente de Exemplo

Vamos criar um contrato inteligente simples para testar. Crie um novo arquivo chamado SimpleStorage.sol no diretório contracts:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleStorage {
    uint256 private value;

    function setValue(uint256 newValue) public {
        value = newValue;
    }

    function getValue() public view returns (uint256) {
        return value;
    }
}

Este contrato possui uma única variável de estado value e duas funções: setValue para atualizar o valor e getValue para recuperá-lo.

Escrevendo Testes

Vamos escrever alguns testes para o contrato SimpleStorage. Crie um novo arquivo chamado test/SimpleStorage.test.js:

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("SimpleStorage", function () {
    let SimpleStorage;
    let simpleStorage;

    beforeEach(async function () {
        SimpleStorage = await ethers.getContractFactory("SimpleStorage");
        simpleStorage = await SimpleStorage.deploy();
        await simpleStorage.deployed();
    });

    it("deve armazenar o valor", async function () {
        await simpleStorage.setValue(42);
        expect(await simpleStorage.getValue()).to.equal(42);
    });

    it("deve atualizar o valor", async function () {
        await simpleStorage.setValue(100);
        expect(await simpleStorage.getValue()).to.equal(100);

        await simpleStorage.setValue(200);
        expect(await simpleStorage.getValue()).to.equal(200);
    });

    it("deve inicialmente ter um valor de 0", async function () {
        expect(await simpleStorage.getValue()).to.equal(0);
    });
});

Explicação do Código do Teste

  1. Dependências: Importamos chai para asserções e hardhat-ethers para interagir com a blockchain Ethereum.
  2. Bloco Describe: Definimos um conjunto de testes para o contrato SimpleStorage.
  3. Hook Before Each: Implantamos uma nova instância do contrato antes de cada teste, garantindo que cada teste seja isolado e comece com um estado limpo.
  4. Testes: Escrevemos vários testes:
    • O primeiro teste verifica se a função setValue define corretamente um valor e se getValue retorna o mesmo valor.
    • O segundo teste verifica se conseguimos atualizar o valor e recuperá-lo corretamente em seguida.
    • O último teste confirma que antes de qualquer valor ser definido, getValue retorna o valor padrão (0).

Executando os Testes

Para executar os testes, execute o seguinte comando no seu terminal:

npx hardhat test

Você deve ver uma saída indicando se os seus testes passaram ou falharam.

Conclusão

Nesta aula, aprendemos como configurar um projeto Hardhat, criar um contrato inteligente simples e escrever testes para ele usando JavaScript e o framework Mocha. Ter uma suíte de testes abrangente permite que você desenvolva e implante seus contratos inteligentes com confiança, reduzindo o risco de bugs e comportamentos inesperados. Testar é uma ferramenta poderosa que todo desenvolvedor deve abraçar!

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!