Foundryの使い方(2) --forgeコマンドライン

その他の関連コンテンツは次の場所にあります:個人ホームページ

2.鍛造:

Forge は Foundry に含まれるコマンド ライン ツールで、スマート コントラクトのテスト、構築、デプロイに使用されます。

forge test

テスト ケースを実行します。すべてのテストは Solidity で記述されます

Forge はソース ディレクトリ内の任意の場所でテストを検索します。test で始まる関数とのコントラクトはすべてテストとみなされます。

通常、テストは次の場所に配置されます。src/test中

フィルターを渡して特定のテストを実行します。

forge test --match-contract ComplicatedContractTest --match-test testDeposit

これにより、という名前のtestDepositテストコントラクト内のテストが実行されますComplicatedContractTest

2.1 テストの作成:

テスト コードは Solidity で記述され、最も一般的なテスト記述はForge**** 標準ライブラリのコントラクトを通じて実装されますTest

Forge 標準ライブラリを使用すると、基本的なログ機能とアサーション機能を提供する DSTest コントラクトを利用できます。

forge-std/Test.solテスト コントラクトをインポートして継承するTest

import "forge-std/Test.sol";

テストケース:

pragma solidity 0.8.10;

import "forge-std/Test.sol";

contract ContractBTest is Test {
    uint256 testNumber;

    function setUp() public {
        testNumber = 42;
    }

    function testNumberIs42() public {
        assertEq(testNumber, 42);
    }

    function testFailSubtract43() public {
        testNumber -= 43;
    }
}
  • setUp(): 各テスト ケースの実行前に呼び出されるオプションの関数
  • test():test接頭辞が付いている関数はテストケースとして実行されます
  • testFail():test逆の状況では、関数がエラー復帰を報告しない場合、テストは失敗します。

テスト関数は必須です。そうexternalpublicない場合、テスト関数は効果がありません。

2.2 チートコード

ブロックチェーンの状態やテスト固有のrevertsイベントを操作するためにEvents、Foundry には一連のチートコードが付属しています

チートコードには、 Forge 標準ライブラリのTestコントラクトによって提供されるvmインスタンスを通じてアクセスできます。

例を挙げて詳しく説明しましょう。

私たちの目的は、コントラクトの関数がコントラクト所有者のみによって呼び出されることを確認することです。テストを作成します。

./testOwner.t.sol テスト ファイルをフォルダーの下に追加します。

pragma solidity 0.8.10;
import "forge-std/Test.sol";
error Unauthorized();

contract OwnerUpOnly {
    address public immutable owner;
    uint256 public count;
    constructor() {
        owner = msg.sender;
    }
    function increment() external {
        if (msg.sender != owner) {
            revert Unauthorized();
        }
        count++;
    }
}

contract OwnerUpOnlyTest is Test {
    OwnerUpOnly upOnly;
    function setUp() public {
        upOnly = new OwnerUpOnly();
    }
    function testIncrementAsOwner() public {
        assertEq(upOnly.count(), 0);
        upOnly.increment();
        assertEq(upOnly.count(), 1);
    }
}

実行しforge testてテストが合格したことを確認する

次に、所有者ではない人がカウントを増やせないことをテストします。

コントラクトOwnerUpOnlyTestに関数を追加します。

function testIncrementAsNotOwner() public {
        vm.prank(address(0));
        upOnly.increment();
    }

もう一度実行するforge testと、テストの取り消しにより、契約の所有者ではない場合はカウントを増やすことができないことが示されていることがわかります。

偽造テストの例

**vm.prank(address)**チートコードによって msg.sender の ID がゼロのアドレスに変更された後、次の呼び出しを行って、呼び出し元がコントラクト所有者ではないことを確認します。

完全な詳細な紹介は [ Cheatcodes Reference - Foundry Chinese Document (learnblockchain.cn) ]cheatcodeを参照してください。

2.3 Forge 標準ライブラリの概要

Forge Stdテストコードの作成に必要なすべての基本機能を提供します

  • Vm.sol: 最新のチートコードインターフェース
  • console.solおよびconsole2.sol: ヘルメット スタイルのログ機能
  • Script.sol: Solidity スクリプトの基本ユーティリティ
  • Test.sol: 標準ライブラリ、チート コード サンプル ( vm)、および Hardhat コンソールを含む DSTest のスーパーセット

2.4 トレースについて

Forge は、失敗したテスト ( -vvv) またはすべてのテスト ( ) の-vvvvトレースを生成できます。Traces

Tracesさまざまな色の

  • : 戻らない通話の場合
  • : 復帰を伴う呼び出しに使用されます
  • : チートコードを呼び出すために使用されます
  • シアン: ログをトリガーするために使用されます
  • 黄色: 契約の展開に使用されます
    トレースの例を偽造する

2.5 フォークテスト

Forge は、フォークされたテストの 2 つの異なる方法をサポートしています。

  • フォーク モード:forge test --fork-url標準経由のすべてのテストに単一のフォークを使用します。
  • チートコードのフォーク:チートコードのフォークを通じて、Solidity テストコード内で複数のフォークを直接作成、選択、管理します。

2.5.1 フォークモード:

--fork-urlRPC URL を渡してフォーク--fork-block-numberされたブロックの高さを指定します

forge test --fork-url "https://mainnet.infura.io/v3/10973852e3ce414296d70fd551402e92" --fork-block-number 17001200

2.5.2 フォークチートコード:

Solidity テスト コードでプログラムによってフォーク モードに入ります。

Foundry テスト コードでは、すべてのテスト関数が分離され、各テスト関数はsetup()後続のコピー状態を使用して実行され、setup()その期間中に作成されたブランチをテストに使用できます。

  • createFork('mainnet', blocknumber)チートコードはブランチを作成し、一意の識別子を返します
  • selectFork(Forkid)Forkid を渡して、対応するブランチを有効にします
  • activeFork()現在有効になっているブランチの Forkid を返します。
  • rollFork(blocknumber)分岐したブロックの高さを設定する

各フォークは独立した EVM であり、すべてのフォークは完全に独立したストレージを使用しますが、msg.senderフォークの変更後もフォークの状態とテスト コントラクト自体は永続的です。

おすすめ

転載: blog.csdn.net/m0_53689197/article/details/134215687