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

4 回复

你单独运行的测试是“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 .

这会显示所有测试的详细输出,包括通过的测试。

回到顶部