栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是在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 startTest1 endTest2 startTest2 endTest3 startTest3 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 startTest3 endTest1 startTest2 startTest2 endTest1 end

这证明了什么?测试顺序未定义,这

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
。运行
gohelp testflag
以查看测试标志的完整列表。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/448183.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号