设置testng中每个< test>的延迟时间

wydwbb8l  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(424)

首先作为信息:我把每个 @Test 在不同的班级(当然每个班级只有一个 @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>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.0.0</version>
    <scope>compile</scope>
</dependency>

surefire公司:

<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 mojave(版本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> 完成后,有大约10秒的延迟才能下一个 <test> 运行,以及下一次测试。
注意:我认为这是ide的问题(我使用eclipse),但事实并非如此。我试过用两种方式运行它,通过ide和命令行,对于这个延迟问题给出了相同的结果。
通过命令行使用此命令:

mvn clean test -Dsurefire.suiteXmlFiles=testng.xml

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

n3h0vuf2

n3h0vuf21#

我不知道为什么需要在不同的测试中运行同一个测试类,但是在启动测试时,它可能会加载所有相关的上下文,这可能需要时间,在测试结束后,它可能需要关闭一些资源,两者都可能需要时间/几秒钟
您可以使用verbose来使用延迟原因的更多详细信息(并添加更多日志以查看计时)

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

详细级别是0到10,其中10是最详细的。将其设置为10后,您将看到控制台输出将包含有关测试、方法和侦听器等的信息。
为了加快进程,还可以使用testng的并行特性
threadpoolsize属性允许您指定应该为此执行分配多少线程。

xurqigkl

xurqigkl2#

首先,套件不是一个测试计划(顺便说一句,可能是一个好的特性请求),而只是选择测试的一种方式。这意味着您不能定义测试之间的依赖关系。这就是为什么拥有相同的测试类不起作用(它应该失败或者创建不同的示例)。
我了解您的需求,最好的方法是分离您自己的逻辑及其与测试框架的集成:
根据需要设计助手/设备类:
_

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()));
  }
}

定义与测试框架集成的类
_

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,可能是错误的,但您有这个想法)
命名或创建装置的方式取决于您自己的约定。

oaxa6hgo

oaxa6hgo3#

您可以使用如下所述的注解设置其他方法的优先级或依赖性:
https://testng.org/doc/documentation-main.html#annotations
检查@test.priority或@test.dependsonmethods
这样做,将允许您依次运行测试。

相关问题