提问者:小点点

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


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

我有下一个套房:

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

在“文件夹”中,它有很多另一个文件夹,其中包含由该套件并行执行的测试类。

但是我需要以某种方式指定,例如,test. folder.A1。A1测试正在运行,测试ng应该等到它完成,才能运行类test.folder.b1。B1测试并选择另一个不在指定类的“禁止”列表中的类。

让我们再解释一次我想要什么。

  1. 出现空闲线程
  2. TestNG想要运行b1。其中的B1Test
  3. TestNG检查是否有a1。当前正在运行的A1测试(或禁止列表中的其他类)
  4. 如果是这样,它会推迟b1. B1Test类并搜索另一个

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

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

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


共1个答案

匿名用户

TestNG已经实现了“依赖方法”、“依赖组”选项。

但是您的要求是具有某种类级别的依赖关系。

如果您试图找到一个在测试运行时更改测试顺序的解决方案,这将不起作用。

TestNG决定了测试的具体顺序,并将其保持在整个执行过程中。如果测试轮到了,那么您可以简单地等待一些条件,但不要采取新的测试来代替当前的测试。

所以我的建议将保持这个假设。

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

看起来你已经在使用这个了。

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

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

以下是它可能看起来像的示例:

https://stackoverflow.com/a/70753897/5226491

方案2-实现自己的同步

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

你应该:

  • 确定哪个类依赖于其他类的列表
  • 跟踪所有正在运行的类
  • 解析依赖关系:检查测试方法是否属于某个必须等待其他阻塞类完成工作的类

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

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

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需要时间来实现和测试(更不用说良好的编程经验),并且选择它必须有一个非常好的理由。