func TestCoverage(t *testing.T) {
var tests = []struct {
input string
env Env
want string // expected error from Parse/Check or result from Eval
}{
{"x % 2", nil, "unexpected '%'"},
{"!true", nil, "unexpected '!'"},
{"log(10)", nil, `unknown function "log"`},
{"sqrt(1, 2)", nil, "call to sqrt has 2 args, want 1"},
{"sqrt(A / pi)", Env{"A": 87616, "pi": math.Pi}, "167"},
{"pow(x, 3) + pow(y, 3)", Env{"x": 9, "y": 10}, "1729"},
{"5 / 9 * (F - 32)", Env{"F": -40}, "-40"},
}
for _, test := range tests {
expr, err := Parse(test.input)
if err == nil {
err = expr.Check(map[Var]bool{})
}
if err != nil {
if err.Error() != test.want {
t.Errorf("%s: got %q, want %q", test.input, err, test.want)
}
continue
}
got := fmt.Sprintf("%.6g", expr.Eval(test.env))
if got != test.want {
t.Errorf("%s: %v => %s, want %s",
test.input, test.env, got, test.want)
}
}
}
首先,我們要確保所有的測試都正常通過:
$ go test -v -run=Coverage gopl.io/ch7/eval
=== RUN TestCoverage
--- PASS: TestCoverage (0.00s)
PASS
ok gopl.io/ch7/eval 0.011s
下面這個(gè)命令可以顯示測試覆蓋率工具的使用用法:
$ go tool cover
Usage of 'go tool cover':
Given a coverage profile produced by 'go test':
go test -coverprofile=c.out
Open a web browser displaying annotated source code:
go tool cover -html=c.out
...
go tool命令運(yùn)行Go工具鏈的底層可執(zhí)行程序。這些底層可執(zhí)行程序放在$GOROOT/pkg/tool/${GOOS}_${GOARCH}目錄。因?yàn)橛?code>go build命令的原因,我們很少直接調(diào)用這些底層工具。
$ go test -run=Coverage -coverprofile=c.out gopl.io/ch7/eval
ok gopl.io/ch7/eval 0.032s coverage: 68.5% of statements
這個(gè)標(biāo)志參數(shù)通過在測試代碼中插入生成鉤子來統(tǒng)計(jì)覆蓋率數(shù)據(jù)。也就是說,在運(yùn)行每個(gè)測試前,它將待測代碼拷貝一份并做修改,在每個(gè)詞法塊都會設(shè)置一個(gè)布爾標(biāo)志變量。當(dāng)被修改后的被測試代碼運(yùn)行退出時(shí),將統(tǒng)計(jì)日志數(shù)據(jù)寫入c.out文件,并打印一部分執(zhí)行的語句的一個(gè)總結(jié)。(如果你需要的是摘要,使用go test -cover。)
更多建議: