我想运行一个使用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只会被调用一次(在最后一次测试调用之后)。
答案 0 :(得分:0)
今天查看源代码后,我认为这是一个错误。我刚刚在Git Hub上提出了修复方法。 (https://github.com/cbeust/testng/pull/433)