使用threadPoolSize运行测试> 1并且只触发一次@BeforeMethod

时间:2013-08-13 12:04:36

标签: concurrency testng

我想运行一个使用singelton资源MyResource的测试,可以创建和删除它。资源表示同一台机器上的另一个正在运行的程序,该程序通过命令行Runtime.exec进行控制。必须明确启动和关闭程序,因此,调用MyResource.establishConnection两次将失败。无法调用MyResource.shutDown将导致应用程序在Java程序完成后仍处于打开状态。现在我想编写一个测试用例,检查资源是否可以在启动后使用。 (在其他地方测试启动和关闭。)我写的测试用例如下所示:

private MyResource myResource;

@BeforeMethod(firstTimeOnly = true)
public void setUp() throws Exception {
    myResource = new MyResource();
    myResource.establishConnection();
}

@AfterMethod(lastTimeOnly = true)
public void tearDown() throws Exception {
    myResource.shutDown();
}

@Test(invocationCount = 30, threadPoolSize = 5)
public void testMethod() throws Exception {
    myResource.use():
}

此测试的目的之一是检查资源(MyResource)在并发访问时是否表现良好。但是,我现在观察到用@BeforeMethod注释的方法被调用三次 - 每个线程一次 - 而不是一次。 firstTimeOnly似乎不适用于积极的threadPoolSize

我能解决这个问题吗? (此测试类中还有其他测试由其他测试方法表示。这就是为什么我宁愿不使用例如@BeforeTest,以便在方法之间重新启动应用程序。)

感谢您的帮助。

更新:更多谜团。此代码段

@BeforeMethod(firstTimeOnly = true)
public void setUp() throws Exception {
    LOGGER.info("Set up");
}

@AfterMethod(lastTimeOnly = true)
public void tearDown() throws Exception {
    LOGGER.info("Tear down");
}

@Test(invocationCount = 10)
public void testName() throws Exception {
    LOGGER.info("Running test");
}

将打印:

  

设置

     

运行测试

     

撕下

     

运行测试

     

运行测试

     

运行测试

     

运行测试

     

运行测试

     

运行测试

     

运行测试

     

运行测试

     

运行测试

因此,setUp不仅如上所述被调用了三次,即使没有设置tearDown,也会过早地调用threadPoolSize。这与@AfterMethod的{​​{1}}的javadoc形成鲜明对比,后者说:

  

如果为true且刚刚运行的@Test方法有一个invocationCount>   1,这个AfterMethod只会被调用一次(在最后一次测试调用之后)。

1 个答案:

答案 0 :(得分:0)

今天查看源代码后,我认为这是一个错误。我刚刚在Git Hub上提出了修复方法。 (https://github.com/cbeust/testng/pull/433