Concurrency 使用threadPoolSize运行测试>;1并仅触发一次@BeforeMethod
我想运行一个使用Singleton资源Concurrency 使用threadPoolSize运行测试>;1并仅触发一次@BeforeMethod,concurrency,testng,Concurrency,Testng,我想运行一个使用Singleton资源MyResource的测试,该资源可以被创建和删除。该资源表示同一台计算机上的另一个正在运行的程序,该程序通过命令行Runtime.exec进行控制。程序必须显式启动和关闭,因此,调用两次MyResource.establishConnection将失败。无法调用MyResource.shutDown将导致应用程序即使在Java程序完成后仍处于打开状态。现在我想编写一个测试用例,检查资源启动后是否可以使用。(启动和关闭在别处进行测试。)我编写的测试用例如下所
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
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
,tearDown
调用得太早,即使没有设置threadPoolSize
。这与@AfterMethod
的lastTimeOnly
的javadoc形成了直接对比,后者说:
如果为true,并且刚刚运行的@Test方法具有调用计数>
1,此AfterMethod将只调用一次(在上次测试调用之后)
今天看了源代码之后,我认为这是一个bug。我刚刚建议在Git Hub上对其进行修复。()这篇文章我已经读了好几遍了,但我还是不明白你的最终目标。是否希望在每次调用之前运行安装程序?或者只在测试运行之前运行一次?我基本上希望在所有调用
runName
之前运行一次setup
,之后运行一次tearDown
。如果该类中只有一个测试,您可以使用@BeforeClass
和@AfterClass
,我不想使用BeforeClass或AfterClass,因为我在实际的测试用例中有几个方法。我希望为每个方法调用setUp
和tearDown
,但不是为同一方法的单独调用调用,而是仅在第一次调用特定方法之前和最后一次调用之后调用。Hm。我看无论如何都做不到这一点(特别是因为你写它的方式看起来应该行得通)。您有最新版本的TestNG(6.8.1)吗?