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ではパッケージのインストール等は不要で利用できる。

  1. テストケースの頭にFuzzをつける
  2. 実行時に go test -fuzz=メソッド名 として実行する
    実行時に -fuzztime 秒 を付けないと失敗するまで無限に実行する
FuzzFooというメソッドがある場合
go test -fuzz=FuzzFoo

etc.) 10秒動かして問題なければ止める
go test -fuzz=FuzzFoo -fuzztime 10s

所感

  • ランダムに値を渡していくため、テストコードにおける 期待値 は渡せない
  • 向いていそうなところはどこか

参考資料