如何使用 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。
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。