2

我想运行一个使用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似乎不适用于积极的threadPoolSizes。

我可以解决这个问题吗?(这个测试类中还有其他测试由其他测试方法表示。这就是为什么我不想使用例如@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 将仅被调用一次(在最后一次测试调用之后)。

4

1 回答 1

0

今天看了源码,觉得这是个bug。我刚刚在 Git Hub 上提出了一个修复方案。( https://github.com/cbeust/testng/pull/433 )

于 2013-08-16T13:17:43.503 回答