FoundryでFuzzテストを実行してみよう!
今回は、Foundryで、ランダムな値でテストをしてくれる、Fuzzテストをやってみたいと思います。
0 事前準備について
Foundryを実行する事前準備として、インストールが必要です。
ご不明の場合は、こちらの記事もご確認ください。
1 やってみよう
1 Git clone
まずは、下のように、Git Cloneを行います。
git clone https://github.com/ytakahashi2020/Foundry_test.git
2 コンパイルを行う
次に、下のように、コンパイルを行いましょう。
cd Foundry_test
forge build
3 テストを実施する
では、最後にテストを実施します。
forge test
テストが下のように、うまく通ったようです。
2 コードを見てみよう
1 元コントラクトについて
Foundryのサンプルコードをそのまま使っています。
内容の詳細は省きますが、「withdraw」関数を使って、コントラクト内の残高を引き出すことができます。
ちなみに、このコントラクト内の「receive関数」は、Etherを受け取るだけの関数です。
こちらで解説しておりますので、ご不明な方はどうぞ。
2 setUp関数について
では、テストコントラクトを見てみましょう。
「setUp」関数でSafeコントラクトの初期化を行っています。
3 具体的な数値でのテストについて
次に、「test_Withdraw」関数を見てみましょう。
ここでは、「Safe」コントラクトに1Etherを送り、残高を確認し、引き出すテストを行っています。
(今回は趣旨が逸れるので、詳細の解説は省きます。)
ただ、これですと、1Etherの時にうまくいくということしかわかりません。
そこで、ランダムな値を入れた時に、うまくいくかを確かめるのが、次の「Fuzzテスト」になります。
4 Fuzzテストについて
下の部分を見てみましょう。
今回は引数を渡していますが、具体的な値は渡していません。
これにより、ランダムな値でうまくいくかをテストしています。
テストを実行すると、このようにうまく行っています。
ちなみにここでの「run」の数字の256が、実際に実行した回数になります。
5 エラーを出してみよう
ちなみに、こちらが「uint96」になっていますが、ちょっと違和感がありますね。
「uint256」にするとどうなるか見てみましょう。
こちらで実行してみます。
すると、このようにエラーになってしまいました。
6 原因を確認しよう
原因を探りたいので、「-vvv」をつけて見てみましょう。
forge test -vvv
すると、下のように、資金不足である旨のエラーが表示されていることがわかりました。
「79228162514264337593543950336」を送付しようとしたところ、資金が足りなかったようです。
7 anvilでの確認について
「anvil」というコードを実行してみます。
これにより、テストアカウントがテスト用にいくらの残高があるかを確認できます。
これで、確かに足りていないことがわかりました。
以上により、uint256にした結果、取れる範囲が2の256乗まで増え、その結果、所持以上の残高を送ろうとしてエラーになったことがわかりました。
つまり、テスト項目内で、
所持以上で送ろうとした場合
所持以内で送ろうとした場合
でもテストした方がより網羅できそうだとわかりました。
3 最後に
このように、Fuzzテストを実施することで、想定していなかったテスト項目に気づく可能性があります。
よかったらぜひやってみてください。
今回は以上です。