Menulis Pengujian
Mocha dan Chai
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.
describegroups related tests.itdefines a single test case.expectmakes 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 testHardhat 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 testAsync 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 withnpx hardhat test. - Always
awaitasync contract calls. getSigners+connectsimulate different users.- On-chain numbers are BigInt; use
parseEther/formatEtherandbeforeEachfor clean setup.
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
- Menulis Pengujian
- Menguji Revert dan Event
- Laporan Coverage dan Gas
- Fixture