<test> 在 TestNG 中为每个设置延迟时间



首先作为信息:我将每个@Test放在不同的类中(所以当然每个类只有 1 个@Test注释)。

实际上我的目标是想要使用不同的参数重新运行相同的类,但我想先运行另一个类。

我试图找到许多TestNG不允许在一个<test>中重复类或@Test方法注释的参考资料。提供的重复是一个invocationCount函数,我看到大约invocationCount,但我无法用invocationCount实现我的目标,因为这个函数同时重复一个@Test,然后我可以运行另一个@Test

public class SimpleTest1 {
@Test
@Parameters({"acc"})
public void historyTransfer(String acc) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
public class SimpleTest2 {
@Test
@Parameters({"senderAcc", "beneficiaryAcc", "amount"})
public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}

我想象像波纹管配置一样运行:

<suite name="Suite">
<test name="My Test" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="11111"></parameter>
</class>
<class name="com.SimpleTest2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</class>
<class name="com.SimpleTest1">
<parameter name="acc" value="22222"></parameter>
</class>
</classes>
</test>
</suite>

但是上述配置没有按计划进行,因为第二个SimpleTest1没有执行。

然后我尝试在单独的<test>中运行它,例如波纹管和成功,但我面临着每个<test>延迟时间的新问题。

按如下方式串行(非并行)运行多个<test>

<suite name="Suite">
<test name="My Test1" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="11111"></parameter>
</class>
</classes>
</test>
<test name="My Test2" >
<classes>
<class name="com.SimpleTest2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</class>
</classes>
</test>
<test name="My Test3" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="22222"></parameter>
</class>
</classes>
</test>
</suite>

TestNG Maven dependency:

<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>

万无一失:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>

IDE:Eclipse(版本:2018-09(4.9.0))

操作系统 :macOS 莫哈韦 (版本 10.14.6)

输出

[RemoteTestNG] detected TestNG version 7.0.0
22-12-2020 21:59:32
22-12-2020 21:59:47
22-12-2020 21:59:57
===============================================
Suite
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0
===============================================

但是在第一个<test>完成后,在下一个<test>运行以及下一个测试之前,会有大约 10 秒的延迟。

注意:我认为这是IDE的问题(我使用Eclipse),但事实并非如此。我尝试通过 IDE 和命令行以 2 种方式运行它,并就此延迟问题给出相同的结果。

通过命令行使用此命令:

mvn clean test -Dsurefire.suiteXmlFiles=testng.xml

是否有任何配置可以减少上述延迟时间?

首先,套件不是一个测试计划(顺便说一句,可能是一个很好的功能请求),而只是选择测试的一种方式。这意味着您无法定义测试之间的依赖关系。这就是为什么具有相同的测试类不起作用的原因(它应该失败或创建不同的实例)。

正如我了解您的需求,最好的方法是将您自己的逻辑及其与测试框架的集成分开:

  1. 根据需要设计辅助器/夹具类:

_

public class SimpleClass1 {
public void historyTransfer(String acc) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
public class SimpleClass2 {
public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
  1. 定义用于与测试框架集成的类

_

public class SimpleTest {
@Test
@Parameters({"acc"})
public void step1(String acc) {
(new SimpleClass1()).historyTransfer(acc);
}
@Test(dependsOnMethods = {"step1"})
@Parameters({"senderAcc", "beneficiaryAcc", "amount"})
public void step2(String senderAcc, String beneficiaryAcc, String amount) {
(new SimpleClass2()).transfer(acc);
}
@Test(dependsOnMethods = {"step2"})
@Parameters({"acc"})
public void step3(String acc) {
(new SimpleClass1()).historyTransfer(acc);
}
}

以及具有预期参数的套件:

<suite name="Suite">
<test name="My Test" >
<classes>
<class name="com.SimpleTest">
<methods>
<include name="step1">
<parameter name="acc" value="11111"></parameter>
</methods>
<methods>
<include name="step2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</methods>
<methods>
<include name="step3">
<parameter name="acc" value="22222"></parameter>
</methods>
</class>
</classes>
</test>
</suite>

(免责声明:我没有根据 dtd 检查 XML,可能是错误的,但你有想法)

命名或创建灯具的方式取决于您自己的约定。

您可以使用注释设置优先级或对其他方法的依赖关系,如下所述:

https://testng.org/doc/documentation-main.html#annotations

检查 @Test.priority 或 @Test.dependsOnMethods

这样做将允许您一个接一个地串行运行测试。

我不知道为什么您需要在单独的测试中运行相同的测试类,但是在开始测试时,它可能会加载所有相关上下文,这可能需要时间,并且可能在测试结束后可能需要关闭一些资源,两者都可能需要时间/几秒钟

您可以使用详细来使用延迟原因的更多详细信息(并添加更多日志以查看计时)

<suite name="Suite" verbose="10">

详细级别为 0 到 10,其中 10 是最详细的。 将其设置为 10 后,您将看到控制台输出将包含有关测试、方法和侦听器等的信息。

为了加快流程,您还可以使用 TestNG 的并行功能

threadPoolSize 属性允许您指定应为此执行分配多少个线程。

最新更新