建立第一個單元測試(golang)-1
當我們建立起最簡單的RESTful api後,接下來我們就要將測試也放到我們的程式中 了 在golang中,他原本就有將測試的框架包進去他原生的函示庫了,在網路上也很很多不一樣的測試框架,而我接下來會實做的測試方式,主要是參考
gorm mock
- https://yuanchieh.page/posts/2021/2021-03-18-golang-test/
- https://medium.com/cbi-engineering/mocking-techniques-for-go-805c10f1676b
- https://medium.com/@rosaniline/unit-testing-gorm-with-go-sqlmock-in-go-93cbce1f6b5b
- https://betterprogramming.pub/how-to-unit-test-a-gorm-application-with-sqlmock-97ee73e36526
這篇文章的實作方式,如果大家有什麼其他的說明,也可以在下面留言交流
首先,要先安裝測試需要的套件 測試框架 https://onsi.github.io/ginkgo/#getting-ginkgo
go get github.com/onsi/ginkgo/ginkgo
go get github.com/onsi/gomega/...
mock框架 https://github.com/golang/mock
go install github.com/golang/mock/[email protected]
gorm mock https://github.com/DATA-DOG/go-sqlmock
go get github.com/DATA-DOG/go-sqlmock
在這邊補充說明一下mock的用途 在最簡單的測試中,你的程式中只會有input跟output 例如
func add(a int, b int) (output int) {
return a + b
}
這樣在撰寫測試的時候就只要寫上
result := add(1,2)
Expect(result).To(Equal(3))
這樣即可,但如果有一天你的程式有依賴其他人 例如
import (
"math/rand"
)
func isRandomEven() (output bool) {
result := rand.Intn(86)
return result%2 == 0
}
這時的測試就不能像上方這樣寫了,因為每次測試出來的結果都會不一樣 這時候就要將rand.Intn所產出的內容用一個我們可以控制的function來控制,而這個動作就叫做mock 原始程式
import (
"math/rand"
)
var getRandom = rand.Intn
func isRandomEven() (output bool) {
result := getRandom(86)
return result%2 == 0
}
測試
getRandom = func (_ int) int {
return 10
}
result := isRandomEven()
Expect(result).To(Equal(true))
下一篇我們就要將這些測試的內容放到我們的程式中了