Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TestNG:在并行线程中运行类安全吗?_Java_Multithreading_Thread Safety_Testng - Fatal编程技术网

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

Java TestNG:在并行线程中运行类安全吗?,java,multithreading,thread-safety,testng,Java,Multithreading,Thread Safety,Testng,当我并行运行测试类时,失败测试的数量比我运行序列化的测试类时要多。出于调试目的,我在控制台上记录了很多日志,但在并行运行时几乎没有用,因为记录的所有内容都是混乱/无序的 在我尝试修复日志问题以便更好地调试之前,我想知道,如果我设置了parallel=“classes”,它能保证线程安全吗?我假设如果我设置parallel=“tests”两个方法可以尝试访问作用域中的同一对象,从而导致线程安全问题 即: 来自TestNG文档: 标记上的parallel属性可以采用以下值之一:

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

在我尝试修复日志问题以便更好地调试之前,我想知道,如果我设置了
parallel=“classes”
,它能保证线程安全吗?我假设如果我设置
parallel=“tests”
两个方法可以尝试访问作用域中的同一对象,从而导致线程安全问题

即:


来自TestNG文档:

标记上的parallel属性可以采用以下值之一:





  • parallel=“methods”
    :TestNG将在单独的线程中运行所有测试方法。依赖方法也将在单独的线程中运行,但它们将遵守您指定的顺序

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

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

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

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

来自TestNG文档:

标记上的parallel属性可以采用以下值之一:





  • parallel=“methods”
    :TestNG将在单独的线程中运行所有测试方法。依赖方法也将在单独的线程中运行,但它们将遵守您指定的顺序

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

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

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


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

如果确实如此,那么您的单元测试就不是单元测试;单元测试应该独立运行。你有没有一个测试在“并行”运行时失败的例子?这些不是单元测试,而是实际的功能/回归运行。我发现了,是静态变量导致了问题。需要替换/重构它们。@Greg你能解释一下吗?我的测试也遇到了同样的问题。你在谈论哪些静态变量?如果确实如此,那么你的单元测试就不是单元测试;单元测试应该独立运行。你有没有一个测试在“并行”运行时失败的例子?这些不是单元测试,而是实际的功能/回归运行。我发现了,是静态变量导致了问题。需要替换/重构它们。@Greg你能解释一下吗?我的测试也遇到了同样的问题。你说的是哪些静态变量?是的,我指的是上面提到的方法,而不是测试。“tests”标签非常混乱,我必须不断提醒自己从测试套件文件中查看它,而不是实际解释的名称。是的,我指的是上面的方法,而不是测试。“tests”标记非常混乱,我不得不不断提醒自己从测试套件文件中查看它,而不是实际解释的名称。
<suite name="test" parallel="classes" thread-count="3">