golangテスト、ユニットテスト、ベンチマークテスト

2846 ワード

go test xxx.go
バンド-vは冗長出力を表し,成功passも情報を出力する.
ファイル名xx_を使用test.goプロジェクトディレクトリに保存すればいいです.testディレクトリを新規作成することもできます.TestAll
テストはユニットテスト(機能)とベンチマークテスト(性能)に分けられます.
ユニットテスト関数名Testの先頭に、ポインタ型パラメータ(*testing.T)を受信します.Exampleサンプルプログラムは、パラメータを受信することなくユニットテストも計算します.
go test-v-run=「関数名の指定」
// one_test.go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/http/httptest"
	"testing"
)

const checkMark = "\u2713" //   %v
const ballotX = "\u2717"   //  

//  
func TestA(t *testing.T) {
	t.Log(checkMark, " ,Logf")
	t.Error(ballotX, " ,Errorf")
	t.Fatal(ballotX, "\t  ,Fatalf, \\t ")
	t.Log(" ")
}

//  
func mockServer() *httptest.Server {
	f := func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(200)
		fmt.Fprintf(w, "success")
	}
	return httptest.NewServer(http.HandlerFunc(f))
}
func TestB(t *testing.T) {
	server := mockServer()
	defer server.Close()
	resp, _ := http.Get(server.URL)
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	t.Log(checkMark, "GET :", string(body))

	//	func init(){ .. }  net/http 
	//    req,err := http.NewRequest()
	//    rw := httptest.NewRecorder()
	//    http.DefaultServeMux.ServeHTTP(rw,req)
	//     ,rw.Body 

}

// Example , , FAIL。
func ExampleC() {
	fmt.Println("233")
	//    Output:
	//    233
}

結果は次のとおりです.
C:/Go/bin/go.exe test -v [C:/Users/pxlol/Desktop/demo]
=== RUN   TestA
--- FAIL: TestA (0.00s)
	2018_7_31_test.go:17: ✓  ,Logf
	2018_7_31_test.go:18: ✗  ,Errorf
	2018_7_31_test.go:19: ✗ 	  ,Fatalf, \t 
=== RUN   TestB
--- PASS: TestB (0.00s)
	2018_7_31_test.go:37: ✓ GET : success
=== RUN   ExampleC
--- PASS: ExampleC (0.00s)
FAIL
exit status 1
FAIL	_/C_/Users/pxlol/Desktop/demo	0.088s

ベンチマークテストはBenchmarkで始まり、ポインタ型パラメータ(*testing.B)を受信します.
go test -v -run="none"-bench=.ユニットテストは許可されず、すべてのベンチマークテストを実行し、-benchは関数名を指定し、正則をサポートします.
-benchmemは割り当てメモリの回数とバイト数を表し、-benchtime=「3 s」は3秒継続を表す
// two_test.go
package main

import (
	"fmt"
	"strconv"
	"testing"
)

func BenchmarkA(b *testing.B) {
	number := 10
	b.ResetTimer()

	for i := 0; i < b.N; i++ {
		fmt.Sprintf("%d", number)
	}
}

func BenchmarkB(b *testing.B) {
	number := 10
	b.ResetTimer()

	for i := 0; i < b.N; i++ {
		strconv.Itoa(number)
	}
}

実行結果:
$ go test -v -bench=. -benchmem
goos: windows
goarch: amd64
BenchmarkA-4    20000000               122 ns/op              16 B/op          2 allocs/op
BenchmarkB-4    100000000               11.0 ns/op             0 B/op          0 allocs/op
PASS
ok      _/C_/Users/pxlol/Desktop/demo   3.791s

122 ns/opは1操作あたり122ナノ秒、16 Bは1操作あたり16バイト、2 allocsは1操作あたり2回のメモリ割り当てを示す.