テストを実行する
作成したコードが正しく動作するか確認するためにテスト用のコードを作成する。テストを作成することでコードに変更があった場合でも、テストが成功すればコードの動作に問題ないことを確認できる。
Goの標準パッケージであるtestingを利用してテストを作成する。
テストコードの作成
入門メモ㉓で作成したmath.goのコードの平均値を算出するAverage関数の動作確認テストを作成する。
package mylib
func Average(s []int) int {
total := 0
for _, i := range s {
total += i
}
return int(total / len(s))
}
テストを作る際はテストする対象と同じフォルダに、テスト用のコードを記述するファイルを入れる。testingパッケージはファイル名の末尾が「_test.go」のファイルを読み込んでテストを行うため、ここではファイル名を「math_test.go」とする。

テストを行う関数は「Test」から始まる関数名で、引数に「*testing.T」受け取る必要がある。そのため、ここではTestAverageという名前で引数に「t *testing.T」を受け取る関数を定義する。
TestAverage関数に、Average関数の動作を確認するコードを書いていく。
Average関数にスライス[]int{1,2,3,4,5}を渡して、結果を変数vに代入する。この時、vには3が入るはずなので、vが3ではなかった場合に「t.Error("Expected 3, got", v)」としてvの値とエラー分を表示させる。
なにもエラーが起こらなければ、このテストは成功したことになる。
package mylib
import "testing"
func TestAverage(t *testing.T) {
v := Average([]int{1,2,3,4,5})
if v != 3{
t.Error("Expected 3, got", v)
}
}
ターミナルでgo testコマンドを実行してテストを行う。
「go test ./..」とすることで現在のディレクトリとそのしたにあるすべての_test.goがついたファイルを実行できる。

math_test.goファイルが存在するmylibフォルダでテストが実行され、テストの結果として「ok」が出力されていることが確認できる。
次にテストが失敗するケースとしてスライスに6と7を付け加えて実行する。(スライスの値の平均が4になるので3と異なるようになる)
package mylib
import "testing"
func TestAverage(t *testing.T) {
v := Average([]int{1, 2, 3, 4, 5, 6, 7})
if v != 3 {
t.Error("Expected 3, got", v)
}
}
再度実行すると設定したエラーメッセージとともにテストの実行結果として「FAIL」が出力されていることを確認できる。

testingのメソッド
t.Error以外にもテストにしようできるメソッドがある。例えば、t.Fail(テストが失敗し、かつテストの実行を続けたいときに使う)やt.Skip(テストが必要ないときに使う)がある。
t.Skipを使用してみる。Debugという変数の値がtrueであればテストをスキップするようにする。以下のようにmath_test.goを作成する。
t.Skipの引数にはスキップの理由を入れておく。
package mylib
import "testing"
var Debug bool = true
func TestAverage(t *testing.T) {
if Debug {
t.Skip("trueだからskipします")
}
v := Average([]int{1, 2, 3, 4, 5})
if v != 3 {
t.Error("Expected 3, got", v)
}
}
※補足
変数Debugの条件分岐のところで、「if Debug == true」じゃなくていいの?と思い調べたところ
Go言語では、条件がtrueの場合にifブロック内のコードが実行されるため、if Debugはif Debug == trueと同じ意味を持つ。したがって、if DebugだけでDebugがtrueであるかどうかのチェックが行われます。
if Debug == trueと書くこともできますが、冗長であるため通常は省略されます。if Debugと書くことで、コードが簡潔で読みやすくなる、
ということで問題なしでした。(前に学習したかもしれないが忘れていた。)
※補足終わり
-vオプションを指定して(「go test -v ./...」)テストを実行する。

想定通り、テストがSkipされてその理由も表示されるようになっている。
学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP
・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897