繁体   English   中英

TestNG并行测试失败

[英]TestNG parallel tests failing

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

  • 有一个BaseTest (Singleton),其中包含一个运行@BeforeSuitesetUp()方法。 此setUp()方法将MyObject初始化为:

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

  • 所有其他测试都扩展了此BaseTest 例如说客户测试

    CustomerTest具有-

    1. 带有@BeforeClass标记的测试-它获取MyObject的存储实例。
    2. 其他测试将使用MyObject,执行一些操作并进行测试
    3. 使用@AfterClass标记的测试-确实会销毁MyObject的实例

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

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

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

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

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

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

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

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

注:我的项目使用Maven)

两件事情:

  • NullPointerException非常容易追踪,那告诉你什么? 您应该包括堆栈跟踪和代码。

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

我以前遇到过这个问题。 我能够解决此问题的唯一方法是删除设置方法上的BeforeSuite标记。 然后,每个类BeforeClass都会询问它是否已初始化,如果已初始化,请继续进行,否则,它将调用setup。 当然,您还必须将所有这些方法synchronize到同一对象。 这是我发现解决此问题的唯一方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM