Vit*_*lii 7 testing unit-testing go
我有一个带有单元测试的Go文件,其中一些使用了一个公共变量.另一个全局变量用于我正在测试的代码中.所有这些都可能导致问题.
在Go中,当我们执行位于同一文件中的测试时,它们是如何运行的?并行或下一个在上一个完成之前不会启动?
小智 13
默认情况下,所有的测试中包依次运行。
同样默认情况下,所有测试集都是并行运行的。
如果您使用默认值并具有针对公共持久层(如 rdbms)进行测试的不同包,这可能会导致问题。如果您在这种情况下遇到问题,那么运行go test ./... -p 1将阻止不同的测试套件同时运行。
测试它真的很容易:
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包在T和B类型上引入了Run方法,允许创建子测试和子基准.子测试和子基准测试的引入可以更好地处理故障,对从命令行运行的测试进行细粒度控制,并行控制,并且通常可以使代码更简单,更易于维护.
子测试和subbenchmarks可以平行地延伸,并有一个数字,可以控制它们的执行,例如标志-parallel,-p,-cpu.运行go help testflag以查看测试标志的完整列表.
| 归档时间: |
|
| 查看次数: |
2841 次 |
| 最近记录: |