是在Go中并行执行测试还是一一执行?

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

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

回答:

测试起来真的很容易:

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")

}

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

Test1 start

Test1 end

Test2 start

Test2 end

Test3 start

Test3 end

因此,正常的测试是依次执行的,但是请不要忘记未定义顺序:如何依次运行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")

}

使用再次运行它go test,输出为:

Test3 start

Test3 end

Test1 start

Test2 start

Test2 end

Test1 end

这证明了什么?测试顺序未定义,这Test3是第一次执行。然后Test1Test2被运行 并行

有一些控制并行执行的测试标志。例如,该-parallel标志指定其中有多少可以并行运行。如果你执行它go test

-parallel=1,输出将再次成为连续的,但订货会Test3Test1Test2

另请注意,Go

1.7引入了子测试和子基准。您可以在博客文章《使用子测试和子基准》中阅读有关此内容的更多信息:

在Go

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

子测试和subbenchmarks可以平行地延伸,并有一个数字,可以控制它们的执行,例如标志-parallel-p-cpu。运行go

help testflag以查看测试标志的完整列表。

以上是 是在Go中并行执行测试还是一一执行? 的全部内容, 来源链接: utcz.com/qa/427574.html

回到顶部