その他の関連コンテンツは次の場所にあります:個人ホームページ
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
逆の状況では、関数がエラー復帰を報告しない場合、テストは失敗します。
テスト関数は必須です。そう
external
でpublic
ない場合、テスト関数は効果がありません。
2.2 チートコード
ブロックチェーンの状態やテスト固有のreverts
イベントを操作するためにEvents
、Foundry には一連のチートコードが付属しています
チートコードには、 Forge 標準ライブラリのTest
コントラクトによって提供されるvm
インスタンスを通じてアクセスできます。
例を挙げて詳しく説明しましょう。
私たちの目的は、コントラクトの関数がコントラクト所有者のみによって呼び出されることを確認することです。テストを作成します。
./test
Owner.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-url
RPC 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
フォークの変更後もフォークの状態とテスト コントラクト自体は永続的です。