Web3 & DApp Development Fundamentals · Pelajaran

Menulis Pengujian

Mocha dan Chai

Pelajaran 1 dari 413 langkah

Menulis Pengujian adalah pelajaran Web3 & DApp Development Fundamentals gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Web3 & DApp Development Fundamentals, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Web3 & DApp Development Fundamentals mencakup 4 pelajaran total.

Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.

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.
Gratis untuk memulai

Belajar Web3 & DApp Development Fundamentals dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
29
Pelajaran
105

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menulis Pengujian” gratis?

Ya — teks lengkap “Menulis Pengujian” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Web3 & DApp Development Fundamentals, upgrade ke CoddyKit PRO. Kursus Web3 & DApp Development Fundamentals mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Menulis Pengujian”?

Mocha dan Chai Kamu berlatih Web3 & DApp Development Fundamentals dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Web3 & DApp Development Fundamentals?

Tidak diperlukan pengalaman sebelumnya. Web3 & DApp Development Fundamentals di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Menulis Pengujian” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Web3 & DApp Development Fundamentals ini?

Ya. Setiap pelajaran Web3 & DApp Development Fundamentals menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menulis Pengujian
  2. Menguji Revert dan Event
  3. Laporan Coverage dan Gas
  4. Fixture
← Kembali ke Web3 & DApp Development Fundamentals