在日常開發中,我們通常需要針對現有的功能進行單元測試,以驗證開發的正確性。 在go標準庫中有乙個叫做testing
的測試框架,可以進行單元測試,命令是go test ***
。
測試檔案通常是以xx_test.go
命名,放在同一包下面。
現在假設現在需求是:完成兩個複數相加,我們只需要乙個函式便可以完成該任務。
在開發中,我們需要對該函式進行功能測試,如何快速進行單元測試呢?
滑鼠放在函式上右鍵,選擇go:generate unit tests for function即可生成file_test.go檔案。
隨後在測試檔案中完成測試功能即可,可以進入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
第三步:
8080除此之外可以使用convey進行單測。
go單元測試
go本身提供了一套輕量級的測試框架。mytest工程下有兩個檔案 main.go package main func main func add a,b int intmain test.go package main import testing func testadd1 t testing.t...
Go單元測試
對包含網路請求和響應的函式進行單元測試需要我們模擬客戶端請求和服務端返回。以乙個登入模組為例,main.go檔案如下 其中的重點是利用 http.newrequest構造乙個虛擬的http get請求,再用httptest.newrecorder 建立http.responesewriter,模擬真...
Go單元測試
go單元測試 1.使用testing框架 1.1.go test 如果執行正確,無日誌.錯誤時,會輸出日誌 1.2.go test v 執行正確或錯誤都會輸出日誌 1.3.當出現錯誤時,可以使用t.fatalf 來格式化輸出錯誤資訊,並退出日誌 1.4.t.logf 方法可以輸出相應的日誌 1.5....