在練習(xí) 9.4 中你寫(xiě)了一個(gè)叫 main_oddeven.go 的程序用來(lái)測(cè)試前 100 個(gè)整數(shù)是否是偶數(shù)。這個(gè)函數(shù)屬于 even 包。
下面是一種可能的方案:
示例 13.7 even_main.go:
package main
import (
"fmt"
"even/even"
)
func main() {
for i:=0; i<=100; i++ {
fmt.Printf("Is the integer %d even? %v\n", i, even.Even(i))
}
}
上面使用了 even.go 中的 even 包:
示例 13.8 even/even.go:
package even
func Even(i int) bool { // Exported function
return i%2 == 0
}
func Odd(i int) bool { // Exported function
return i%2 != 0
}
在 even 包的路徑下,我們創(chuàng)建一個(gè)名為 oddeven_test.go 的測(cè)試程序:
示例 13.9 even/oddeven_test.go:
package even
import "testing"
func TestEven(t *testing.T) {
if !Even(10) {
t.Log(" 10 must be even!")
t.Fail()
}
if Even(7) {
t.Log(" 7 is not even!")
t.Fail()
}
}
func TestOdd(t *testing.T) {
if !Odd(11) {
t.Log(" 11 must be odd!")
t.Fail()
}
if Odd(10) {
t.Log(" 10 is not odd!")
t.Fail()
}
}
由于測(cè)試需要具體的輸入用例且不可能測(cè)試到所有的用例(非常像一個(gè)無(wú)窮的數(shù)),所以我們必須對(duì)要使用的測(cè)試用例思考再三。
至少應(yīng)該包括:
可以直接執(zhí)行 go install 安裝 even 或者創(chuàng)建一個(gè) 以下內(nèi)容的 Makefile:
include $(GOROOT)/src/Make.inc
TARG=even
GOFILES=\
even.go\
include $(GOROOT)/src/Make.pkg
然后執(zhí)行 make(或 gomake)命令來(lái)構(gòu)建歸檔文件 even.a
測(cè)試代碼不能在 GOFILES 參數(shù)中引用,因?yàn)槲覀儾幌M傻某绦蛑杏袦y(cè)試代碼。如果包含了測(cè)試代碼,go test 會(huì)給出錯(cuò)誤提示!go test 會(huì)生成一個(gè)單獨(dú)的包含測(cè)試代碼的 _test
程序。
現(xiàn)在我們可以用命令:go test
(或 make test
)來(lái)測(cè)試 even 包。
因?yàn)槭纠?13.5 中的測(cè)試函數(shù)不會(huì)調(diào)用 t.Log 和 t.Fail,所以會(huì)得到一個(gè) PASS 的結(jié)果。在這個(gè)簡(jiǎn)單例子中一切都正常執(zhí)行。
為了看到失敗時(shí)的輸出,把函數(shù) TestEven 改為:
func TestEven(t *testing.T) {
if Even(10) {
t.Log("Everything OK: 10 is even, just a test to see failed output!")
t.Fail()
}
}
現(xiàn)在會(huì)調(diào)用 t.Log 和 t.Fail,得到的結(jié)果如下:
--- FAIL: even.TestEven (0.00 seconds)
Everything OK: 10 is even, just a test to see failed output!
FAIL
練習(xí) 13.4:string_reverse_test.go
為練習(xí) 7.11 string_reverse.go 寫(xiě)一個(gè)單元測(cè)試。
把 string_reverse 放到自己的包 strev 中,只包含一個(gè)可導(dǎo)出函數(shù) reverse。
實(shí)現(xiàn)并測(cè)試它。