Go言語(プログラミング)入門メモ㉔

## テストを実行する
作成したコードが正しく動作するか確認するためにテスト用のコードを作成する。テストを作成することでコードに変更があった場合でも、テストが成功すればコードの動作に問題ないことを確認できる。
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」とする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579705/f1adb494-adff-b120-b0c6-cc443e390316.png)

テストを行う関数は「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がついたファイルを実行できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579705/48503e27-ae15-f486-1ab8-84ff51d787fc.png)
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」が出力されていることを確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579705/1a1991e2-a734-01f9-4452-72912b5fc820.png)

## 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 ./...」)テストを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3579705/66f7f067-8894-61d0-ab94-fac8f9525484.png)
想定通り、テストが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