TestNG:并行线程运行类安全吗?

Gre*_*reg 1 java testng multithreading thread-safety

当我并行运行测试类时,失败的测试数量比运行串行测试类时要高。为了调试目的,我在控制台上记录了很多内容,但在并行运行时几乎没有用,因为记录的所有内容都是混乱/无序的。

在我尝试修复日志记录问题以便更好地调试之前,我想知道,如果我设置了parallel="classes",它是否能保证线程安全?我假设如果我设置parallel="tests"两个方法可能会尝试访问范围内的同一对象,从而导致线程安全问题。

IE:

<suite name="test" parallel="classes" thread-count="3">
Run Code Online (Sandbox Code Playgroud)

mfu*_*n26 5

来自 TestNG 文档5.10.2 - 并行测试、类和方法

标签上的并行属性可以采用以下值之一:

<suite name="My suite" parallel="methods" thread-count="5">
Run Code Online (Sandbox Code Playgroud)
<suite name="My suite" parallel="tests" thread-count="5">
Run Code Online (Sandbox Code Playgroud)
<suite name="My suite" parallel="classes" thread-count="5">
Run Code Online (Sandbox Code Playgroud)
<suite name="My suite" parallel="instances" thread-count="5">
Run Code Online (Sandbox Code Playgroud)
  • parallel="methods":TestNG 将在单独的线程中运行所有测试方法。依赖方法也将在单独的线程中运行,但它们将遵循您指定的顺序。

  • parallel="tests":TestNG将在同一线程中运行同一标签中的所有方法,但每个标签将在单独的线程中。这允许您将所有非线程安全的类分组在一起,并保证它们都在同一个线程中运行,同时利用 TestNG 使用尽可能多的线程来运行测试。

  • parallel="classes":TestNG将在同一个线程中运行同一个类中的所有方法,但每个类将在单独的线程中运行。

  • parallel="instances":TestNG将在同一线程中运行同一实例中的所有方法,但两个不同实例上的两个方法将在不同线程中运行。

因此,如果“线程安全”意味着不会有超过一个 TestNG 线程与任何给定的测试类实例交互,那么是的,使用“类”将得到你想要的。但是,“tests”并不在其自己的线程中运行每个测试方法,而是<test>在 testng.xml 中运行每个标记。上面的描述应该有帮助。