Grunderna i Web3- och DApp-utveckling · Lektion

Testning med forge

Solidity-tester

Lektion 2 av 413 steg

Testning med forge är en gratis lektion i Grunderna i Web3- och DApp-utveckling på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Grunderna i Web3- och DApp-utveckling, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Grunderna i Web3- och DApp-utveckling innehåller totalt 4 lektioner.

Tester är kontrakt

I Foundry är en testfil ett Solidity-kontrakt som ärver från Test i biblioteket forge-std. Varje publik funktion vars namn börjar med test körs som ett separat testfall.

Testfiler finns i test/ och använder enligt konvention suffixet .t.sol.

import {Test} from "forge-std/Test.sol";

contract CounterTest is Test {
    function testInitialZero() public {
        // ...
    }
}

Funktionen setUp

Den särskilda funktionen setUp() körs före varje test och ger varje test ett nytt, isolerat tillstånd. Driftsätt era kontrakt och skapa eventuella testdata här.

Eftersom tillståndet återställs mellan tester kan ett test aldrig råka vara beroende av ett annat.

Counter counter;

function setUp() public {
    counter = new Counter();
}

Assertioner

forge-std tillhandahåller assertions-hjälpfunktioner som avbryter testet med ett tydligt meddelande när villkoren inte är uppfyllda:

  • assertEq(a, b) — likhet
  • assertTrue(cond) / assertFalse(cond)
  • assertGt, assertLt, assertGe, assertLe
function testIncrement() public {
    counter.increment();
    assertEq(counter.number(), 1);
}

Köra tester

Kör hela testsviten med forge test. Filtrera efter namn med --match-test eller efter kontrakt med --match-contract. Öka detaljnivån med -v-flaggor för att visa loggar och traces.

$ forge test
$ forge test --match-test testIncrement -vvv

Förvänta sig reverts

Använd vm.expectRevert omedelbart före ett anrop som ska misslyckas. Testet godkänns endast om nästa anrop orsakar en revert, och kan valfritt matcha ett specifikt felmeddelande eller ett anpassat fel.

function testOnlyOwner() public {
    vm.prank(address(0xBEEF));
    vm.expectRevert("not owner");
    counter.adminReset();
}

Efterlikna konton

vm.prank(addr) anger msg.sender för det allra nästa anropet. vm.startPrank(addr) gäller för alla anrop tills vm.stopPrank() körs. På så sätt kan Ni testa åtkomstkontroll utan att distribuera från många nycklar.

vm.startPrank(alice);
token.approve(spender, 100);
token.transfer(bob, 50);
vm.stopPrank();

Manipulera saldon och tid

Cheatcodes låter Er styra miljön:

  • vm.deal(addr, amount) — anger ett kontos ETH-saldo
  • vm.warp(timestamp) — anger block.timestamp
  • vm.roll(blockNum) — anger block.number

Detta gör det enkelt att testa tids- och saldoberoende logik på ett deterministiskt sätt.

vm.deal(alice, 10 ether);
vm.warp(block.timestamp + 7 days);
vm.roll(block.number + 100);

Testa händelser

vm.expectEmit anger vilka händelsefält som ska kontrolleras, följt av den förväntade händelsen och därefter anropet som ska utlösa den. Booleska värden anger vilka topics och data som ska matchas.

vm.expectEmit(true, true, false, true);
emit Transfer(alice, bob, 100);
token.transfer(bob, 100);

Etiketter och loggar

vm.label(addr, name) ger adresser läsbara namn i traces. console.log från forge-std skriver ut felsökningsinformation under tester när de körs med tillräcklig detaljnivå.

import {console} from "forge-std/console.sol";

vm.label(alice, "Alice");
console.log("balance:", token.balanceOf(alice));

Testa på en fork

Foundry kan skapa en fork av ett aktivt nätverk så att testerna körs mot verkliga distribuerade kontrakt och deras tillstånd. Ange en RPC-URL och använd vm.createSelectFork för att låsa testet till ett block.

Detta är ovärderligt när integrationer med protokoll som Uniswap eller Aave ska testas utan att distribuera dem på nytt.

function setUp() public {
    vm.createSelectFork(vm.rpcUrl("mainnet"), 19000000);
}

Testorganisation

God praxis för forge-tester:

  • Ett beteende per testfunktion
  • Beskrivande namn som testRevertWhenNotOwner
  • Gemensam initiering i setUp()
  • Använd prank för åtkomstkontroll och warp för tidslogik
  • Lägg till fork-tester för externa integrationer

Snabbkontroll

Vad är syftet med funktionen setUp() i ett Foundry-testkontrakt?

Sammanfattning

Ni har lärt Er att testa med forge:

  • Tester är Solidity-kontrakt som ärver Test; funktioner börjar med test
  • setUp() ger ett nytt tillstånd för varje test
  • Assertions: assertEq, assertTrue med flera
  • Cheatcodes: prank, deal, warp, expectRevert, expectEmit
  • Fork-tester körs mot tillståndet i ett aktivt nätverk

Nästa del: fuzzning och invarianttestning.

Gratis att börja

Lär dig Grunderna i Web3- och DApp-utveckling med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
29
Lektioner
105

Vanliga frågor

Är lektionen ”Testning med forge” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Grunderna i Web3- och DApp-utveckling, inklusive ”Testning med forge”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Grunderna i Web3- och DApp-utveckling innehåller totalt 4 lektioner.

Vad lär jag mig i ”Testning med forge”?

Solidity-tester Ni övar på Grunderna i Web3- och DApp-utveckling med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Grunderna i Web3- och DApp-utveckling?

Du behöver inga förkunskaper. Utbildningen i Grunderna i Web3- och DApp-utveckling på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Testning med forge”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Grunderna i Web3- och DApp-utveckling-lektionen?

Ja. Varje Grunderna i Web3- och DApp-utveckling-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Foundry jämfört med Hardhat
  2. Testning med forge
  3. Fuzzning och invariants
  4. cast och anvil
← Tillbaka till Grunderna i Web3- och DApp-utveckling