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:
-
Crie um Novo Diretório:
mkdir hardhat-testing cd hardhat-testing
-
Inicialize um Novo Projeto Hardhat:
npx hardhat
Siga as instruções para criar um projeto de exemplo.
-
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
- Dependências: Importamos
chai
para asserções ehardhat-ethers
para interagir com a blockchain Ethereum. - Bloco Describe: Definimos um conjunto de testes para o contrato
SimpleStorage
. - 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.
- Testes: Escrevemos vários testes:
- O primeiro teste verifica se a função
setValue
define corretamente um valor e segetValue
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).
- O primeiro teste verifica se a função
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!