当前位置: 首页 > 面试题库 >

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

龙欣德
2023-03-14
问题内容

我有一个包含单元测试的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以查看测试标志的完整列表。



 类似资料:
  • 问题内容: 我们有一个基于石英的调度程序应用程序,该应用程序每分钟运行约1000个作业,每分钟的秒数均匀分布,即每秒约16-17个作业。理想情况下,这16-17个作业应同时触发,但是该作业的execute方法的第一个语句(仅记录执行时间)非常晚。例如,假设我们从05:00到05:04每分钟安排1000个作业。因此,理想情况下,计划在05:03:50进行的作业应该在05:03:50记录了execut

  • 我们有一个基于quartz的调度程序应用程序,每分钟运行大约1000个作业,这些作业平均分布在每分钟的几秒钟内,即每秒大约16-17个作业。理想情况下,这16-17个作业应该同时触发,但是我们的第一条语句,它只是记录执行的时间,任务的execute方法调用得很晚。假设从05:00到05:04,我们每分钟安排1000个工作。因此,理想情况下,计划在05:03:50的作业应该在05:03:50记录ex

  • 有4个类包含测试< code>TestClass1、TestClasss2、TestClass3、TestClass4。您需要创建2个测试套件,每个套件将包含2个类,并使用< code>Maven surefire插件并行运行它们。 我创建了两个包含以下内容的xml文件: 和 也添加到: 接下来,我用命令< code>mvn clean test运行项目,项目将要运行,但是测试没有开始。我哪里错了

  • 我正在将并行执行引入我的testNG套件中。当我将“parallel”设置为“tests”时,两个浏览器打开,两个测试的第一个类同时开始--这是我所期望的。当我将其设置为“classes”时,我希望第一个测试中的两个类同时开始,但是只有一个浏览器打开,第一个类中的第一个方法执行,然后用第二个类中的第一个方法打开一个新的浏览器,依此类推。谁能告诉我我做错了什么? 下面是我的xml文件:

  • 本文向大家介绍浅谈onTouch先执行,还是onClick执行(详解),包括了浅谈onTouch先执行,还是onClick执行(详解)的使用技巧和注意事项,需要的朋友参考一下 有一个Button 按钮,要想为该按钮设置onClick事件和OnTouch事件 此时,我们现在分析一下,是onTouch先执行,还是onClick执行,接下来我从FrameWork 源码去探寻一下整个事件的执行流程和原理:

  • 问题内容: 我有一些正在使用Jenkins运行的自动化测试。 我已经将Jenkins连接到我的GitSwarm,它从我的分支中提取代码, 然后将其执行。 我已经为Jenkins安装了“并行测试作业执行插件”。 在插件中,我指定了要分三批运行的测试 屏幕截图 还有什么我应该指定的吗?我认为我不必这样做,因为 我已经连接到GitSwarm来运行代码。控制台输出似乎 另有说明! 在工作空间C:\ Jen