この章で学ぶこと
- ちゃんと単体テストを書こう
- httptestを使えばHTTPリクエストをモックできるよ
- サンプルコードをつけてドキュメントを書こう
- ベンチマークしてパフォーマンスを測定しよう
開発が終わるまでテストコードを待つ必要はない。開発のプロセスに組み込むことが出来る
正常系、異常系を確認しよう
ダウンロード(http.Get)が正常に行えるか確認するテストの例 https://play.golang.org/p/nw5idkJ7TF
go test -v
_test.go
“testing"パッケージ Test…で始まり、(*testing.T)を引数にとる関数 t.Logでユーザーストーリーテストを行っている t.Error は途中で止まらない
異なるパラメーターと結果をテスト
ダウンロード(http.Get)が正常に行えたり失敗するか確認するテストの例 https://play.golang.org/p/NRYGmiF5C2
無名構造体のスライスをループで回してテスト
これまでのテストはネット環境に依存 しかも接続先にも依存
HTTPリクエストのモックにはhttptestが使える
モックの例 https://play.golang.org/p/hhXtR7iwvI
自動で空いてるポート番号が使える
HTTPサーバーのテストの例 https://github.com/goinaction/code/blob/master/chapter9/listing17/listing17.go
パッケージ名 xxx_test を使うと export(パブリック)なものだけテスト可能 (普通はテストコードでの循環参照を防ぐために使う、よね?)
httptest.NewRecorderとhttp.DefaultServeMux.ServeHTTPで 指定したエンドポイントのモックが作成可能
godocを使うとパッケージのドキュメントだけでなく、サンプルコードも表示できる
関数のプリフィクスをExample...
にする。
// Output: マーカーを使うと専用の表示になる模様。 // Output: // ...
go test実行時に失敗すると、標準出力とOutputマーカーの一致がテストされ、 失敗時はそれが表示される。
異なる手法で、どれがパフォーマンス的に優れているか確認できる。 CPUやメモリの問題を特定することができる。
関数のプリフィクスをBenchmark...
にし、(*testing.B)を引数にとる関数
b.Nのforループを最低1秒以上は実行し続ける模様 for i := 0; i < b.N; i++ { // run }
go test に -bench オプションをつけて実行する(-run=xxx をつけて、通常の単体テストが実行されないようにすると良い)
出力結果は
関数名 | 実行回数 | 1回あたりの平均実行時間
-benchtime
オプションを使うと実行時間を変更できる(デフォルト1秒)
intからstringに変換するベンチマーク (fmt.Sprintf vs strconv.FormatInt vs strconv.Itoa) https://play.golang.org/p/13QrMASnGi
初期化処理を行った後に、forループの前で b.ResetTimer を使うと正確な結果に近づくので、 適宜使ったほうが良い
-benchmem
オプションを使うとメモリ使用に関する結果が追加される
出力結果は以下のとおり
関数名 | 実行回数 | 1回あたりの平均実行時間 | 1回あたりのヒープ使用量 | 1回あたりのヒープ割当回数
- テスト機構はGoに組み込まれている
- go test を実行するとテストが走る
- テストファイルは必ず _test.go というファイル名
- 多値のテストをする場合はテーブルテストを使おう
- サンプルコード(Example)テストとドキュメントの両方に
- ベンチマークもしよう