Lição: 093: Testando Contratos Inteligentes
Testar é uma parte crucial do desenvolvimento de contratos inteligentes. Como os contratos inteligentes são imutáveis uma vez implantados, garantir que eles funcione como o esperado é vital para evitar vulnerabilidades e garantir a correção das transações. Nesta aula, vamos abordar o básico sobre como configurar um ambiente de testes para seus contratos inteligentes em Solidity usando o framework Truffle e o framework de testes Mocha.
Configurando Seu Ambiente
Antes de começarmos a programar, certifique-se de que você tem o Node.js e o npm instalados. Você pode verificar isso executando:
node -v
npm -v
Uma vez que você tenha esses pré-requisitos, pode configurar seu projeto:
mkdir meu_contrato_inteligente
cd meu_contrato_inteligente
npm init -y
npm install truffle
Após instalar o Truffle, você pode criar um novo projeto Truffle:
truffle init
Esse comando criará uma estrutura para o seu projeto, incluindo pastas para contratos, migrações e testes.
Escrevendo um Contrato Inteligente
Vamos escrever um contrato inteligente simples em Solidity. Crie um arquivo chamado ArmazenamentoSimples.sol
na pasta contracts
:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract ArmazenamentoSimples {
uint256 private dadosArmazenados;
function set(uint256 x) public {
dadosArmazenados = x;
}
function get() public view returns (uint256) {
return dadosArmazenados;
}
}
Este contrato permite que você armazene e recupere um único inteiro não assinado.
Escrevendo Testes
Agora que temos um contrato, vamos criar testes para ele. Crie um novo arquivo chamado ArmazenamentoSimples.test.js
na pasta test
:
const ArmazenamentoSimples = artifacts.require("ArmazenamentoSimples");
contract("ArmazenamentoSimples", (accounts) => {
let armazenamentoSimples;
beforeEach(async () => {
armazenamentoSimples = await ArmazenamentoSimples.new();
});
it("deve armazenar o valor 89", async () => {
await armazenamentoSimples.set(89);
const dadosArmazenados = await armazenamentoSimples.get();
assert.equal(dadosArmazenados.toString(), '89', "O valor 89 não foi armazenado.");
});
it("deve armazenar o valor 42", async () => {
await armazenamentoSimples.set(42);
const dadosArmazenados = await armazenamentoSimples.get();
assert.equal(dadosArmazenados.toString(), '42', "O valor 42 não foi armazenado.");
});
});
Análise dos Testes
-
Importar Contrato: Importamos nosso contrato
ArmazenamentoSimples
usandoartifacts.require("ArmazenamentoSimples")
. -
Configuração: A função
beforeEach
é chamada antes de cada teste. Aqui, implantamos uma nova instância deArmazenamentoSimples
para garantir que os testes não interfiram uns nos outros. -
Testes:
- O primeiro teste verifica que, ao definirmos o valor para
89
, ele recupera o mesmo valor corretamente. - O segundo teste realiza uma verificação similar para o valor
42
.
- O primeiro teste verifica que, ao definirmos o valor para
Executando Seus Testes
Para executar seus testes, execute o seguinte comando no diretório do seu projeto:
truffle test
Você deverá ver uma saída indicando que os testes passaram. Se houver algum problema, o Truffle fornecerá mensagens de erro que podem ajudá-lo a solucionar seu contrato ou testes.
Conclusão
Nesta aula, cobrimos o básico sobre testar contratos inteligentes usando Truffle e Mocha. Testar é essencial no desenvolvimento de contratos inteligentes para garantir que seu código funcione como esperado e para evitar erros custosos. Você pode expandir esses testes verificando casos extremos, lidando com exceções e testando interações entre múltiplos contratos. À medida que você se familiariza mais com Solidity e o desenvolvimento de contratos inteligentes, testes rigorosos se tornarão um hábito que valerá a pena a longo prazo. Boa codificação!