Concurrency 使用threadPoolSize运行测试>;1并仅触发一次@BeforeMethod

Concurrency 使用threadPoolSize运行测试>;1并仅触发一次@BeforeMethod,concurrency,testng,Concurrency,Testng,我想运行一个使用Singleton资源MyResource的测试,该资源可以被创建和删除。该资源表示同一台计算机上的另一个正在运行的程序,该程序通过命令行Runtime.exec进行控制。程序必须显式启动和关闭,因此,调用两次MyResource.establishConnection将失败。无法调用MyResource.shutDown将导致应用程序即使在Java程序完成后仍处于打开状态。现在我想编写一个测试用例,检查资源启动后是否可以使用。(启动和关闭在别处进行测试。)我编写的测试用例如下所

我想运行一个使用Singleton资源
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)吗?