Invariant Testing Dasar
Penjelasan
Invariant testing adalah bentuk testing lanjutan di Foundry yang menguji properti ("invariant") yang harus selalu bernilai benar, tidak peduli urutan atau kombinasi pemanggilan fungsi apa pun yang terjadi pada contract. Foundry otomatis menjalankan ribuan urutan pemanggilan fungsi acak (disebut "call sequence") pada target contract, lalu mengecek invariant setelah tiap sequence. Fungsi invariant harus diawali kata `invariant_` (misal `invariant_totalSupplyNeverNegative`), dan target contract yang diuji didaftarkan lewat fungsi `targetContract()`. Ini jauh lebih kuat dari fuzz test biasa karena menguji kombinasi state kompleks, bukan hanya satu pemanggilan fungsi tunggal.
Contoh Konsep
contract VaultInvariantTest is Test {
Vault public vault;
function setUp() public {
vault = new Vault();
targetContract(address(vault));
}
// Invariant: total saldo vault tidak pernah negatif
// dan selalu sama dengan jumlah saldo ETH kontrak
function invariant_balanceMatchesEthBalance() public {
assertEq(vault.totalDeposited(), address(vault).balance);
}
}
Praktikum
Tulis invariant test untuk contract Counter yang memastikan number() tidak pernah melebihi 1000 (asumsikan ada batas maksimum di contract).
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Batasi fungsi yang diuji invariant lewat `targetSelector()` kalau contract punya banyak fungsi tidak relevan, supaya fuzzing lebih fokus dan efisien.