av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

創(chuàng)新互聯(lián)GO教程:go test命令(Go語(yǔ)言測(cè)試命令)完全攻略

Go語(yǔ)言擁有一套單元測(cè)試和性能測(cè)試系統(tǒng),僅需要添加很少的代碼就可以快速測(cè)試一段需求代碼。

10年積累的成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有永興免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

go test 命令,會(huì)自動(dòng)讀取源碼目錄下面名為 *_test.go 的文件,生成并運(yùn)行測(cè)試用的可執(zhí)行文件。輸出的信息類似下面所示的樣子:

ok archive/tar 0.011s
FAIL archive/zip 0.022s
ok compress/gzip 0.033s
...

性能測(cè)試系統(tǒng)可以給出代碼的性能數(shù)據(jù),幫助測(cè)試者分析性能問(wèn)題。

提示

單元測(cè)試(unit testing),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。對(duì)于單元測(cè)試中單元的含義,一般要根據(jù)實(shí)際情況去判定其具體含義,如C語(yǔ)言中單元指一個(gè)函數(shù), Java 里單元指一個(gè)類,圖形化的軟件中可以指一個(gè)窗口或一個(gè)菜單等??偟膩?lái)說(shuō),單元就是人為規(guī)定的最小的被測(cè)功能模塊。

單元測(cè)試是在軟件開(kāi)發(fā)過(guò)程中要進(jìn)行的最低級(jí)別的測(cè)試活動(dòng),軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測(cè)試。

單元測(cè)試——測(cè)試和驗(yàn)證代碼的框架

要開(kāi)始一個(gè)單元測(cè)試,需要準(zhǔn)備一個(gè) go 源碼文件,在命名文件時(shí)需要讓文件必須以
_test結(jié)尾。默認(rèn)的情況下,
go test命令不需要任何的參數(shù),它會(huì)自動(dòng)把你源碼包下面所有 test 文件測(cè)試完畢,當(dāng)然你也可以帶上參數(shù)。

這里介紹幾個(gè)常用的參數(shù):

  • -bench regexp 執(zhí)行相應(yīng)的 benchmarks,例如 -bench=.;
  • -cover 開(kāi)啟測(cè)試覆蓋率;
  • -run regexp 只運(yùn)行 regexp 匹配的函數(shù),例如 -run=Array 那么就執(zhí)行包含有 Array 開(kāi)頭的函數(shù);
  • -v 顯示測(cè)試的詳細(xì)命令。

單元測(cè)試源碼文件可以由多個(gè)測(cè)試用例組成,每個(gè)測(cè)試用例函數(shù)需要以
Test為前綴,例如:

func TestXXX( t *testing.T )

  • 測(cè)試用例文件不會(huì)參與正常源碼編譯,不會(huì)被包含到可執(zhí)行文件中。
  • 測(cè)試用例文件使用 go test指令來(lái)執(zhí)行,沒(méi)有也不需要 main() 作為函數(shù)入口。所有在以_test結(jié)尾的源碼內(nèi)以Test開(kāi)頭的函數(shù)會(huì)自動(dòng)被執(zhí)行。
  • 測(cè)試用例可以不傳入 *testing.T 參數(shù)。

helloworld 的測(cè)試代碼(具體位置是
./src/chapter11/gotest/helloworld_test.go):

本套教程所有源碼下載地址:https://pan.baidu.com/s/1ORFVTOLEYYqDhRzeq0zIiQ    提取密碼:hfyf

package code11_3

import "testing"

func TestHelloWorld(t *testing.T) {
    t.Log("hello world")
}

代碼說(shuō)明如下:

  • 第 5 行,單元測(cè)試文件 (*_test.go) 里的測(cè)試入口必須以 Test 開(kāi)始,參數(shù)為 *testing.T 的函數(shù)。一個(gè)單元測(cè)試文件可以有多個(gè)測(cè)試入口。
  • 第 6 行,使用 testing 包的 T 結(jié)構(gòu)提供的 Log() 方法打印字符串。

1) 單元測(cè)試命令行

單元測(cè)試使用 go test 命令啟動(dòng),例如:

$ go test helloworld_test.go
ok          command-line-arguments        0.003s
$ go test -v helloworld_test.go
=== RUN   TestHelloWorld
--- PASS: TestHelloWorld (0.00s)
        helloworld_test.go:8: hello world
PASS
ok          command-line-arguments        0.004s

代碼說(shuō)明如下:

  • 第 1 行,在 go test 后跟 helloworld_test.go 文件,表示測(cè)試這個(gè)文件里的所有測(cè)試用例。
  • 第 2 行,顯示測(cè)試結(jié)果,ok 表示測(cè)試通過(guò),command-line-arguments 是測(cè)試用例需要用到的一個(gè)包名,0.003s 表示測(cè)試花費(fèi)的時(shí)間。
  • 第 3 行,顯示在附加參數(shù)中添加了-v,可以讓測(cè)試時(shí)顯示詳細(xì)的流程。
  • 第 4 行,表示開(kāi)始運(yùn)行名叫 TestHelloWorld 的測(cè)試用例。
  • 第 5 行,表示已經(jīng)運(yùn)行完 TestHelloWorld 的測(cè)試用例,PASS 表示測(cè)試成功。
  • 第 6 行打印字符串 hello world。

