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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/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
Multithreading TestNG并行测试失败_Multithreading_Unit Testing_Testing_Maven_Testng - Fatal编程技术网

Multithreading TestNG并行测试失败

Multithreading TestNG并行测试失败,multithreading,unit-testing,testing,maven,testng,Multithreading,Unit Testing,Testing,Maven,Testng,首先让我介绍一下我的测试结构: 有一个BaseTest(Singleton)包含一个setUp()方法,它运行@BeforeSuite。此setUp()方法初始化MyObject,该对象声明为: protected static ThreadLocal myObject=new ThreadLocal() 所有其他测试都扩展了此BaseTest。 e、 g.说客户测试 这个顾客有- 带有@BeforeClass标记的测试-它获取MyObject的存储实例 其他测试将使用MyObject,执

首先让我介绍一下我的测试结构:

  • 有一个BaseTest(Singleton)包含一个
    setUp()
    方法,它运行
    @BeforeSuite
    。此setUp()方法初始化MyObject,该对象声明为:
protected static ThreadLocal myObject=new ThreadLocal()

  • 所有其他测试都扩展了此BaseTest。 e、 g.说客户测试

    这个顾客有-

  • 带有
    @BeforeClass
    标记的测试-它获取MyObject的存储实例
  • 其他测试将使用MyObject,执行一些操作并执行测试
  • 带有
    @AfterClass
    标记的测试-不会破坏MyObject的实例
因此,理想情况下,这个setUp()方法应该在任何其他测试之前运行。而且它只运行一次

我试图在TestNG框架中并行运行测试用例。为了实现这一点,我将testng.xml的
suite
标记上的parallel属性设置为

现在,在我启动构建后的几秒钟内,构建失败,所有基本测试都失败,其他测试被跳过

测试失败是由于
java.lang.NullPointerException

我的理解是,当setUp()方法在线程上运行时,不同线程上的一些其他测试正在尝试访问尚未初始化的MyObject。失败也是如此。我的理解正确吗

如果是,可能的解决方案是什么

我可以这样做吗?让线程先在运行setUp()的地方运行,然后再让其他线程调用。一旦对setUp()的调用完成/返回,则允许其他线程调用

注意:我的项目使用Maven)

两件事:

  • NullPointerException非常简单 要追查,那是什么 告诉你?你应该包括 堆栈跟踪和代码

  • @BeforeSuite将只运行一次, 但是根据你说的,你 希望它在每次测试之前运行 方法,这意味着您应该使用 @之前的方法

    • 两件事:

      • NullPointerException非常简单 要追查,那是什么 告诉你?你应该包括 堆栈跟踪和代码

      • @BeforeSuite将只运行一次, 但是根据你说的,你 希望它在每次测试之前运行 方法,这意味着您应该使用 @之前的方法


      我以前遇到过这个问题。我能够克服这个问题的唯一方法是删除setup方法上的
      BeforeSuite
      标记。然后,类之前的每个类将询问它是否已初始化,如果已初始化,请继续,否则,它将调用setup。当然,您还必须将所有这些方法同步到同一个对象。
      这是我找到的解决这个问题的唯一方法。

      我以前遇到过这个问题。我能够克服这个问题的唯一方法是删除setup方法上的
      BeforeSuite
      标记。然后,类之前的每个类将询问它是否已初始化,如果已初始化,请继续,否则,它将调用setup。当然,您还必须将所有这些方法同步到同一个对象。 这是我找到的解决这个问题的唯一方法。

      1)关于NullPointerException,我跟踪了它们,它们正引导我得出相同的结论。他们没有得到MyObject的实例2)否。它应该只运行一次。更新了问题以确保不再出现混淆。1)关于NullPointerExceptions,我进行了跟踪,他们正引导我得出相同的结论。他们没有得到MyObject的实例2)否。它应该只运行一次。更新问题以确保不再出现混淆。