主にgolangのテストコードについて

テストの対するgoの取り組みは他と比べるとかなり技術レベルが低い。

go test

*_test.goのファイルを対象にテストを行う。テスト、ベンチマーク、コード例の3種類の関数が特別に扱われる。

  1. Test*
    これはテスト関数となり、PassかFailを返す

  2. Benchmark*
    操作の性能を図る

  3. Example*
    機械的に検査されたドキュメントを提供する

テストを最初に書き、それらがユーザが報告したものと同じふるまいのバグを出すようにすることが優れたやり方で、それにより問題に適切に取り組むことができる。

失敗したテストは通常t.Errorfで出力すれば、パニックやテストの停止を行うことなく継続してテストを行える。
ランダムテストを行うときは現在時刻を使うのが有効。

ホワイトボックステスト

製品コードで実行したくない部分がある場合、偽の実装をつくることで分離することができる。この場合はその関数を公開されないパッケージレベルに変更してテストコードで独自ロジックを作れば良い。

で、元のロジックを保存しておきdeferを呼び出す

saved := func  
defer func(){  
    func = saved
}()

脆弱なテストを避ける

健全な変更が与えられたにもかかわらず、テストが通ってしまうことは避けるべき。