0Pricing
Web3 & DApp Development Fundamentals · Lezione

Scrittura dei test

Mocha e Chai

Scrittura dei test è una lezione Web3 & DApp Development Fundamentals gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Web3 & DApp Development Fundamentals, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Web3 & DApp Development Fundamentals include 4 lezioni in totale.

Parti di questa lezione non sono ancora state tradotte e vengono mostrate in inglese.

Why Test Contracts

Smart contracts are immutable once deployed and often hold real value. A single bug can be unrecoverable, so thorough testing is essential.

  • Catch logic errors before deployment.
  • Document expected behavior.
  • Guard against regressions when refactoring.

Mocha and Chai

Hardhat uses Mocha as the test runner and Chai for assertions, both included in the Toolbox.

  • describe groups related tests.
  • it defines a single test case.
  • expect makes assertions about values.

Tests live in the test/ folder.

A First Test File

A basic test imports ethers and Chai, then deploys and checks the contract:

const { expect } = require("chai"); const { ethers } = require("hardhat"); describe("Greeter", function () { it("returns the initial greeting", async function () { const Greeter = await ethers.getContractFactory("Greeter"); const greeter = await Greeter.deploy(); expect(await greeter.greeting()).to.equal("Hello, Hardhat"); }); });
const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("Greeter", function () {
  it("returns the initial greeting", async function () {
    const Greeter = await ethers.getContractFactory("Greeter");
    const greeter = await Greeter.deploy();
    expect(await greeter.greeting()).to.equal("Hello, Hardhat");
  });
});

Running Tests

Run the whole suite with:

npx hardhat test

Hardhat compiles contracts first, spins up a fresh in-process network, and reports passing and failing tests. You can pass a path to run just one file.

npx hardhat test

Async and await

Almost every contract interaction is asynchronous because it talks to the network. Always await deployments and calls:

it("works", async function () { const c = await Factory.deploy(); await c.waitForDeployment(); const value = await c.getValue(); expect(value).to.equal(0); });

Forgetting await is the most common cause of confusing test results.

it("works", async function () {
  const c = await Factory.deploy();
  await c.waitForDeployment();
  const value = await c.getValue();
  expect(value).to.equal(0);
});

Common Chai Matchers

Chai gives expressive matchers for assertions:

  • .to.equal(x) — strict equality.
  • .to.be.true / .to.be.false — booleans.
  • .to.be.gt(n) — greater than.
  • .to.deep.equal([...]) — array/object equality.
expect(await token.balanceOf(user)).to.equal(100);
expect(await token.balanceOf(user)).to.equal(100);

Working with Signers

getSigners returns test accounts you can use as different users:

const [owner, alice, bob] = await ethers.getSigners(); await token.connect(alice).transfer(bob.address, 50);

connect(signer) sends the next call as that account, which is key for testing access control.

const [owner, alice, bob] = await ethers.getSigners();
await token.connect(alice).transfer(bob.address, 50);

BigInt Values

Numbers on-chain are large integers. In ethers v6 they are JavaScript BigInt values. Compare them carefully:

const supply = await token.totalSupply(); expect(supply).to.equal(ethers.parseEther("1000"));

Use parseEther and formatEther to convert between human and on-chain units.

const supply = await token.totalSupply();
expect(supply).to.equal(ethers.parseEther("1000"));

Setup with beforeEach

Use beforeEach to deploy a fresh contract for every test, ensuring isolation:

let token; beforeEach(async function () { const Token = await ethers.getContractFactory("Token"); token = await Token.deploy(); });

Each it then starts from a clean, identical state.

let token;
beforeEach(async function () {
  const Token = await ethers.getContractFactory("Token");
  token = await Token.deploy();
});

Reading Test Output

A green checkmark means the test passed; a red cross with a diff shows what failed. Mocha prints the describe and it labels, so write descriptive names:

  • Good: it("reverts when caller is not owner")
  • Vague: it("test1")

Running a Single Test

While developing you often want to focus on one test. Use Mocha's .only:

it.only("reverts when not owner", async function () { // only this test runs });

You can also run a single file with npx hardhat test test/Token.js. Remember to remove .only before committing.

it.only("reverts when not owner", async function () {
  // only this test runs
});

Quick Check

Test your understanding of writing contract tests.

Recap

You learned to write contract tests.

  • Hardhat uses Mocha (describe/it) and Chai (expect).
  • Tests live in test/ and run with npx hardhat test.
  • Always await async contract calls.
  • getSigners + connect simulate different users.
  • On-chain numbers are BigInt; use parseEther/formatEther and beforeEach for clean setup.

Domande Frequenti

La lezione «Scrittura dei test» è gratuita?

Sì — il testo completo di «Scrittura dei test» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Web3 & DApp Development Fundamentals, passa a CoddyKit PRO. Il corso Web3 & DApp Development Fundamentals include 4 lezioni in totale.

Cosa imparerò in «Scrittura dei test»?

Mocha e Chai Eserciti Web3 & DApp Development Fundamentals con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Web3 & DApp Development Fundamentals?

Non è richiesta alcuna esperienza precedente. Web3 & DApp Development Fundamentals su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Scrittura dei test»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Web3 & DApp Development Fundamentals?

Sì. Ogni lezione Web3 & DApp Development Fundamentals include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Scrittura dei test
  2. Test di revert ed eventi
  3. Coverage e report del gas
  4. Fixture
← Torna a Web3 & DApp Development Fundamentals