以时间间隔顺序运行 TestNG 测试

Posted

技术标签:

【中文标题】以时间间隔顺序运行 TestNG 测试【英文标题】:Running TestNG test sequentially with time-gap 【发布时间】:2012-05-22 01:25:38 【问题描述】:

我有几个 DAO 单元测试类,我想使用 TestNG 一起运行,但是 TestNG 尝试并行运行它们,这会导致一些回滚失败。虽然我想按顺序运行我的单元测试类,但我还希望能够指定 TestNG 在运行下一个测试之前必须等待的最小时间。这是可以实现的吗?

附:我知道可以告诉 TestNG 在 SingleThread 的测试类中运行所有测试,无论如何我都可以使用组指定方法调用的顺序,所以这也许不是问题。

【问题讨论】:

【参考方案1】:

两次测试之间的hard dependency 怎么样?如果你这样写:

@Test
public void test1()  ... 

@Test(dependsOnMethods = "test1", alwaysRun = true)
public void test2()  ... 

那么 test2 将始终在 test1 之后运行。

不要忘记alwaysRun = true,否则如果test1失败,test2会被跳过!

【讨论】:

嗨 Romaintaz,谢谢,但正如我提到的,问题不在于测试类中的测试之间的依赖关系(我已经为此使用过 dependsOnGroups),问题在于运行多个测试类,一个之后另一个(如在测试套件中)。【参考方案2】:

    如果您不想并行运行类,则需要将套件的并行属性指定为 false。默认情况下,它是错误的。所以我认为它应该默认按顺序运行,除非你在调用测试的方式上有一些变化。

    为了在类之间添加一点延迟,您可以在使用 @AfterClass 注释的方法中添加延迟逻辑。 AFAIK testng 没有办法在 testng xml 或命令行中指定它。有一个 timeout 属性,但更多的是用于超时测试,可能不是您想要的。

要在测试之间添加延迟,即 xml 中的测试标签,那么您可以尝试实现 ITestListener - onFinish 方法,您可以在其中添加延迟代码。它在每个<test> 之后运行。如果在每个测试用例之后都需要延迟,则在 IInvokedMethodListener - AfterInvocation() 中实现延迟代码,该代码在每个测试方法运行后运行。然后,您需要在调用套件时指定侦听器。

希望对你有帮助..

【讨论】:

【参考方案3】:

以下是我在一些测试中使用的。

首先,像这样定义实用方法:

// make thread sleep a while, so that reduce effect to subsequence operation if any shared resource,
private void delay(long milliseconds) throws InterruptedException 
    Thread.sleep(milliseconds);


private void delay() throws InterruptedException 
    delay(500);

然后,在测试方法中调用方法,在结尾或开头。

例如

@Test
public void testCopyViaTransfer() throws IOException, InterruptedException 
    copyViaTransfer(new File(sourcePath), new File(targetPath));
    delay();
 

【讨论】:

以上是关于以时间间隔顺序运行 TestNG 测试的主要内容,如果未能解决你的问题,请参考以下文章

TestNG基础教程 - TestNG.xml中的测试级别和常用注解执行顺序

TestNG依赖测试

TestNG中测试的执行顺序

TestNG 执行顺序 - 它混合了来自不同类的测试

TestNG中Appium测试用例的顺序执行导致测试用例失败

TestNG执行测试用例的顺序