メインコンテンツへスキップ

前提条件

Foundry プロジェクトが既にセットアップされており、smart contract のコンパイルが正常に完了している必要があります。 手順については Foundry のセットアップと smart contract のコンパイル チュートリアルを参照してください。

テスト仕様の編集

テスト対象の smart contract は最小限であるため、必要なテストケースも最小限です。 テストの前に、smart contract をデプロイする必要があります。 これは setUp ブロックで行われます。 smart contract は単独では実行できず、実行するには EVM 内に存在する必要があるためです。 Foundry ではデフォルトで、テストはエミュレートされたインメモリ EVM インスタンスで実行されます。このインスタンスは一時的なものであるため、デプロイは形式的なものです。 ファイルを開いてください:test/Counter.t.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

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

contract CounterTest is Test {
    Counter public counter;

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

    function testInitialValue() public view {
        assertEq(counter.value(), 0);
    }

    function testIncrementValueFromZero() public {
        counter.increment(100);
        assertEq(counter.value(), 100);
    }

    function testIncrementValueFromNonZero() public {
        counter.increment(100);
        counter.increment(23);
        assertEq(counter.value(), 123);
    }
}

3つのテストケースがあることがわかります:
  • 初期値 value() の確認。
  • increment(num) を呼び出し、value() が更新されたことを確認。
  • increment(num) を再度呼び出し、value() が再び更新されたことを確認。

smart contract に対するテストの実行

以下のコマンドで、先ほど確認したテストを実行します。
forge test

テスト出力の確認

すべてのテストが計画通りに動作した場合、以下のような出力が表示されます:
Ran 3 tests for test/Counter.t.sol:CounterTest
[PASS] testIncrementValueFromNonZero() (gas: 32298)
[PASS] testIncrementValueFromZero() (gas: 31329)
[PASS] testInitialValue() (gas: 10392)
Suite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.35ms (3.16ms CPU time)

Ran 1 test suite in 171.04ms (5.35ms CPU time): 3 tests passed, 0 failed, 0 skipped (3 total tests)

次のステップ

smart contract のテストが完了しました。次は smart contract のデプロイを行いましょう! 次のチュートリアル Foundry を使用した smart contract のデプロイ に進んでください。