禁止 TestNG 同时执行特定测试 类

Forbid TestNG to execute specific test classes in same time

如果当前正在执行来自另一个特定 class 的测试,是否有任何好的解决方案来防止 testng 运行 测试来自特定 class 的测试?

我有下套房:

<suite name="Name" parallel="classes" thread-count="5">
   <test name="TestName">
      <packages>
         <package name="test.folder.*" />
      </packages>
   </test>
</suite>

在“文件夹”中,它有很多其他文件夹,其中包含测试 classes,它们由该套件并行执行。

但我需要以某种方式指定,例如,如果 test.folder.a1.A1Tests 是 运行ning,测试 ng 应该等到它完成,到 运行 class test.folder.b1.B1测试并选择不在指定 class.

的 'ban' 列表中的另一个 class

让我们再解释一次我想要的。

  1. 空闲线程出现
  2. TestNG 想要 运行 b1.B1Tests 在里面
  3. TestNG 检查当前是否有 a1.A1Tests 运行ning(或来自禁止列表的另一个 classes)
  4. 如果是,它推迟 b1.B1Tests class 并搜索另一个

关键是我有测试,它们相互影响,我想保存并行性但不想同时执行它们。

我目前找到的唯一方法是,在当前套件中再添加一个测试,在单线程中执行所有受影响的测试,然后以与现在相同的方式执行另一个测试。

但我希望你有更漂亮的解决方案。

TestNG 已经实现了“dependsOnMethods”、“dependsOnGroups”选项。

但是你的要求是有某种class级别的依赖。

如果您试图找到一个解决方案,在测试 运行ning 时改变测试的顺序,这是行不通的。

TestNG 确定测试的特定顺序并将其保留在整个执行过程中。如果轮到考试,那么你可以简单地等待一些条件,但不要用新的考试来代替当前的考试。

所以我的建议会保留这个假设。

选项 1 - 使用单独的 testng xml 配置

看起来你已经在使用它了。

将所有不能 运行 安全并行的测试移动到具有非并行配置的单独 testng xml 并保持其他测试 运行 并行和然后将它们合并成一个 xml 到 运行 是一个易于实施和维护的通用解决方案。

在大多数情况下,与其他现有替代方案相比,它已经足够好了,因为它简单明了。

下面是它的外观示例:

选项 2 - 实现您自己的同步

正如我提到的,没有现成的选项。

你应该:

  • 确定哪个 class 取决于其他 classes
  • 的列表
  • 跟踪所有 运行ning classes
  • 解决依赖关系:检查测试方法是否属于某些 class 必须等待其他阻塞 classes 完成它们的工作

您必须通过所有必要的同步来实现它,以确保它不会导致问题、死锁等。

您可以从实现一个 ITestListener 开始,它会在测试开始时将所有 运行ning 测试 class 添加到线程安全集合中,并在测试完成时将其删除。

https://www.javadoc.io/doc/org.testng/testng/7.4.0/org/testng/ITestListener.html

https://www.javadoc.io/doc/org.testng/testng/7.4.0/org/testng/ITestResult.html#getTestClass--

我认为选项 2 需要时间来实施和测试(更不用说良好的编程经验)并且选择它必须有一个非常好的理由。