Goのfuzzing testを調べる
概要
Go1.18からfuzzing testができるようになった。
fuzzing testの概要と導入して嬉しいかの情報をまとめる。
What’s fuzzing test?
ファジングは、プログラムへの入力を継続的に操作して、コードが影響を受けやすいパニック、バグ、データ競合などの問題を見つける自動テストの一種です。これらのセミランダムデータミューテーションは、既存の単体テストが見逃す可能性のある新しいコードカバレッジを発見し、そうでなければ見過ごされてしまうエッジケースのバグを発見することができます。このタイプのテストは、インテリジェントに少数のミューテーションではなく、より多くのミューテーションを迅速に実行できる場合に最適に機能します。
FYI https://go.googlesource.com/proposal/+/master/design/draft-fuzzing.md
テストケースはあくまでも人間が書くので、書いた人が想定できてないケースはカバーできない。それをカバーする手段の一つがfuzzing testらしい。
例えば下記のチュートリアルではfuzzing testを実施することで下記のバグに気づくことができる。
https://go.dev/doc/tutorial/fuzz
- マルチバイト文字の対応ができていない
- 無効なUTF-8が渡されるケースを想定できていない
ランダムで値を渡すのでこういったケースを洗い出すことができる。
導入
Go1.18ではパッケージのインストール等は不要で利用できる。
- テストケースの頭にFuzzをつける
- 実行時に go test -fuzz=メソッド名 として実行する
実行時に -fuzztime 秒 を付けないと失敗するまで無限に実行する
FuzzFooというメソッドがある場合 go test -fuzz=FuzzFoo etc.) 10秒動かして問題なければ止める go test -fuzz=FuzzFoo -fuzztime 10s
所感
- ランダムに値を渡していくため、テストコードにおける
期待値
は渡せない- 例えば
3だったらFizz
みたいなテストで使うものではなさそう - FizzBuzzで書くならこんな感じ
- 例えば
- 向いていそうなところはどこか
- Fuzzing trophy case · golang/go Wiki · GitHub を見るに変換とかパース処理とかに向いていそう
- 例えば yamlの変換ができなかったケースを見つけられている
- Fuzzing trophy case · golang/go Wiki · GitHub を見るに変換とかパース処理とかに向いていそう