2) 運(yùn)行指定單元測(cè)試用例

go test指定文件時(shí)默認(rèn)執(zhí)行文件內(nèi)的所有測(cè)試用例。可以使用
-run參數(shù)選擇需要的測(cè)試用例單獨(dú)執(zhí)行,參考下面的代碼。

一個(gè)文件包含多個(gè)測(cè)試用例(具體位置是
./src/chapter11/gotest/select_test.go

package code11_3

import "testing"

func TestA(t *testing.T) {
    t.Log("A")
}

func TestAK(t *testing.T) {
    t.Log("AK")
}

func TestB(t *testing.T) {
    t.Log("B")
}

func TestC(t *testing.T) {
    t.Log("C")
}

這里指定 TestA 進(jìn)行測(cè)試:

$ go test -v -run TestA select_test.go
=== RUN   TestA
--- PASS: TestA (0.00s)
        select_test.go:6: A
=== RUN   TestAK
--- PASS: TestAK (0.00s)
        select_test.go:10: AK
PASS
ok          command-line-arguments        0.003s

TestA 和 TestAK 的測(cè)試用例都被執(zhí)行,原因是
-run跟隨的測(cè)試用例的名稱支持正則表達(dá)式,使用
-run TestA$即可只執(zhí)行 TestA 測(cè)試用例。

3) 標(biāo)記單元測(cè)試結(jié)果

當(dāng)需要終止當(dāng)前測(cè)試用例時(shí),可以使用 FailNow,參考下面的代碼。

測(cè)試結(jié)果標(biāo)記(具體位置是
./src/chapter11/gotest/fail_test.go

func TestFailNow(t *testing.T) {
    t.FailNow()
}

還有一種只標(biāo)記錯(cuò)誤不終止測(cè)試的方法,代碼如下:

func TestFail(t *testing.T) {

    fmt.Println("before fail")

    t.Fail()

    fmt.Println("after fail")
}

測(cè)試結(jié)果如下:

=== RUN   TestFail
before fail
after fail
--- FAIL: TestFail (0.00s)
FAIL
exit status 1
FAIL        command-line-arguments        0.002s

從日志中看出,第 5 行調(diào)用 Fail() 后測(cè)試結(jié)果標(biāo)記為失敗,但是第 7 行依然被程序執(zhí)行了。

4) 單元測(cè)試日志

每個(gè)測(cè)試用例可能并發(fā)執(zhí)行,使用 testing.T 提供的日志輸出可以保證日志跟隨這個(gè)測(cè)試上下文一起打印輸出。testing.T 提供了幾種日志輸出方法,詳見(jiàn)下表所示。

單元測(cè)試框架提供的日志方法

方  法 備  注
Log 打印日志,同時(shí)結(jié)束測(cè)試
Logf 格式化打印日志,同時(shí)結(jié)束測(cè)試
Error 打印錯(cuò)誤日志,同時(shí)結(jié)束測(cè)試
Errorf 格式化打印錯(cuò)誤日志,同時(shí)結(jié)束測(cè)試
Fatal 打印致命日志,同時(shí)結(jié)束測(cè)試
Fatalf 格式化打印致命日志,同時(shí)結(jié)束測(cè)試

開(kāi)發(fā)者可以根據(jù)實(shí)際需要選擇合適的日志。

基準(zhǔn)測(cè)試——獲得代碼內(nèi)存占用和運(yùn)行效率的性能數(shù)據(jù)

基準(zhǔn)測(cè)試可以測(cè)試一段程序的運(yùn)行性能及耗費(fèi) CPU 的程度。Go語(yǔ)言中提供了基準(zhǔn)測(cè)試框架,使用方法類似于單元測(cè)試,使用者無(wú)須準(zhǔn)備高精度的計(jì)時(shí)器和各種分析工具,基準(zhǔn)測(cè)試本身即可以打印出非常標(biāo)準(zhǔn)的測(cè)試報(bào)告。

1) 基礎(chǔ)測(cè)試基本使用

下面通過(guò)一個(gè)例子來(lái)了解基準(zhǔn)測(cè)試的基本使用方法。

