【问题标题】:False positive when sending SIGTERM to Ginkgo test suite向 Ginkgo 测试套件发送 SIGTERM 时出现误报
【发布时间】:2019-09-08 15:21:40
【问题描述】:

在使用 Ginkgo 框架编写测试时,我注意到按 C-c 终止正在运行的套件会产生误报。

note the green "1 Passed"

当您查看代码时,您会注意到此测试应在 5 秒后失败。当我在 2 秒后终止它时,套件失败,但在结果中,有 1 个通过测试,0 个失败。

Debian Stretch 和 Ubuntu 18.04 上的 go 版本 1.11.4 和 1.12.4 的行为相同。

套件代码(使用 ginkgo bootstrap 自动生成):

package hmmm_test

import (
    "testing"

    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"
)

func TestHmmm(t *testing.T) {
    RegisterFailHandler(Fail)
    RunSpecs(t, "Hmmm Suite")
}

测试代码:

package hmmm_test

import (
    "time"

    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"
)

var _ = Describe("Hmmm", func() {
    Context("Dummy test", func() {
        It("should fail after 5 seconds", func() {
            time.Sleep(5 * time.Second)
            Expect(1).NotTo(Equal(1))
        })
    })
})

测试运行 5 秒时的输出(正确的一个):

$ ginkgo

Running Suite: Hmmm Suite
=========================
Random Seed: 1555580607
Will run 1 of 1 specs
• Failure [5.001 seconds]
Hmmm
/tmp/hmmm/hmmm_test.go:10
  Dummy test
  /tmp/hmmm/hmmm_test.go:11
    should fail after 5 seconds [It]
    /tmp/hmmm/hmmm_test.go:12
    Expected
        <int>: 1
    not to equal
        <int>: 1
    /tmp/hmmm/hmmm_test.go:14
------------------------------
Summarizing 1 Failure:
[Fail] Hmmm Dummy test [It] should fail after 5 seconds
/tmp/hmmm/hmmm_test.go:14
Ran 1 of 1 Specs in 5.002 seconds
FAIL! -- 0 Passed | 1 Failed | 0 Pending | 0 Skipped
--- FAIL: TestHmmm (5.00s)
FAIL
Ginkgo ran 1 suite in 5.665592703s
Test Suite Failed

测试在完成之前终止时的输出(误报):

$ ginkgo

Running Suite: Hmmm Suite
=========================
Random Seed: 1555580763
Will run 1 of 1 specs
^C
Ran 1 of 1 Specs in 1.187 seconds
FAIL! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped
Ginkgo ran 1 suite in 1.85541211s
Test Suite Failed

我希望输出类似于: FAIL! -- 0 Passed | 1 Failed | 0 Pending | 0 Skipped 或者 1 个已跳过或待处理,但不是 Passed,尤其是测试被写入失败。

实际输出表明失败,但也表明所有测试...通过: FAIL! -- 1 Passed | 0 Failed | 0 Pending | 0 Skipped

我错过了什么吗?

【问题讨论】:

  • 我不明白你为什么觉得这很奇怪。显然测试在 5 秒过去之前不会失败,所以在此之前不应该有失败。有人可能会争辩说,如果 Ginkgo 被中断,它应该总是失败,但你必须把它带到问题跟踪器。
  • 正如我所说,不要严格期望失败 - 它可以报告为 Pending 甚至 Skipped,但我当然不希望 Passed 成为结果。不管怎样,我会把这个链接到 Ginkgo 问题跟踪器,看看他们怎么说。

标签: go testing signals false-positive ginkgo


【解决方案1】:

这是预期的行为,但我不一定声称这是故意的、明确的或正确的。发生这种情况是因为测试以 passing1 开始其运行生命周期,并更改其他事件的状态(失败/恐慌)。

当 Ginkgo 收到 SIGTERM 时,它不会停止当前正在运行的测试(尽管它会阻止更多测试运行2)。同时,它会收集迄今为止运行的测试的报告3。此集合将遍历所有已开始“处理”的节点4(与运行松散相关但开始稍早于运行)。由于测试以通过状态开始并且没有更改,因此报告为通过。

这个问题不是讨论这种方法有效性的地方(很可能有更好的方法)。如果您想请求更改此行为,请使用您打开的问题5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多