Skip to content

Instantly share code, notes, and snippets.

@evalphobia
Last active March 10, 2016 11:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save evalphobia/662c8052776eb3f1f48c to your computer and use it in GitHub Desktop.
Save evalphobia/662c8052776eb3f1f48c to your computer and use it in GitHub Desktop.

9 Testing and benchmarking テストとベンチマーク

この章で学ぶこと

  • ちゃんと単体テストを書こう
  • httptestを使えばHTTPリクエストをモックできるよ
  • サンプルコードをつけてドキュメントを書こう
  • ベンチマークしてパフォーマンスを測定しよう

開発が終わるまでテストコードを待つ必要はない。開発のプロセスに組み込むことが出来る

9.1 Unit testing 単体テスト

正常系、異常系を確認しよう

9.1.1 Basic unit test

ダウンロード(http.Get)が正常に行えるか確認するテストの例 https://play.golang.org/p/nw5idkJ7TF

go test -v _test.go

“testing"パッケージ Test…で始まり、(*testing.T)を引数にとる関数 t.Logでユーザーストーリーテストを行っている t.Error は途中で止まらない

9.1.2 table test

異なるパラメーターと結果をテスト

ダウンロード(http.Get)が正常に行えたり失敗するか確認するテストの例 https://play.golang.org/p/NRYGmiF5C2

無名構造体のスライスをループで回してテスト

9.1.3 mocking calls

これまでのテストはネット環境に依存 しかも接続先にも依存

HTTPリクエストのモックにはhttptestが使える

モックの例 https://play.golang.org/p/hhXtR7iwvI

自動で空いてるポート番号が使える

9.1.4 Testing endpoints

HTTPサーバーのテストの例 https://github.com/goinaction/code/blob/master/chapter9/listing17/listing17.go

パッケージ名 xxx_test を使うと export(パブリック)なものだけテスト可能 (普通はテストコードでの循環参照を防ぐために使う、よね?)

httptest.NewRecorderとhttp.DefaultServeMux.ServeHTTPで 指定したエンドポイントのモックが作成可能

9.2 Examples

godocを使うとパッケージのドキュメントだけでなく、サンプルコードも表示できる 関数のプリフィクスをExample...にする。

// Output: マーカーを使うと専用の表示になる模様。 // Output: // ...

go test実行時に失敗すると、標準出力とOutputマーカーの一致がテストされ、 失敗時はそれが表示される。

9.3 ベンチマーク

異なる手法で、どれがパフォーマンス的に優れているか確認できる。 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回あたりのヒープ割当回数

9.4 Summary

  • テスト機構はGoに組み込まれている
  • go test を実行するとテストが走る
  • テストファイルは必ず _test.go というファイル名
  • 多値のテストをする場合はテーブルテストを使おう
  • サンプルコード(Example)テストとドキュメントの両方に
  • ベンチマークもしよう
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment