首先让我列出我的测试结构:
- BaseTest(Singleton) 包含一个
setUp()
运行@BeforeSuite
的方法.此 setUp() 方法初始化 MyObject,声明为:
protected static ThreadLocal<MyObject> myObject= new ThreadLocal<MyObject>();
所有其他测试都会扩展此 BaseTest。 例如说CustomerTest
这个CustomerTest有-
- 使用
@BeforeClass
进行测试标记 - 它获取 MyObject 的存储实例。 - 其他测试会使用MyObject,执行一些操作并做测试
- 使用
@AfterClass
进行测试标记 - 确实销毁 MyObject 的实例
- 使用
因此,理想情况下,此 setUp() 方法应在任何其他测试之前运行。而且它只运行一次。
我正在尝试在 TestNG 框架中并行运行测试用例。为此,我在 suite
上设置了并行属性testng.xml 的标签为
<suite name="Suite" parallel="classes" thread-count="5">
现在,在我启动构建后的几秒钟内,构建失败,所有基本测试均失败,其他测试被跳过。
失败的测试是由于java.lang.NullPointerException
我的理解是,虽然 setUp() 方法正在一个线程上运行,但不同线程上的一些其他测试正在尝试访问尚未初始化的 MyObject。失败也是如此。我的理解正确吗?
如果是,可能的解决方案是什么?
我可以做类似的事情吗 - 让正在运行 setUp() 的线程先运行,然后再不让其他线程调用。一旦对 setUp() 的调用完成/返回,则允许其他线程调用。
(注意:我的项目使用Maven)
最佳答案
两件事:
NullPointerExceptions 非常简单 追查,那是什么 告诉你?你应该包括 堆栈跟踪和代码。
@BeforeSuite 只会运行一次, 但根据你所说的,你 期望它在每次测试之前运行 方法,这意味着你应该使用 @BeforeMethod。
关于multithreading - TestNG 并行测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5638213/