
Goの標準パッケージでユニットテストはできないんですか?
Go言語の標準パッケージ testing
でユニットテストを行うことができます。
今回は testing
を使う際のルールや簡単なユニットテストを実施していきましょう。
Goの標準パッケージ・testingとは?
Go言語では testing
という、ユニットテストをサポートするための標準パッケージが用意されており、Goをインストールしたら使用できます。
標準出力のテスト以外にも、ユニットテストのカバー率(カバレッジ)やベンチマークまでテストすることができるので、サードパーティ製を使用する前に、一度 testing
でユニットテストを実施してみましょう。
testingでユニットテストを行う
今回のユニットテストは、パッケージ管理の記事で使用したものを利用していきます。
フォルダ構成は以下の通りです。
morip@morip-PC1:~/go/src/package$ tree
.
├── go.mod
├── main.go
└── myapp
├── myfunc.go
└── myvar.go
テスト用のファイルを作成する
テスト用のファイルは、テストしたいファイルと同階層に作成します。
ファイル名の付け方にはルールがあり、以下の通りです。
今回は myfunc.go
をテストするので、テストファイルの名称を myfunc_test.go
とします。
morip@morip-PC1:~/go/src/package$ tree
.
├── go.mod
├── main.go
└── myapp
├── myfunc.go
├── myfunc_test.go // テスト用のファイル
└── myvar.go
// myfunc.go
package myapp
// 平均値
func Ave(sl []int) int {
sum := 0
for _, v := range sl {
sum += v
}
return int(sum / len(sl))
}
// 合計値(今回新たに追加)
func Sum(sl []int) int {
sum := 0
for _, v := range sl {
sum += v
}
return int(sum)
}
myfunc_test.go
のファイル下記のように記述しました。
// myfunc_test.go
package myapp
import "testing"
var Debug bool = false
func TestAve(t *testing.T) {
if Debug {
t.Skip("テストをスキップします")
}
v := Ave([]int{10, 20, 30, 40, 50})
if v != 30 {
t.Errorf("テストの値は%vで %v ではありません", v, 30)
}
}
テストファイル作成の流れを確認する
それでは myfunc_test.go
の内容を詳細に確認していきましょう。
myfunc_test.go
の内容を確認!- STEP1パッケージ宣言
package myapp
テスト元と同じパッケージ名で
- STEP2標準パッケージをインポートする
import "testing"
- STEP3テストを実施するか?しないか?
var Debug bool = false
false
でテスト実施true
でテストをスキップ - STEP4テスト実施するための設定
func TestAve(t *testing.T) { // テストを実施するかスキップするかを判定 if Debug { t.Skip("テストをスキップします") } // 関数を実行 v := Ave([]int{10, 20, 30, 40, 50}) // 求められる値と違う時はエラーメッセージを返す if v != 30 { t.Errorf("テストの値は%vで %v ではありません", v, 30) } }
テストする関数を
TestXxxx
と表記するのがルールTestxxxx
はNG - STEP5テスト実施
morip@morip-PC1:~/go/src/package/myapp$ go test PASS ok package/myapp 0.002s
カレントディレクトリでテストを実施
ファイル名は不要morip@morip-PC1:~/go/src/package/myapp$ go test -v === RUN TestAve --- PASS: TestAve (0.00s) PASS ok package/myapp 0.002s
詳細なテスト結果を得たい時は
-v
を付ける
テストを実施するコマンドについて
今回はテストファイルがひとつしかありませんが、複数のテストファイルを一気に実行したい場合はパッケージのトップディレクトリで下記のコマンドを実施してください。
morip@morip-PC1:~/go/src/package$ go test -v ./...
? package [no test files] // packageフォルダにテストファイルが無い
=== RUN TestAve
--- PASS: TestAve (0.00s)
PASS
ok package/myapp (cached)
. が3つ必要ですので、間違いないようにしましょう。
テストを実行するカレントディレクトリに注意して、コマンド入力する必要があります。
テストのカバー率を確かめる
では、アプリ全体のテストカバー率を確かめます。
morip@morip-PC1:~/go/src/package$ go test -cover ./...
? package [no test files]
ok package/myapp (cached) coverage: 44.4% of statements
package
フォルダにはテストファイルが無い状態で、package/myapp
フォルダのテスト進捗が coverage: 44.4% of statements
で44%であることが確認できます。

テストのカバー率は100%を目指しましょう!
【まとめ】Goの標準パッケージtestingを使ってテストする
今回はGoの標準パッケージtestingを使ったテストの基本(本当の基本…)をお伝えしてきました。
ここまでの内容をまとめてみます。
以上です。
この記事では testing
の基本中の基本をお伝えしてきました。
あとは、あなたがパッケージを新たに作成して、プログラムコードを書いてテストを実施してみてください。
まずは、今回お伝えした基本をしっかりを理解しておきましょう。
comment