A seguir, é apresentado um exemplo completo de como escrever e executar testes unitários para um contrato inteligente na Ethereum utilizando o Hardhat. Este exemplo incluirá a criação do contrato inteligente, a configuração dos fixtures e a escrita de diversos testes.
Paso 1: Configuração do Projeto
Devemos ter o Hardhat instalado e um projeto básico criado (caso não saibas como fazer isso, consulte o ).
Certifique-se de ter o plugin hardhat-toolbox instalado.
deployTokenFixture: Esta função implanta o contrato Token com um fornecimento inicial. Também obtém três contas para serem utilizadas nos testes (owner, addr1, addr2).
Primeiro teste: Verificar o proprietário
it("Should set the right owner", async function () {
const { token, owner } = await loadFixture(deployTokenFixture);
expect(await token.balanceOf(owner.address)).to.equal(1000n * 10n ** 18n);
});
Propósito: Verificar se o proprietário inicial (a conta que implanta o contrato) recebe o fornecimento total de tokens.
Proceso:
Implantar o contrato utilizando o fixture.
Obter o saldo do proprietário.
Verificar se o saldo é igual ao fornecimento inicial (1000 tokens convertidos para a unidade mínima).
Segundo teste: Verificar o fornecimento total
it("Should assign the total supply of tokens to the owner", async function () {
const { token, owner } = await loadFixture(deployTokenFixture);
const ownerBalance = await token.balanceOf(owner.address);
expect(await token.totalSupply()).to.equal(ownerBalance);
});
Propósito: Garantir que o fornecimento total de tokens seja atribuído corretamente ao proprietário.
Processo:
Implantar o contrato utilizando o fixture.
Obter o saldo do proprietário.
Verificar se o saldo do proprietário é igual ao fornecimento total de tokens
Propósito: Verificar se os saldos são atualizados corretamente após as transferências.
Proceso:
Implantar o contrato utilizando o fixture.
Transferir 100 tokens do owner para addr1.
Transferir 50 tokens do owner para addr2.
Verificar se o saldo final do owner é igual ao saldo inicial menos 150 tokens.
Verificar se addr1 possui 100 tokens e addr2 possui 50 tokens.
Passo 4: Executar os testes
Para executar os testes, utilize o seguinte comando no terminal:
npx hardhat test
Este comando executará todos os testes definidos no arquivo TokenTest.js e exibirá os resultados no console.
Se os testes forem bem-sucedidos, você verá um resultado semelhante a este:
Parabéns!! Você executou com sucesso seus primeiros testes. Agora é hora de começar a testar outros contratos que você tenha criado.
O Hardhat também permite verificar a cobertura dos seus testes. Para isso, basta executar o seguinte comando:
npx hardhat coverage
E você obterá um relatório semelhante a este
Mais uma coisa: Chai
Neste exemplo, utilizamos Chai para realizar nossos testes. Chai é uma biblioteca de assertions (afirmações) para Node.js que pode ser combinada com qualquer framework de testes, como o Hardhat. No contexto de testes para contratos inteligentes, o Chai é amplamente utilizado devido à sua sintaxe amigável e capacidades robustas de asserção.
Para utilizar o Chai, primeiro é necessário importar a biblioteca e, em seguida, usar seus métodos nas suas asserções dentro dos testes. Aqui está um exemplo básico de configuração:
const { expect } = require("chai");
Chai oferece três estilos principais de asserção:
Assert: Estilo clássico baseado em funções.
Expect: Estilo BDD (Behavior-Driven Development), mais legível.
Should: Outro estilo BDD, que adiciona propriedades ao Object.prototype.
No nosso exemplo, utilizamos o estiloexpect, pois é um dos mais usados em testes de contratos inteligentes com Hardhat, graças à sua clareza e sintaxe intuitiva.
Principais comandos do Chai
Igualdade (equal, eql)
equal verifica igualdade estrita (===).
eql verifica igualdade profunda (ideal para objetos e arrays).