如何使用 uTest 测试对象或其他单一资源/禁用并行测试

How to test objects or other single resources / disable parallel testing with uTest

https://github.com/lihaoyi/utest

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

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

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

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

日志记录是一个很好的例子:日志记录可以使用一个公共工厂对象,在某些情况下,这个对象可以包含状态,如默认日志记录级别或日志实例的数据结构等。 日志记录用于多个 SW 模块/多个测试套件,如果其中一个测试套件测试日志记录本身,那么其他测试套件可能会在日志记录测试套件中导致随机错误结果。 数据库是"single resource"的另一个例子。

有什么方法可以限制 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 

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

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

parallelExecution in Test := false

引用实际文档。

Disable Parallel Execution of Tests¶ By default, sbt runs all tasks in parallel. Because each test is mapped to a task, tests are also run in parallel by default. To make tests within a given project execute serially:

scala parallelExecution in Test := false Test can be replaced with IntegrationTest to only execute integration tests serially. Note that tests from different projects may still execute concurrently.

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

Tags.exclusive(Benchmark)

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