go testユニットテストと圧力テストを簡単に使用
10294 ワード
なぜ被テストファイルとテストファイルは通常同じフォルダの下と同じ宣言パッケージに置かれますか?
通常、私たちはテストされたファイルと別のテストファイルを同じ声明パッケージに入れて、パッケージ内テストと呼ばれています.もちろん、テスト関数のファイルを独立したパッケージに入れることもできます.パッケージ外テストと呼ばれます.
しかし、パケット外テストソースファイルには、パケットレベルのプライベート変数、関数、構造体タイプなど、測定されたソースファイル内のパケットレベルのプライベートなプログラムエンティティをテストできないという弊害があります.これは,両者の属するパケットが異なるためである.したがって、パッケージ外テストソースファイルを作成することは一般的にはめったにありません.
go testコマンドの簡単な使用
共通コマンド
意味
go test .
現在のディレクトリのすべてのテストファイルのテスト関数を実行するには、現在のパスの下にテストファイルがある必要があります.サブフォルダのテストファイルは検出されません.
go test ./…
現在のディレクトリの下にあるすべてのサブフォルダ内のテスト関数を実行します.
go test filename_test.go
現在のディレクトリの下にあるテストファイルのすべてのテスト関数を実行します.
go test -run TestFuncName
現在のディレクトリの下にある特定のテスト関数の実行
go test ./service -run TestFuncName
指定したパスを実行します./サービス内の特定のテスト関数
共通タグ
さぎょう
-v
合格した詳細テスト情報を表示します.デフォルトではエラー情報と合格した概要のみが表示されます.
-c
テストを実行するための実行可能ファイルを生成しますが、実行しません.この実行可能ファイルは、「pkg.test」と名付けられ、「pkg」は、テストされたコードパッケージのインポートパスの最後の要素の名前です.
-i
テストに依存するパッケージをインストールするだけで、実行はコンパイルされません.
-o
コンパイルによって生成される実行可能ファイル名の指定
go testユニットテスト
ルール#ルール#
2つの書き込みユニットテスト
テストを待つファイルdivision.go次のように、xxxというテストファイルを書く必要があります.test.go同じかばんの中に
package math
import (
"errors"
)
func Division(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New(" 0")
}
return a / b, nil
}
直接自分で関数をテストして、このように比較的に柔軟にどのように測定したいですか?
mydivision_test.go
package math
import (
"testing"
)
// 1
func Test_Division_1(t *testing.T) {
if i, e := Division(6, 2); i != 3 || e != nil {
t.Error(" ") //
} else {
t.Log(" ") //
}
}
// 2
func Test_Division_2(t *testing.T) {
t.Error(" t.Error ")
}
実行命令
go test .
の結果は次のとおりです.$ go test .
--- FAIL: Test_Division_2 (0.00s)
mydivision_test.go:16: t.Error
FAIL
FAIL mytest/goTest 0.001s
実行命令
go test -v .
の結果は次のとおりです.$ go test -v .
=== RUN Test_Division_1
--- PASS: Test_Division_1 (0.00s)
mydivision_test.go:11:
=== RUN Test_Division_2
--- FAIL: Test_Division_2 (0.00s)
mydivision_test.go:16: t.Error
FAIL
exit status 1
FAIL mytest/goTest 0.001s
-vを付けないと、失敗した用例しか表示されず、-vを加えると、通過した用例も失敗した用例も表示されます.
gotestsツールパッケージを使用してテストファイルを自動的に生成し、サンプルテーブル駆動でテストするのに適した関数
go get -v github.com/cweill/gotests/...
gotests -all -w .
は、現在のディレクトリのすべてのファイルに対応するテストファイル結果はdivisionです.goはdivisionを生成しましたtest.goファイルは、生成ファイルのデフォルト接頭辞が対応する元のファイル名division_test.go、それから「//TODO:Add test cases.」エリアに例を記入してください
package math
import "testing"
func TestDivision(t *testing.T) {
type args struct {
a float64
b float64
}
tests := []struct {
name string //
args args //
want float64 //
wantErr bool // bool error, error
}{
// TODO: Add test cases.
{"case 0", args{6, 2}, 3, false},
{"case 1", args{6, 0}, 0, true},// error , 0, wantErr true
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := Division(tt.args.a, tt.args.b)
if (err != nil) != tt.wantErr {
t.Errorf("Division() error = %v, wantErr %v", err, tt.wantErr)
return
}
if got != tt.want {
t.Errorf("Division() = %v, want %v", got, tt.want)
}
})
}
}
実行結果の両方の例がテストに合格しました
$ go test -v .
=== RUN TestDivision
=== RUN TestDivision/case_0
=== RUN TestDivision/case_1
--- PASS: TestDivision (0.00s)
--- PASS: TestDivision/case_0 (0.00s)
--- PASS: TestDivision/case_1 (0.00s)
PASS
ok mytest/goTest 0.001s
go test圧力試験
ルール#ルール#
package math
import (
"testing"
)
func Benchmark_Division(b *testing.B) {
for i := 0; i < b.N; i++ { //use b.N for looping
Division(4, 5)
}
}
func Benchmark_TimeConsumingFunction(b *testing.B) {
b.StopTimer() //
// , , ,
//
b.StartTimer() //
b.N=1234 // 1234
for i := 0; i < b.N; i++ {
Division(4, 5)
}
}
次のコマンド
go test -v ./webbench_test.go ./division.go -bench=".*"
を実行すると、圧力テストのみが表示されます.2つのファイルが依存しているため、一緒にコンパイルして実行する必要があります.-bench=".*"
は、すべての圧力テスト関数を実行した結果を次のように示します.$ go test -v ./webbench_test.go ./division.go -bench=".*"
goos: linux
goarch: amd64
Benchmark_Division-8 2000000000 0.74 ns/op
Benchmark_TimeConsumingFunction-8 1234 0.96 ns/op
PASS
ok command-line-arguments 1.558s
上の情報はBenchmark_Divisionのデフォルトでは20000000回実行されていますが、Benchmark_TimeConsumingFunctionは、b.N=1234を設定することによって異なる回数を実行する.各実行平均時間はそれぞれ0.74ナノ秒と0.96ナノ秒であり、総実行時間は1.588秒であった.