Asas Pembangunan Web3 & DApp · Pelajaran

Pengujian forge

Ujian Solidity

Pelajaran 2 daripada 413 langkah

Pengujian forge ialah pelajaran Asas Pembangunan Web3 & DApp percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Asas Pembangunan Web3 & DApp, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Asas Pembangunan Web3 & DApp merangkumi sejumlah 4 pelajaran.

Ujian Ialah Kontrak

Dalam Foundry, fail ujian ialah kontrak Solidity yang mewarisi Test daripada pustaka forge-std. Setiap fungsi awam yang namanya bermula dengan test dijalankan sebagai satu kes ujian.

Fail ujian berada dalam test/ dan lazimnya menggunakan akhiran .t.sol.

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

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

Fungsi setUp

Fungsi khas setUp() dijalankan sebelum setiap ujian, lalu memberikan setiap ujian keadaan baharu yang terasing. Laksanakan kontrak anda dan sediakan sebarang data ujian di sini.

Oleh sebab keadaan ditetapkan semula antara ujian, satu ujian tidak mungkin bergantung secara tidak sengaja pada ujian yang lain.

Counter counter;

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

Penegasan

forge-std menyediakan pembantu penegasan yang menyebabkan ujian gagal dengan mesej yang jelas apabila syarat tidak dipenuhi:

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

Menjalankan Ujian

Jalankan keseluruhan himpunan dengan forge test. Tapis mengikut nama dengan --match-test atau mengikut kontrak dengan --match-contract. Tingkatkan keterperincian dengan bendera -v untuk melihat log dan jejak.

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

Menjangkakan Revert

Gunakan vm.expectRevert tepat sebelum panggilan yang sepatutnya gagal. Ujian hanya lulus jika panggilan seterusnya melakukan revert, dengan pilihan untuk memadankan mesej ralat tertentu atau ralat tersuai.

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

Menyamar sebagai Akaun

vm.prank(addr) menetapkan msg.sender untuk panggilan seterusnya sahaja. vm.startPrank(addr) menerapkannya pada semua panggilan sehingga vm.stopPrank(). Dengan ini, anda boleh menguji kawalan akses tanpa melakukan deployment menggunakan banyak kunci.

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

Memanipulasi Baki dan Masa

Kod tipu membolehkan anda mengawal persekitaran:

  • vm.deal(addr, amount) — menetapkan baki ETH akaun
  • vm.warp(timestamp) — menetapkan block.timestamp
  • vm.roll(blockNum) — menetapkan block.number

Ini memudahkan logik yang bergantung pada masa dan baki diuji secara deterministik.

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

Menguji Peristiwa

vm.expectEmit mengisytiharkan medan peristiwa yang hendak diperiksa, diikuti peristiwa yang dijangka, kemudian panggilan yang sepatutnya memancarkannya. Nilai boolean memilih topik dan data yang hendak dipadankan.

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

Label dan Log

vm.label(addr, name) memberikan nama yang mudah dibaca kepada alamat dalam jejak. console.log daripada forge-std mencetak output nyahpepijat semasa ujian apabila dijalankan dengan keterperincian yang mencukupi.

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

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

Ujian Fork

Foundry boleh membuat fork rangkaian langsung supaya ujian anda dijalankan terhadap kontrak dan keadaan sebenar yang telah dideploy. Tetapkan URL RPC dan gunakan vm.createSelectFork untuk menetapkan blok tertentu.

Ini amat berguna untuk menguji integrasi dengan protokol seperti Uniswap atau Aave tanpa melakukan deployment semula.

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

Penyusunan Ujian

Amalan baik untuk ujian forge:

  • Satu tingkah laku bagi setiap fungsi ujian
  • Nama deskriptif seperti testRevertWhenNotOwner
  • Persediaan dikongsi dalam setUp()
  • Gunakan prank untuk kawalan akses dan warp untuk logik masa
  • Tambahkan ujian fork untuk integrasi luaran

Semakan Pantas

Apakah tujuan fungsi setUp() dalam kontrak ujian Foundry?

Imbas Kembali

Anda telah mempelajari pengujian forge:

  • Ujian ialah kontrak Solidity yang mewarisi Test; fungsi bermula dengan test
  • setUp() menyediakan keadaan baharu bagi setiap ujian
  • Penegasan: assertEq, assertTrue, dan sebagainya
  • Kod tipu: prank, deal, warp, expectRevert, expectEmit
  • Ujian fork dijalankan terhadap keadaan rangkaian langsung

Seterusnya: fuzzing dan pengujian invarian.

Percuma untuk bermula

Pelajari Asas Pembangunan Web3 & DApp dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
29
Pelajaran
105

Soalan Lazim

Adakah pelajaran “Pengujian forge” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Asas Pembangunan Web3 & DApp, termasuk “Pengujian forge”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Asas Pembangunan Web3 & DApp merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pengujian forge”?

Ujian Solidity Anda berlatih Asas Pembangunan Web3 & DApp menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Asas Pembangunan Web3 & DApp?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Asas Pembangunan Web3 & DApp di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Pengujian forge” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Asas Pembangunan Web3 & DApp ini?

Ya. Setiap pelajaran Asas Pembangunan Web3 & DApp menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Foundry berbanding Hardhat
  2. Pengujian forge
  3. Fuzzing dan Invarian
  4. cast dan anvil
← Kembali ke Asas Pembangunan Web3 & DApp