首先让我推出测试结构:
setUp()
的{{1}}方法。此setUp()方法初始化 MyObject ,声明为: @BeforeSuite
所有其他测试都扩展了 BaseTest 。 例如说 CustomerTest
此 CustomerTest 有 -
protected static ThreadLocal<MyObject> myObject= new ThreadLocal<MyObject>();
标记的测试 - 它获取存储的MyObject实例。 @BeforeClass
标记的测试 - 确实会破坏MyObject的实例理想情况下,此setUp()方法应在任何其他测试之前运行。它只运行 。
我试图在TestNG框架中并行运行测试用例。为此,我将testng.xml的@AfterClass
标签上的parallel属性设置为
suite
现在,在我触发构建后的几秒钟内,构建失败,所有基本测试失败,其他测试失败。
测试失败归因于<suite name="Suite" parallel="classes" thread-count="5">
我的理解是,当setUp()方法在一个线程上运行时,不同线程上的一些其他测试试图访问尚未初始化的MyObject。失败也是如此。我的理解是否正确?
如果是,那么可能的解决办法是什么?
我可以执行类似的操作 - 让线程首先运行setUp(),然后不要让其他线程调用。一旦调用setUp()完成/返回,则允许其他线程调用。
(注意:我的项目使用Maven)
答案 0 :(得分:1)
两件事:
NullPointerExceptions非常简单 追踪,那是什么 告诉你?你应该包括 堆栈跟踪和代码。
@BeforeSuite只会运行一次, 但根据你所说的,你 期望它在每次测试之前运行 方法,这意味着你应该使用 @BeforeMethod。
答案 1 :(得分:0)
之前我遇到过这个问题。我能够克服该问题的唯一方法是删除setup方法上的BeforeSuite
标记。然后每个类BeforeClass
会询问它是否已初始化,如果是,则继续,否则,它将调用setup。当然,您还需要synchronize
所有这些方法来同一个对象。
这是我找到解决这个问题的唯一方法。