Tests schreiben
Mocha und Chai
Tests schreiben ist eine kostenlose Web3 & DApp Development Fundamentals-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Web3 & DApp Development Fundamentals-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Web3 & DApp Development Fundamentals-Kurs umfasst insgesamt 4 Lektionen.
Teile dieser Lektion wurden noch nicht übersetzt und werden auf Englisch angezeigt.
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.
Häufig gestellte Fragen
Ist die Lektion „Tests schreiben“ kostenlos?
Ja — der vollständige Text von „Tests schreiben“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Web3 & DApp Development Fundamentals-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Web3 & DApp Development Fundamentals-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Tests schreiben“?
Mocha und Chai Du übst Web3 & DApp Development Fundamentals mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Web3 & DApp Development Fundamentals zu starten?
Keine Vorkenntnisse erforderlich. Web3 & DApp Development Fundamentals auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Tests schreiben“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Web3 & DApp Development Fundamentals-Lektion Code schreiben und ausführen?
Ja. Jede Web3 & DApp Development Fundamentals-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Tests schreiben
- Reverts und Events testen
- Coverage- und Gas-Reports
- Fixtures