在日常開發中,我們通常需要針對現有的功能進行單元測試,以驗證開發的正確性。
在go標準庫中有乙個叫做testing
的測試框架,可以進行單元測試,命令是go test ***
。
測試檔案通常是以xx_test.go
命名,放在同一包下面。
現在假設現在需求是:完成兩個複數相加,我們只需要乙個函式便可以完成該任務。
在開發中,我們需要對該函式進行功能測試,如何快速進行單元測試呢?
滑鼠放在函式上右鍵,選擇go:generate unit tests for function即可生成file_test.go檔案。
看下面動畫:
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-l0jjpwry-1608873073214)(./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-5zsmdu3p-1608873073217)(./img/goconvery.png)]
除此之外,我們看到使用vscode生成的單元測試(table-driven tests)賊醜,那麼我們可以使用convey進行單測。
func
testspec
(t *testing.t))}
)})}
使用convey進行包裹起來好看的一匹。
本次組隊學習資料,來自於datawhale組隊學習。
Python學習 Task12 模組
import 模組名 from 模組名 import 函式名 import 模組名 as 新名字。import temperature print 32攝氏度 2f華氏度 temperature.c2f 32 小數點後列印兩位from temperature import c2f print 32攝...
Python程式設計基礎Task12
python自帶的open可以開啟指定文字編碼的檔案。只需要傳入encoding函式即可 2.length with open test.txt r as f for i in f print i word i.split del word len word 1 刪除換行符號 for i in ra...
Go學習之旅 Task7
在go語言中函式定義格式如下 func functionname parameter list returntypes 例1 下面的函式是用於求兩個數的和 func getsum num1 int num2 int int 這個函式傳遞了兩個引數,分別為num1與num2,並且他們都為int型別,將...