测试是在Go中逐个执行还是逐个执行?

Vit*_*lii 7 testing unit-testing go

我有一个带有单元测试的Go文件,其中一些使用了一个公共变量.另一个全局变量用于我正在测试的代码中.所有这些都可能导致问题.

在Go中,当我们执行位于同一文件中的测试时,它们是如何运行的?并行或下一个在上一个完成之前不会启动?

小智 13

默认情况下,所有的测试包依次运行。

同样默认情况下,所有测试集都是并行运行的。

如果您使用默认值并具有针对公共持久层(如 rdbms)进行测试的不同包,这可能会导致问题。如果您在这种情况下遇到问题,那么运行go test ./... -p 1将阻止不同的测试套件同时运行。


icz*_*cza 5

测试它真的很容易:

func Test1(t *testing.T) {
    fmt.Println("Test1 start")
    time.Sleep(time.Second * 2)
    fmt.Println("Test1 end")
}

func Test2(t *testing.T) {
    fmt.Println("Test2 start")
    time.Sleep(time.Second * 2)
    fmt.Println("Test2 end")
}

func Test3(t *testing.T) {
    fmt.Println("Test3 start")
    time.Sleep(time.Second * 2)
    fmt.Println("Test3 end")
}
Run Code Online (Sandbox Code Playgroud)

运行它go test,输出显示它是顺序的:

Test1 start
Test1 end
Test2 start
Test2 end
Test3 start
Test3 end
Run Code Online (Sandbox Code Playgroud)

所以正常的测试是一个接一个地顺序执行的,但是不要忘记没有定义顺序:如何顺序运行golang测试?

另请注意,测试函数可以标记自己有资格进行并行执行,并与使用该T.Parallel()方法执行相同操作的其他测试并行:

并行信号表示此测试将与其他并行测试并行运行(并且仅与其一起运行).

因此,如果我们将上述测试代码修改为:

func Test1(t *testing.T) {
    t.Parallel()
    fmt.Println("Test1 start")
    time.Sleep(time.Second * 2)
    fmt.Println("Test1 end")
}

func Test2(t *testing.T) {
    t.Parallel()
    fmt.Println("Test2 start")
    time.Sleep(time.Second * 2)
    fmt.Println("Test2 end")
}

func Test3(t *testing.T) {
    fmt.Println("Test3 start")
    time.Sleep(time.Second * 2)
    fmt.Println("Test3 end")
}
Run Code Online (Sandbox Code Playgroud)

再次运行它go test,输出是:

Test3 start
Test3 end
Test1 start
Test2 start
Test2 end
Test1 end
Run Code Online (Sandbox Code Playgroud)

这证明了什么?测试顺序没有定义,Test3这次是先执行.然后Test1并行Test2运行.

有一些测试标志可以控制并行执行.例如,该-parallel标志指定其中有多少可以并行运行.如果你执行它go test -parallel=1,输出将再次成为连续的,但订货会Test3,Test1,Test2.

另请注意,Go 1.7引入了子测试和子基准测试.您可以在博客文章使用子测试和子基准测试中阅读更多相关信息:

在Go 1.7中,该testing包在TB类型上引入了Run方法,允许创建子测试和子基准.子测试和子基准测试的引入可以更好地处理故障,对从命令行运行的测试进行细粒度控制,并行控制,并且通常可以使代码更简单,更易于维护.

子测试和subbenchmarks可以平行地延伸,并有一个数字,可以控制它们的执行,例如标志-parallel,-p,-cpu.运行go help testflag以查看测试标志的完整列表.