Lohkoketjun älysopimukset Soliditylla · Oppitunti

Edistynyt testaus Foundrylla ja Hardhatilla

Hyödynnä Foundryn tai Hardhatin kaltaisten testauskehysten edistyneitä ominaisuuksia kattavaan yksikkö-, integraatio- ja fuzz-testaukseen.

Oppitunti 1/411 vaihetta

Edistynyt testaus Foundrylla ja Hardhatilla on ilmainen Lohkoketjun älysopimukset Soliditylla-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Lohkoketjun älysopimukset Soliditylla-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lohkoketjun älysopimukset Soliditylla-kurssilla on yhteensä 4 oppituntia.

Johdatus edistyneeseen testaukseen

Tervetuloa edistyneeseen älysopimusten testaukseen! Sopimusten monimutkaistuessa pelkät yksikkötestit eivät riitä takaamaan niiden kestävyyttä.

Tarvitsemme tehokkaita menetelmiä hienovaraisten virheiden löytämiseen ja tietoturvan varmistamiseen. Tässä oppitunnissa perehdytään kehittyneisiin tekniikoihin Foundryn ja Hardhatin kaltaisten viitekehysten avulla.

Miksi edistynyt testaus on tärkeää

Perustesteillä tarkistetaan odotettu toiminta, mutta entä odottamattomat syötteet tai monimutkaiset vuorovaikutukset? Edistynyt testaus auttaa seuraavissa asioissa:

  • Reunatapaukset: Fuzz-testaus auttaa löytämään syötteitä, joita et osannut ennakoida.
  • Vuorovaikutukset: Integraatiotesteillä varmistetaan, että useat sopimukset toimivat yhdessä.
  • Tietoturva: Edistyneet menetelmät paljastavat haavoittuvuuksia ennen käyttöönottoa.

Nämä ovat ratkaisevan tärkeitä taistelunkestävien älysopimusten rakentamisessa.

Foundry: edistyneet työkalut

Hardhat on erinomainen, mutta aidosti edistyneeseen Solidity-natiiviseen testaukseen Foundry erottuu edukseen. Se on Rustilla kirjoitettu erittäin nopea, siirrettävä ja modulaarinen työkalupaketti Ethereum-sovellusten kehittämiseen.

Foundry käyttää testien kirjoittamiseen Solidityä, joten se on hyvin intuitiivinen älysopimusten kehittäjille.

Yksikkötestauksen syväsukellus Foundryn avulla

Yksikkötesteillä tarkistetaan yksittäiset funktiot erillään muusta järjestelmästä. Foundrylla testit kirjoitetaan suoraan Solidityllä, ja niissä peritään usein Test-luokka. Testataan yksinkertainen laskurisopimus.

Huomaa, kuinka testiympäristö määritetään setUp()-funktiossa ennen jokaista testiä.

pragma solidity ^0.8.0;

import "forge-std/Test.sol";

contract Counter {
    uint public count;

    function increment() public {
        count++;
    }

    function decrement() public {
        require(count > 0, "Count cannot be negative");
        count--;
    }
}

contract CounterTest is Test {
    Counter public counter;

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

    function test_Increment() public {
        counter.increment();
        assertEq(counter.count(), 1, "Count should be 1 after increment");
    }

    function test_Decrement() public {
        counter.increment(); // count is 1
        counter.decrement(); // count is 0
        assertEq(counter.count(), 0, "Count should be 0 after decrement");
    }

    function testFail_DecrementZero() public {
        // This test specifically expects a revert
        counter.decrement();
    }
}

Integraatiotestauksen ymmärtäminen

Integraatiotesteillä tarkistetaan useiden älysopimusten välinen vuorovaikutus tai sopimuksen ja ulkoisten palvelujen, kuten oraakkeleiden, välinen vuorovaikutus. Niillä varmistetaan, että eri komponentit toimivat saumattomasti yhdessä.

Tämä on tärkeää, koska yksittäisissä sopimuksissa ei välttämättä ole virheitä, mutta niiden yhdistetty logiikka voi aiheuttaa ongelmia.

