【问题标题】:Set the delay time for each <test> in TestNG在 TestNG 中为每个 <test> 设置延迟时间
【发布时间】:2020-12-14 07:18:38
【问题描述】:

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

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

我试图找到许多 TestNG 不允许在一个 &lt;test&gt; 中重复类或 @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没有执行。

然后我尝试在单独的&lt;test&gt; 中运行它,就像下面这样并成功,但我面临着每个&lt;test&gt; 延迟时间的新问题。

串行(非并行)运行多个&lt;test&gt;如下:

<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>

万无一失:

<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
===============================================

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

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

通过命令行使用此命令:

mvn clean test -Dsurefire.suiteXmlFiles=testng.xml

上面有什么减少延迟时间的配置吗?

【问题讨论】:

  • 请提供更多信息。没有您对 SimpleTest 所做的一切,我们无能为力
  • 您在两个测试中都在运行什么 SimpleTest?尝试在套件中使用" verbose=”10" 以获取更多详细信息
  • @user7294900 仅包含一个 @Test 注释,代码为 System.out.println("test");,仅此而已。我的问题不清楚吗?
  • 尝试使用&lt;suite name="Suite" verbose="10"&gt; 运行,为什么你需要在两个测试中使用相同的测试类?也许延迟是每次测试都加载你的上下文
  • @Tea 我已更新问题以获取更多信息。

标签: java testng


【解决方案1】:

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

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

  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,可能是错误的,但你有这个想法)

创建固定装置的命名或方式取决于您自己的约定。

【讨论】:

【解决方案2】:

您可以使用此处描述的注释设置优先级或对其他方法的依赖:

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

检查@Test.priority 或@Test.dependsOnMethods

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

【讨论】:

  • 感谢您的回复,但这个答案还没有回答问题:)
  • 嗯,好的——你想减少测试运行之间的延迟——你已经在连续运行测试了吗?在这种情况下,请忽略上述答案...
  • 确定执行延迟是由于 TestNG 调度,而不是由于您的测试套件/用例中配置的一些先前测试设置 - 您能否提供有关您的测试用例的更多详细信息?
  • 嗨,我已经更新了问题以获取更多信息。
  • 太好了,您能否提供输出/日志 - 从那里您推断 testng 在测试运行之间暂停了 10 秒。
【解决方案3】:

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

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

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

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

为了加快这个过程,您还可以使用 TestNG 的 parallel 功能

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

【讨论】:

  • 抱歉,感谢您的回答,但我认为我应该更新问题以更好地解释我目前面临的问题。
  • 嗨,我已经更新了问题以获取更多信息。
  • @frianH 您是否添加了 verbose=10 并看到那里花费了时间?
  • 是的,已经尝试过verbose=10,每个&lt;test&gt; 都得到了相同的结果(大约10 秒) :( 登录更多详细信息。
猜你喜欢
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2012-06-09
相关资源
最近更新 更多