如何使用uTest

时间:2016-02-06 08:02:51

标签: scala unit-testing scala.js utest

https://github.com/lihaoyi/utest

如文档中所述,uTest并行运行测试。 如果使用

,则可以按顺序运行一个测试套件中的测试用例
import utest.ExecutionContext.RunNow

但是sbt运行不同的测试套件总是并行的。 https://github.com/lihaoyi/utest#parallel-testing

这通常对性能有好处,但在测试对象或其他“单一资源”时,这可能会导致问题。 如果在多个测试套件中测试或使用相同的对象,则这些并行测试可能会相互干扰。

日志记录就是一个很好的例子:日志记录可以使用commom工厂对象,在某些情况下,此对象可以包含默认日志记录级别或日志实例的数据结构等状态。 日志记录用于多个软件模块/多个测试套件中,如果其中一个测试套件测试日志记录本身,则其他测试套件可能会在日志记录测试套件中导致随机错误结果。 数据库是“单一资源”的另一个例子。

有没有办法限制uTest测试套件的并行运行,以便用户可以决定哪些测试套件总是按顺序运行,哪些测试套件可以并行运行?

例如:运行测试套件:com.XXX.yyy.MyTestSuiteA,com.XXX.yyy.MyTestSuiteB和com.XXX.yyy.MyTestSuiteC顺序(按此顺序)和其余并行(D-Z)。

sbt“script”不是一个好的解决方案

sbt testOnly com.XXX.yyy.MyTestSuiteA
sbt testOnly com.XXX.yyy.MyTestSuiteB
sbt testOnly com.XXX.yyy.MyTestSuiteC
sbt testOnly com.XXX.yyy.MyTestSuiteD
sbt testOnly com.XXX.yyy.MyTestSuiteE
sbt testOnly com.XXX.yyy.MyTestSuiteF
...

因为没有什么是并行运行的,我必须列出所有测试套件。 这样的事情可能会很好:

sbt test -- sequentially com.XXX.yyy.MyTestSuiteA, com.XXX.yyy.MyTestSuiteB, com.XXX.yyy.MyTestSuiteC

意味着其余的可以并行运行,无论顺序如何。或

sbt test -- sequentially 

意味着所有测试套件都按顺序运行

1 个答案:

答案 0 :(得分:0)

这是一个快速修复,您可以将其添加到项目构建文件中,该文件可用于完整的顺序执行。

parallelExecution in Test := false

引用实际文档。

  

禁用并行执行测试¶   默认情况下,sbt并行运行所有任务。由于每个测试都映射到一个任务,因此默认情况下测试也会并行运行。要在给定项目中进行测试,请按顺序执行:

     

test中的scala parallelExecution:= false可以使用IntegrationTest替换测试,以仅连续执行集成测试。请注意,来自不同项目的测试可能仍会同时执行。

对于其他用例,我建议尝试标记测试并专门运行标记测试。

Tags.exclusive(Benchmark)

有关详细信息,请参阅此文档here