TestNG并行测试失败

时间:2011-04-12 15:59:26

标签: multithreading unit-testing testing maven testng

首先让我推出测试结构:

  • BaseTest (Singleton)包含运行setUp()的{​​{1}}方法。此setUp()方法初始化 MyObject ,声明为:

@BeforeSuite

  • 所有其他测试都扩展了 BaseTest 。 例如说 CustomerTest

    CustomerTest 有 -

    1. 使用protected static ThreadLocal<MyObject> myObject= new ThreadLocal<MyObject>();标记的测试 - 它获取存储的MyObject实例。
    2. 其他测试将使用MyObject,执行一些操作并进行测试
    3. 使用@BeforeClass标记的测试 - 确实会破坏MyObject的实例

理想情况下,此setUp()方法应在任何其他测试之前运行。它只运行

我试图在TestNG框架中并行运行测试用例。为此,我将testng.xml的@AfterClass标签上的parallel属性设置为

suite

现在,在我触发构建后的几秒钟内,构建失败,所有基本测试失败,其他测试失败。

测试失败归因于<suite name="Suite" parallel="classes" thread-count="5">

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

如果是,那么可能的解决办法是什么?

我可以执行类似的操作 - 让线程首先运行setUp(),然后不要让其他线程调用。一旦调用setUp()完成/返回,则允许其他线程调用。

注意:我的项目使用Maven)

2 个答案:

答案 0 :(得分:1)

两件事:

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

  • @BeforeSuite只会运行一次, 但根据你所说的,你 期望它在每次测试之前运行 方法,这意味着你应该使用 @BeforeMethod。

答案 1 :(得分:0)

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