Integraatiotestiesimerkki (Foundry)

Simuloidaan tilanne, jossa Token-sopimus toimii yhdessä Vault-sopimuksen kanssa. Holvi sallii käyttäjien tallettaa ja nostaa tokeneita.

Integraatiotestillä tarkistetaan, että tokenit siirretään niiden välillä oikein ja käyttäjien saldot päivitetään.

pragma solidity ^0.8.0;

import "forge-std/Test.sol";
import "forge-std/console.sol";

contract MyToken {
    mapping(address => uint) public balances;

    constructor() {
        balances[msg.sender] = 1000;
    }

    function transfer(address to, uint amount) public returns (bool) {
        require(balances[msg.sender] >= amount, "Insufficient balance");
        balances[msg.sender] -= amount;
        balances[to] += amount;
        return true;
    }
}

contract Vault {
    MyToken public token;
    mapping(address => uint) public deposits;

    constructor(address _token) {
        token = MyToken(_token);
    }

    function deposit(uint amount) public {
        // Assume token.transferFrom or approval for real world. 
        // Simplified here for demo to show interaction.
        token.transfer(address(this), amount); 
        deposits[msg.sender] += amount;
    }

    function withdraw(uint amount) public {
        require(deposits[msg.sender] >= amount, "Insufficient deposit");
        deposits[msg.sender] -= amount;
        token.transfer(msg.sender, amount); 
    }
}

contract IntegrationTest is Test {
    MyToken public token;
    Vault public vault;

    address public ALICE = makeAddr("alice");

    function setUp() public {
        token = new MyToken();
        vault = new Vault(address(token));

        // Give ALICE some tokens for testing from initial deployer
        vm.startPrank(address(this));
        token.transfer(ALICE, 500); 
        vm.stopPrank();
    }

    function test_AliceDepositsAndWithdraws() public {
        vm.startPrank(ALICE);
        
        uint initialAliceBalance = token.balances(ALICE);
        uint depositAmount = 100;

        // Alice deposits
        token.transfer(address(vault), depositAmount); 
        vault.deposit(depositAmount); 

        assertEq(token.balances(ALICE), initialAliceBalance - depositAmount, "Alice's balance should decrease");
        assertEq(token.balances(address(vault)), depositAmount, "Vault should hold deposit amount");
        assertEq(vault.deposits(ALICE), depositAmount, "Alice's vault deposit should be recorded");

        // Alice withdraws
        vault.withdraw(depositAmount);
        assertEq(token.balances(ALICE), initialAliceBalance, "Alice's balance should be restored");
        assertEq(token.balances(address(vault)), 0, "Vault should be empty");
        assertEq(vault.deposits(ALICE), 0, "Alice's vault deposit should be zero");

        vm.stopPrank();
    }
}

Fuzz-testaus: reunatapausten löytäminen

Fuzz-testaus eli fuzzing tuottaa funktioille automaattisesti satunnaisia ja odottamattomia syötteitä. Sen sijaan että yrittäisit itse arvata reunatapauksia, fuzzing-työkalu kokeilee miljoonia yhdistelmiä.

Tämä on erittäin tehokasta löydettäessä haavoittuvuuksia, kuten kokonaislukujen ylivuotoja, alivuotoja tai odottamattomia revert-toimintoja, jotka manuaalisissa testeissä saattavat jäädä huomaamatta.

Fuzz-testaus käytännössä (Foundry)

Foundryssa fuzzing on sisäänrakennettu ominaisuus. Lisää vain parametreja testifunktioosi! Foundry tuottaa automaattisesti satunnaisia arvoja muuttujille a ja b järkeviltä arvoalueilta.

Tämä auttaa varmistamaan, että funktiomme käsittelevät erilaisia syötteitä oikein, erityisesti kun tarkistetaan odottamatonta toimintaa, kuten ylivuotoja ja alivuotoja.

pragma solidity ^0.8.0;

import "forge-std/Test.sol";

contract Calculator {
    function add(uint a, uint b) public pure returns (uint) {
        return a + b;
    }

    function subtract(uint a, uint b) public pure returns (uint) {
        require(a >= b, "Cannot subtract more than available");
        return a - b;
    }
}

