我想运行一个使用MyResource
可以创建和拆除的单条资源的测试。该资源代表同一台机器上的另一个正在运行的程序,该程序通过命令行进行控制Runtime.exec
。程序必须显式启动和关闭,因此,调用MyResource.establishConnection
两次将失败。即使在 Java 程序完成后,调用失败MyResource.shutDown
也会导致应用程序打开。现在我想编写一个测试用例来检查资源在启动后是否可以使用。(启动和关闭在别处测试。)我写的测试用例是这样的:
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
s。
我可以解决这个问题吗?(这个测试类中还有其他测试由其他测试方法表示。这就是为什么我不想使用例如@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
如上所述调用了 3 次,而且tearDown
调用得太早,甚至没有设置threadPoolSize
。@AfterMethod
这与's的 javadoc 形成鲜明对比,lastTimeOnly
后者说:
如果为 true 并且刚刚运行的 @Test 方法的 invocationCount > 1,则此 AfterMethod 将仅被调用一次(在最后一次测试调用之后)。