11 單元測試

2021-10-12 17:29:22 字數 3613 閱讀 8182

本節**樣例見code/utest資料夾

在日常開發中,我們通常需要針對現有的功能進行單元測試,以驗證開發的正確性。

在go標準庫中有乙個叫做testing的測試框架,可以進行單元測試,命令是go test ***

測試檔案通常是以xx_test.go命名,放在同一包下面。

現在假設現在需求是:完成兩個複數相加,我們只需要乙個函式便可以完成該任務。

在開發中,我們需要對該函式進行功能測試,如何快速進行單元測試呢?

滑鼠放在函式上右鍵,選擇go:generate unit tests for function即可生成file_test.go檔案。

看下面動畫:

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-gkbo95a4-1608710959000)(./img/test.gif)]

隨後在測試檔案中完成測試功能即可,可以進入code/utest裡面的complex_test進行單元測試。

第一:單元測試的時候,如果有一些列印log資訊,我們執行***_test.go是輸出不出來的,此時需要使用:

go test ***_test.go -v
使用-v引數可以幫助我們解決此問題。

第二:單測覆蓋率,覆蓋率可以簡單理解為進行單元測試mock的時候,能夠覆蓋的**行數佔總**行數的比率,當然是高一點要好些。可以通過-cover指定

go test ***_test -v -cover
第三:在上述提到的測試方法中我們使用的是(table-driven tests)**驅動型測試,我們看一下**:

tests :=

struct

, b: complex,}

, want:

&complex,}

,}

在todo裡面我們可以填寫很多單元測試樣例。

基準測試函式名字必須以benchmark開頭,**在***_test.go中。具體如下:

func

benchmarkcomplex

(t *testing.b)

}

執行:

go test -benchmem -run=

.-bench=

.

輸出:

goos: linux

goarch: amd64

benchmarkcomplex-

820542494

58.9 ns/op 5 b/op 1 allocs/op

pass

ok _

/home/light/go_dev/

go-talent/code/utest 1.272s

20542494表示for迴圈的測試,58.9表示每次需要花費58.9納秒。

-benchmem可以提供每次操作分配記憶體的次數,以及每次操作分配的位元組數。

allocs/op 表示每次操作從堆上分配記憶體的次數。b/op 表示每次操作分配的位元組數。

gomock是官方提供的mock框架,同時有mockgen工具來輔助生成測試**。

需要自己先安裝一下:

go get -u github.com/golang/mock/mockgen下面以db為例,有如下介面:

type db inte***ce

我們想通過get介面返回對應value。於是寫出了下面這個函式:

func

getvalue

(db db, key int)(

string

,error

)return value,

nil}

我們現在比較關心的是當前我們寫的函式是否正確,而中間呼叫了get介面,該接**們可以進行mock,首先使用下面命令:

mockgen -source=db.go -destination=db_mock.go -package=db
隨後在單元測試檔案中進行go mock即可。

func

testgetvalue

(t *testing.t)

else

}

其中比較重要的是打樁(stubs):

m.expect().get(gomock.eq(1)).return("我是1的value", nil)
這一行我們mock掉了get介面,假設其返回字串(我是1的value)與nil,隨後進行邏輯測試。

這種方式的好處是不直接依賴的例項,而是使用依賴注入降低耦合性。

在1.4中我們是需要進行打樁並使用mockgen才可以完成一些複雜api的測試的,那有沒有更簡單的方法呢,例如:直接替換函式為想要的函式,在github上有monkey庫為我們使用。

輸入下面命令進行安裝:

假設有get介面的實現者是handler,那麼我們直接使用monkey進行方法替換,把get方法替換為我們自己的,僅此一步搞定單元測試,非常方便。

func

testgetvalue1

(t *testing.t)

)if v, err :=

getvalue

(h,1

); err !=

nilelse

}

接下來引入乙個比較方便的單元測試框架,可以在瀏覽器進行實時檢視單元測試結果。只需要三步即可。

第一步:

go get github.com/smartystreets/goconvey
第二步:

$gopath/bin/goconvey
第三步:

http://localhost:8080
此時在頁面可以看到下面這個。

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-qik1ni4k-1608710959002)(./img/goconvery.png)]

除此之外,我們看到使用vscode生成的單元測試(table-driven tests)賊醜,那麼我們可以使用convey進行單測。

func

testspec

(t *testing.t))}

)})}

使用convey進行包裹起來好看的一匹。

() )

})})

}

使用convey進行包裹起來好看的一匹。

可以進行單元測試麼 Task11 單元測試

本節 樣例見code utest資料夾在日常開發中,我們通常需要針對現有的功能進行單元測試,以驗證開發的正確性。在go標準庫中有乙個叫做testing的測試框架,可以進行單元測試,命令是go test 測試檔案通常是以xx test.go命名,放在同一包下面。現在假設現在需求是 完成兩個複數相加,我...

單元測試 單元測試文章收藏

前言 前段時間公司計畫做自動化測試,自己也打算圍繞幾個點做相關調研,現在想想呢?其實對自動化測試的概念都還不是十分清晰,當時主要還是圍繞 單元測試 向qa小夥伴學習了一段時間,現由於公司重組,學習中斷,這裡簡單記錄一些單元測試好文,留待後續參考.什麼叫自動化測試?自動化測試覆蓋率?覆蓋率如何做到的?...

單元測試之Django單元測試

每個應用,自帶tests.py 整合在django的專案檔案裡,更多是開發人員寫django自動的測試執行 3.1 前後置方法執行特點 django.test.testcase類主要由前 後置處理方法和test開頭的方法組成 特點 繼承於django.test.testcase 測試用例都是test...