本節**樣例見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...