こんにちは。
今日は「テスト」についてです。
これまで作り上げてきたGyudon型にテストを追加してもらいます。
Go言語でのテストのやり方
Go言語にはテストをサポートする標準パッケージ testingがあります。 そのためなにかテストフレームワークを使うのではなく、標準のライブラリを使用してテストを行うケースが多いです。
テストは以下のコマンドだけで実行できます。 ./...
でカレントディレクトリ以下のすべてのファイルが対象となります。
$ go test ./...
<機能>.go
というファイルがある時、テストは<機能>_test.go
という名前のファイルに記述していきます。
テストの関数は下のような書き出しで始めます。
func Test<テスト名>(*testing.T)
このような関数のテストを書くときを考えます。
func IsTopping(food string)bool{
switch food {
case "BeniShoga":
return true
case "Egg":
retuen true
}
return false
}
簡単なテストを書くとこのようになります。 panicしたり、Errorに書き込まれなければテストは成功です。
func TestIsTopping(t *testing){
food := "BeniShoga"
if got:=IsTopping(food); !got{
t.Errorf("food = %s , want",got)
}
}
テストの実行と修正
では、基本的なテストのやり方を知ってもらったので、実際に試してみましょう。
本講義では5章で作った関数Eatにテストを追加する形で進めます。
手始めに関数TestGyudon_EatSimpleをいじってテストの挙動を確認してみましょう。
試してみてほしいこと
-
want
とgo
tを比較して、違っていたらt.Errorf()
にメッセージを表示するように修正する - テストを実行する
- 文字が一致してテストが成功するパターンを試す
- 文字が一致せずテストが失敗するパターンを試す
:# TERMINAL 0
:# WORKPATH /../8_test/test/
$ cd /../8_test/test/
$ <お好きなエディタ> shop/shop_test.go
$ go test ./...
/../8_test/test/shop/shop_test.go
func TestGyudon_EatSimple(t *testing.T) {
w := bytes.Buffer{}
r := http.Request{}
gd := NewGyudon()
gd.menu="<入れたい文字列>"
gd.Eat(&w, &r)
/// 関数の結果を格納
got := w.String()
/// 判定処理を書く
}
- 結果
:# TERMINAL 0
:# WORKPATH /../8_test/test/
$ cd /../8_test/test/
$ <お好きなエディタ> shop/shop_test.go
$ go test ./...
/../8_test/test/shop/shop_test.go
if want != got {
t.Errorf("want = %s, got = %s\n", want, got)
}
その他のテストの書き方
2で試したテスト関数 TestGyudon_EatSimple のやり方の場合、引きすうごとにテストの関数を追加せねばならず不便です。 そのため、テスト関数 TestGyudon_Eat のように一つの関数内で複数のパターンのテストを記述することもよくあります。 時間に余裕があったり、興味があるひとはテスト関数 TestGyudon_Eat にあるテストパターンの間違いを修正したり、関数 Eat が参照する変数が空の場合のテストケースを追加してみてください。
最後に
今回は、Goを知ってもらうために、Goの概要説明、実行やコンパイル、関数や構造体、そして、Goroutineをサクッと追っていきました。
今回紹介しきれていないinterface
やchannel
、context
辺りを学習するとよりGo言語が、選択肢としての幅が広がっていくと思います。
もしGo言語をもっと知ってみたいと思っているのであれば、Goが学習できる go tour(日本語) (opens new window)を、まずは一周してみることをお勧めします。
基本的な構文や、Go言語の構造体の説明、先程あげたinterface, channel の説明があります。(執筆時点、contextの説明はありませんでした)
今日は以上です。
ありがとうございました。