2011-04-12 66 views
1

首先让我拿出我的测试结构:TestNG的平行试验失败

  • BaseTest含有运行@BeforeSuite一个setUp()方法(单身)。此设置()方法初始化为MyObject其被声明为:

protected static ThreadLocal<MyObject> myObject= new ThreadLocal<MyObject>();

  • 所有其他的测试扩展这个BaseTest。 例如说CustomerTest

    CustomerTest有 -

    1. @BeforeClass标签的测试 - 它得到的MyObject的存储的实例。
    2. 其他测试将使用MyObject的,执行某些操作并做测试
    3. @AfterClass标签的测试 - 不破坏为MyObject

实例因此理想情况下,这种设置()方法应该运行在任何其他测试之前。它只运行一次

我想在TestNG框架中并行运行测试用例。为了实现这一目标,我已经设置的testng.xml的suite标签并行属性作为

现在

<suite name="Suite" parallel="classes" thread-count="5">

,在几秒钟内后,我火构建,构建得到失败,所有的基本测试失败,其他被跳过。

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

我的理解是,在安装程序()方法被一个线程中运行,在不同的线程一些其他的测试正在试图访问还未被初始化为MyObject。失败也是如此。我的理解是否正确?

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

我可以做些什么 - 让线程先运行setUp(),然后不要让其他线程调用。一旦对setUp()的调用完成/返回,则允许其他线程调用。

注:我的项目使用Maven的)

回答

1

两件事情:

  • NullPointerException异常是很容易 追查,这是什么一个 告诉你吗?您应该包含 堆栈跟踪和代码。

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

+0

1)关于NullPointerExceptions - 我跟踪了他们,并指示我得出相同的结论。他们没有得到MyObject的实例 2)不可以。它只能运行一次。更新了问题以确保不再有混淆。 – 2011-04-12 18:07:41

0

我以前遇到过这个问题。我能够解决这个问题的唯一方法是在安装方法上删除BeforeSuite标签。然后每个类BeforeClass会询问它是否被初始化,如果是,继续前进,否则它会调用setup。当然你也必须将所有这些方法都用synchronize来同一个对象。 这是我发现解决这个问题的唯一方法。