【发布时间】:2018-04-01 23:49:25
【问题描述】:
我正在尝试使用 testng 并行运行测试,但我的配置存在一些问题。
我有一个包含许多类文件的项目,每个类文件都包含许多测试。
我目前正在使用 parallel='methods' 标志运行测试,以最大化在给定时间运行的测试数量。
我的目标是避免同一类的测试同时运行,同时最大化并行测试的数量。
所以给出一个示例 xml 文件:
<suite>
<test parallel='methods' thread-count=40>
<classes>
<class>Class1</class>
<class>Class2</class>
</classes>
</test>
</suite>
如果有 40 个可用线程,我希望在任何给定时间运行 40 个测试。
我使用了一个方法拦截器来随机化测试顺序,并且我知道使用 eclipse 调试器可以正常工作,并且可以在每个类中控制顺序。
我的目标是这样的执行:
<Test from class1>
<Test from class2>
<Test from class1>
<Test from class2>
但是每个类都按顺序运行,它们各自的测试并行如下:
<Test from class1>
<Test from class1>
<Test from class2>
<Test from class2>
Class2 只有在 Class1 不再有任何测试要执行时才开始执行。
我尝试过 parallel='classes' 但这会为每个类提供 1 个线程。
是否可以强制执行随机顺序并保持同时运行的测试数量?
我想传递一个随机方法列表,并将执行排队以大致遵循该顺序。
我尝试将这些类分解为单独的套件和测试,但这不符合并行运行 40 个测试的目标,因为每个类中的测试方法数量和每个测试的运行时间都不同方法未知。
我的另一个想法是使用多重继承来组合类,将每个类的测试方法组合成一个类,但是java不支持多重继承,所以这不起作用。
感谢任何阅读本文或提供建议或帮助的人。
编辑:解决可能的重复问题:
另一个问题中提出的解决方案将允许我与多个线程并行运行类,但如果测试在其他测试之前完成,看起来分配给它的线程将不会被使用。
我有超过 2 个要并行化的类,如果我开始为每个测试提供线程,我想我可能会遇到问题 - 对于 10 个类,我将被限制为每个 4 个线程(总共 40 个并行)。我可能会在等待 1 个测试以完成一次运行 4 个方法时遇到 36 个空闲,这可能会抵消实施此解决方案的任何好处。
理想的解决方案应该有一个用于测试的通用线程池,例如基本的单一测试/parallel='methods' 方法。
【问题讨论】:
-
这个方法允许我用多个线程并行运行类,但是如果一个测试在其他测试之前完成,看起来分配给它的线程将不会被使用。我有超过 2 个要并行化的类,如果我开始为每个测试提供线程,我想我可能会遇到问题 - 如果有 10 个类,我每个类将被限制为 4 个线程(总共 40 个并行)。我可能会卡在等待 1 次测试以完成一次运行 4 种方法,而 36 种方法处于空闲状态。理想的解决方案是有一个用于测试的公共线程池。
标签: java multithreading unit-testing testng