Study
Foundry

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).

Editor Latihan

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.