基準(zhǔn)測(cè)試(具體位置是
./src/chapter11/gotest/benchmark_test.go

package code11_3

import "testing"

func Benchmark_Add(b *testing.B) {
    var n int
    for i := 0; i < b.N; i++ {
        n++
    }
}

這段代碼使用基準(zhǔn)測(cè)試框架測(cè)試加法性能。第 7 行中的 b.N 由基準(zhǔn)測(cè)試框架提供。測(cè)試代碼需要保證函數(shù)可重入性及無(wú)狀態(tài),也就是說(shuō),測(cè)試代碼不使用全局變量等帶有記憶性質(zhì)的 數(shù)據(jù)結(jié)構(gòu)。避免多次運(yùn)行同一段代碼時(shí)的環(huán)境不一致,不能假設(shè) N 值范圍。

使用如下命令行開(kāi)啟基準(zhǔn)測(cè)試:

$ go test -v -bench=. benchmark_test.go
goos: linux
goarch: amd64
Benchmark_Add-4           20000000         0.33 ns/op
PASS
ok          command-line-arguments        0.700s

代碼說(shuō)明如下:

  • 第 1 行的-bench=.表示運(yùn)行 benchmark_test.go 文件里的所有基準(zhǔn)測(cè)試,和單元測(cè)試中的-run類似。
  • 第 4 行中顯示基準(zhǔn)測(cè)試名稱,2000000000 表示測(cè)試的次數(shù),也就是 testing.B 結(jié)構(gòu)中提供給程序使用的 N?!?.33 ns/op”表示每一個(gè)操作耗費(fèi)多少時(shí)間(納秒)。

注意:Windows 下使用 go test 命令行時(shí),
-bench=.應(yīng)寫為
-bench="."。

2) 基準(zhǔn)測(cè)試原理

基準(zhǔn)測(cè)試框架對(duì)一個(gè)測(cè)試用例的默認(rèn)測(cè)試時(shí)間是 1 秒。開(kāi)始測(cè)試時(shí),當(dāng)以 Benchmark 開(kāi)頭的基準(zhǔn)測(cè)試用例函數(shù)返回時(shí)還不到 1 秒,那么 testing.B 中的 N 值將按 1、2、5、10、20、50……遞增,同時(shí)以遞增后的值重新調(diào)用基準(zhǔn)測(cè)試用例函數(shù)。

3) 自定義測(cè)試時(shí)間

通過(guò)
-benchtime參數(shù)可以自定義測(cè)試時(shí)間,例如:

$ go test -v -bench=. -benchtime=5s benchmark_test.go
goos: linux
goarch: amd64
Benchmark_Add-4           10000000000                 0.33 ns/op
PASS
ok          command-line-arguments        3.380s

4) 測(cè)試內(nèi)存

基準(zhǔn)測(cè)試可以對(duì)一段代碼可能存在的內(nèi)存分配進(jìn)行統(tǒng)計(jì),下面是一段使用字符串格式化的函數(shù),內(nèi)部會(huì)進(jìn)行一些分配操作。

func Benchmark_Alloc(b *testing.B) {

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

在命令行中添加
-benchmem參數(shù)以顯示內(nèi)存分配情況,參見(jiàn)下面的指令:

$ go test -v -bench=Alloc -benchmem benchmark_test.go
goos: linux
goarch: amd64
Benchmark_Alloc-4 20000000 109 ns/op 16 B/op 2 allocs/op
PASS
ok          command-line-arguments        2.311s

代碼說(shuō)明如下:

  • 第 1 行的代碼中-bench后添加了 Alloc,指定只測(cè)試 Benchmark_Alloc() 函數(shù)。
  • 第 4 行代碼的“16 B/op”表示每一次調(diào)用需要分配 16 個(gè)字節(jié),“2 allocs/op”表示每一次調(diào)用有兩次分配。

開(kāi)發(fā)者根據(jù)這些信息可以迅速找到可能的分配點(diǎn),進(jìn)行優(yōu)化和調(diào)整。

5) 控制計(jì)時(shí)器

有些測(cè)試需要一定的啟動(dòng)和初始化時(shí)間,如果從 Benchmark() 函數(shù)開(kāi)始計(jì)時(shí)會(huì)很大程度上影響測(cè)試結(jié)果的精準(zhǔn)性。testing.B 提供了一系列的方法可以方便地控制計(jì)時(shí)器,從而讓計(jì)時(shí)器只在需要的區(qū)間進(jìn)行測(cè)試。我們通過(guò)下面的代碼來(lái)了解計(jì)時(shí)器的控制。

基準(zhǔn)測(cè)試中的計(jì)時(shí)器控制(具體位置是
./src/chapter11/gotest/benchmark_test.go):

func Benchmark_Add_TimerControl(b *testing.B) {

    // 重置計(jì)時(shí)器
    b.ResetTimer()

    // 停止計(jì)時(shí)器
    b.StopTimer()

    // 開(kāi)始計(jì)時(shí)器
    b.StartTimer()

    var n int
    for i := 0; i < b.N; i++ {
        n++
    }
}

從 Benchmark() 函數(shù)開(kāi)始,Timer 就開(kāi)始計(jì)數(shù)。StopTimer() 可以停止這個(gè)計(jì)數(shù)過(guò)程,做一些耗時(shí)的操作,通過(guò) StartTimer() 重新開(kāi)始計(jì)時(shí)。ResetTimer() 可以重置計(jì)數(shù)器的數(shù)據(jù)。

計(jì)數(shù)器內(nèi)部不僅包含耗時(shí)數(shù)據(jù),還包括內(nèi)存分配的數(shù)據(jù)。


網(wǎng)頁(yè)題目:創(chuàng)新互聯(lián)GO教程:go test命令(Go語(yǔ)言測(cè)試命令)完全攻略
當(dāng)前路徑:http://uogjgqi.cn/article/dhejghs.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流