contract FuzzTest is Test {
    Calculator public calculator;

    function setUp() public {
        calculator = new Calculator();
    }

    // Fuzz test for addition: check if a + b >= a (unless overflow)
    function testFuzz_Add(uint a, uint b) public {
        // Note: For real-world, use SafeMath or explicit checks for overflows.
        // This test implicitly relies on default Solidity overflow behavior.
        uint sum = calculator.add(a, b);
        // If no overflow, sum should be >= a
        if (sum < a) {
            // Overflow occurred
            assertTrue(a > type(uint).max - b, "Expected overflow");
        } else {
            assertTrue(sum >= a, "Sum should be greater than or equal to a");
        }
    }

    // Fuzz test for subtraction: ensure result is always <= a
    function testFuzz_Subtract(uint a, uint b) public {
        // Only run if a >= b to avoid expected reverts from 'require'
        vm.assume(a >= b);
        uint result = calculator.subtract(a, b);
        assertTrue(result <= a, "Result should be less than or equal to a");
    }
}

Ominaisuuspohjainen testaus (PBT)

Fuzz-testaus on tehokas ominaisuuspohjaisen testauksen (PBT) muoto. Sen sijaan että testattaisiin tiettyjä esimerkkejä, PBT määrittää ominaisuuksia eli invariantteja, joiden tulee aina päteä koodissa.

Fuzzing-työkalu tuottaa sitten syötteitä yrittäen rikkoa näitä ominaisuuksia. Tämä lähestymistapa tuottaa kestävämpiä ja vähemmän hauraita testejä sekä löytää reunatapauksia, joita et ehkä olisi koskaan tullut ajatelleeksi manuaalisesti.

Testaa tietosi

Mitkä seuraavista edistyneitä älysopimusten testaustekniikoita koskevista väitteistä ovat TOSIA?

Kertaus: edistynyt testaus

Olet tutustunut edistyneiden älysopimusten testaustekniikoiden maailmaan!

  • Siirryimme perustason yksikkötesteistä monimutkaisten tilanteiden käsittelyyn.
  • Foundry tarjoaa tehokkaat työkalut Solidity-natiiviseen testaukseen.
  • Yksikkötesteillä tarkistetaan yksittäiset komponentit.
  • Integraatiotesteillä varmistetaan, että useat sopimukset toimivat yhdessä.
  • Fuzz-testaus ja ominaisuuspohjainen testaus auttavat löytämään piileviä virheitä tuottamalla satunnaisia syötteitä ja tarkistamalla invariantteja.

Näiden tekniikoiden hallinta on olennaista turvallisten ja luotettavien älysopimusten käyttöönotossa.

Aloita maksutta

Opi Lohkoketjun älysopimukset Soliditylla tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Edistynyt testaus Foundrylla ja Hardhatilla” ilmainen?

Kyllä – oppitunnin ”Edistynyt testaus Foundrylla ja Hardhatilla” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Lohkoketjun älysopimukset Soliditylla-kurssin, päivitä CoddyKit PROhon. Lohkoketjun älysopimukset Soliditylla-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Edistynyt testaus Foundrylla ja Hardhatilla”?

Hyödynnä Foundryn tai Hardhatin kaltaisten testauskehysten edistyneitä ominaisuuksia kattavaan yksikkö-, integraatio- ja fuzz-testaukseen. Harjoittelet Lohkoketjun älysopimukset Soliditylla-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lohkoketjun älysopimukset Soliditylla-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lohkoketjun älysopimukset Soliditylla-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Edistynyt testaus Foundrylla ja Hardhatilla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lohkoketjun älysopimukset Soliditylla-oppitunnilla?

Kyllä. Jokainen Lohkoketjun älysopimukset Soliditylla-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Edistynyt testaus Foundrylla ja Hardhatilla
  2. Formaalin verifioinnin perusteet
  3. Mainnet-käyttöönotto ja seuranta
  4. Fuzzing ja invarianttitestaus
← Takaisin: Lohkoketjun älysopimukset Soliditylla