Golang测试运行时输出不一致的问题
Golang测试运行时输出不一致的问题 你好,我是Go语言的新手,正在尝试编写Go测试。
以下是我编写的测试用例:
func TestLove(t *testing.T){
got := IkerTalk()
want := “Love is True”
if got != want {
t.Errorf(“got %q want %q”, got, want)
} else {
fmt.Println(“Damn”)
}
}
func TestHello(t *testing.T) {
got := IkerTalk()
want := “Hello Iker”
if got != want {
t.Errorf(“got %q want %q”, got, want)
}
}
当我在VSCode中点击绿色三角形运行测试用例时,
仅运行该测试用例本身:
Running tool: C:\Program Files\Go\bin\go.exe test -timeout 30s -run ^TestLove$ hello
=== RUN TestLove
Damn
— PASS: TestLove (0.00s)
PASS
ok hello (cached)
直接在整个目录下运行所有测试用例(包括其他测试):
$ go test .
Damn
— FAIL: TestHello (0.00s)
hello_test.go:24: got “Love is True” want “Hello Iker”
FAIL
FAIL hello 1.282s
FAIL
结果是,当我运行 go test 遍历所有测试用例时,不会显示“PASS”结果,但当我单独运行它时,确实有“PASS”输出。
这是预期的行为吗?或者我应该怎么做,才能在通过 go test 命令运行所有测试用例时看到“PASS”输出?
先谢谢了!!!
更多关于Golang测试运行时输出不一致的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你单独运行的测试是“TestLove”,但在运行整个测试套件时,失败的是“TestHello”。
如果你单独运行后者,结果是什么?
更多关于Golang测试运行时输出不一致的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我发现应该使用 go test -v 命令,以便在运行所有测试用例时同时显示通过和失败的测试用例。
感谢您的启发和帮助,这对我意义重大!
如果我单独运行“Test Hello”,结果如下。
=== RUN TestHello c:\Users\ikersuen\Desktop\golangpractice\hello_test.go:24: got “Love is True” want “Hello Iker” — FAIL: TestHello(0.00s) FAIL FAIL hello 0.356s
这是一个典型的测试执行顺序和缓存问题。当单独运行 TestLove 时,它通过了测试并输出了 “Damn”。但当运行所有测试时,TestHello 先执行并失败了,导致整个测试套件提前终止,TestLove 可能根本没有执行。
问题在于 IkerTalk() 函数返回的值在两个测试中不一致。根据你的测试代码,TestLove 期望返回 “Love is True”,而 TestHello 期望返回 “Hello Iker”。这说明 IkerTalk() 函数可能有状态依赖或随机性。
以下是示例代码来说明这个问题:
// 假设 IkerTalk() 是这样的实现
var callCount int
func IkerTalk() string {
callCount++
if callCount == 1 {
return "Love is True"
}
return "Hello Iker"
}
// 或者是有随机性的实现
func IkerTalk() string {
rand.Seed(time.Now().UnixNano())
if rand.Intn(2) == 0 {
return "Love is True"
}
return "Hello Iker"
}
要解决这个问题,你需要确保 IkerTalk() 函数是确定性的。如果函数应该有状态,那么需要在每个测试开始时重置状态:
func TestLove(t *testing.T) {
resetIkerState() // 重置状态
got := IkerTalk()
want := "Love is True"
if got != want {
t.Errorf("got %q want %q", got, want)
} else {
fmt.Println("Damn")
}
}
func TestHello(t *testing.T) {
resetIkerState() // 重置状态
got := IkerTalk()
want := "Hello Iker"
if got != want {
t.Errorf("got %q want %q", got, want)
}
}
关于测试输出,go test 默认只显示失败的测试详情。要看到所有测试的输出,可以使用 -v 标志:
go test -v .
这会显示所有测试的详细输出,包括通过的测试。

