尝试与golang testi/suite并行运行测试失败

ee7vknir  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(157)

我有几个使用testify/suitepackage的测试,我并行执行它们,如下所示

type IntegrationSuite struct {
    suite.Suite
}

func TestIntegrationSuite(t *testing.T) {
    suite.Run(t, &IntegrationSuite{})
}

func (is *IntegrationSuite) TestSomething() {
    is.T().Log("\tIntegration Testing something")
    for i := range myTestTable {
        i := i
        is.T().Run("Testing "+myTestTable[i].scenarioName, func(_ *testing.T) {
            is.T().Parallel()
...

func (is *IntegrationSuite) TestSomethingElse() {
    is.T().Log("\tIntegration Testing something else")
    for i := range myOtherTestTable {
        i := i
        is.T().Run("Testing "+myOtherTestTable[i].scenarioName, func(_ *testing.T) {
            is.T().Parallel()
...
        })

然而,这会使

panic: testing: t.Parallel called multiple times [recovered]
        panic: testing: t.Parallel called multiple times

如何利用特定软件包的并行性?

vaqhlq81

vaqhlq811#

您在错误的testing.T执行严修上呼叫t.Parallel()
您正在使用以下工具启动多个 * 子测试 *:

is.T().Run("Testing "+myOtherTestTable[i].scenarioName, func(_ *testing.T) {...}

但是,您不是将 * 子测试 * 标记为并行,而是将 * 外部父测试 * 标记为并行,以开始每个子测试:

is.T().Parallel() // marks outer test as parallel

相反,将子测试函数的testing.T参数绑定到一个变量,并在子测试上调用Parallel

is.T().Run("Testing "+myOtherTestTable[i].scenarioName, func(t *testing.T) {
            t.Parallel() // this is the subtest's T instance
            // test code
        })

这会将父测试中的所有子测试都标记为并行。如果还希望将父测试标记为与包中的其他测试并行,请在TestSomethingElse的开头(不在子测试中)调用is.T().Parallel()一次
有关子检测平行性的更多详细信息,请参见:平行度控制

g2ieeal7

g2ieeal72#

请注意,验证套件目前不是“线程安全”的,因此不支持并发。在有些情况下,即使测试应该失败,也会成功通过。
请在此处查找当前状态以及报告的问题:https://github.com/stretchr/testify/issues/187

相关问题