以时间间隔顺序运行 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中的测试级别和常用注解执行顺序