Java自动化测试框架-08 - TestNG之并行性和超时篇 (详细教程)

一、并行性和超时

您可以指示TestNG以各种方式在单独的线程中运行测试。

可以通过在suite标签中使用 parallel 属性来让测试方法运行在不同的线程中。这个属性可以带有如下这样的值:

二、并行套件(suites)

如果您正在运行多个套件文件(例如“ java org.testng.TestNG testng1.xml testng2.xml”),并且希望每个套件在单独的线程中运行,则这个很有用。您可以使用以下命令行标志来指定线程池的大小:

java org.testng.TestNG -suitethreadpoolsize 3 testng1.xml testng2.xml testng3.xml

相应的ant任务名称为suitethreadpoolsize

三、并行测试,类和方法

在并行于标记属性可以取下列值之一:

<suite name="My suite" parallel="methods" thread-count="5">
<suite name="My suite" parallel="tests" thread-count="5">
<suite name="My suite" parallel="classes" thread-count="5">
<suite name="My suite" parallel="instances" thread-count="5">

parallel =“ methods”:TestNG将在单独的线程中运行所有测试方法。依赖方法也将在单独的线程中运行,但是它们将遵循您指定的顺序。
parallel =“ tests”:TestNG将在同一线程中的同一标记中运行所有方法,但是每个标记将位于单独的线程中。这样,您就可以将所有不是线程安全的类归入同一个中,并确保它们都将在同一线程中运行,同时利用TestNG使用尽可能多的线程来运行测试。
平行=“类”:TestNG的将运行在相同的线程相同的类的所有方法,但每个类将在单独的线程中运行。
parallel =“ instances”:TestNG将在同一线程中的同一实例中运行所有方法,但是在两个不同实例中的两个方法将在不同线程中运行。
此外,属性 thread-count允许您指定应为此执行分配多少个线程。
注意:@Test属性timeOut在并行和非并行模式下均可工作。
您还可以指定从不同的线程调用@Test方法。您可以使用属性threadPoolSize来实现以下结果:

@Test(threadPoolSize = 3, invocationCount = 10,  timeOut = 10000)
public void testServer() {

在此示例中,将从三个不同的线程调用函数testServer十次。此外,十秒的超时保证没有任何线程将永远在该线程上阻塞。

四、重新运行失败的测试

每当套件中的测试失败时,TestNG都会在输出目录中创建一个名为testng-failed.xml的文件。此XML文件包含必要的信息,以仅重新运行失败的这些方法,从而使您可以快速重现失败,而不必运行整个测试。因此,典型的会话如下所示:

java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs testng.xml
java -classpath testng.jar;%CLASSPATH% org.testng.TestNG -d test-outputs test-outputs\testng-failed.xml

请注意,testng-failed.xml将包含所有必需的依赖方法,因此可以确保您运行失败的方法而不会出现任何SKIP失败。

有时,您可能希望TestNG在测试失败时自动重试。在这种情况下,您可以使用重试分析器。当您将重试分析器绑定到测试时,TestNG会自动调用重试分析器,以确定TestNG是否可以再次重试测试用例,以查看是否刚刚通过的测试现在通过。这是使用重试分析器的方法:

  1. 构建接口org.testng.IRetryAnalyzer的实现
  2. 将此实现绑定到@Test注释,例如@Test(retryAnalyzer = LocalRetry.class)

以下是重试分析器的示例实现,该示例最多重试一次测试三次。

import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
 
/**
 * @author 北京-宏哥
 * 
 * Java自动化测试框架-08 - TestNG之 TestNG之并行性和超时篇
 *
 * 2019年11月7日
 */

public class MyRetry implements IRetryAnalyzer {
 
  private int retryCount = 0;
  private static final int maxRetryCount = 3;
 
  @Override
  public boolean retry(ITestResult result) {
    if (retryCount < maxRetryCount) {
      retryCount++;
      return true;
    }
    return false;
  }
}

 

import org.testng.Assert;
import org.testng.annotations.Test;
 
/**
 * @author 北京-宏哥
 * 
 * Java自动化测试框架-08 - TestNG之 TestNG之并行性和超时篇
 *
 * 2019年11月7日
 */

public class TestclassSample {
 
  @Test(retryAnalyzer = MyRetry.class)
  public void test2() {
    Assert.fail();
  }
}

五、JUnit测试

TestNG可以运行JUnit 3和JUnit 4测试。所有你需要做的就是把JUnit的jar文件在类路径中,在指定JUnit测试类,testng.classNames 属性和设置testng.junit属性设置为true:

<test name="Test1" junit="true">
  <classes>
    

在这种情况下,TestNG的行为类似于JUnit,这取决于在类路径上找到的JUnit版本:

  • JUnit 3:
    • 您的课程中所有以test *开头的方法都将运行
    • 如果您的测试类上有一个方法setUp(),它将在每个测试方法之前调用
    • 如果您的测试类上有一个方法tearDown(),它将在每个测试方法之后被调用
    • 如果您的测试类包含方法suite(),则将调用此方法返回的所有测试
  • JUnit 4:
    • TestNG将使用org.junit.runner.JUnitCore运行程序运行测试

 六、以编程的方式运行testng

您可以从自己的程序中轻松调用TestNG:

TestListenerAdapter tla = new TestListenerAdapter();
TestNG testng = new TestNG();
testng.setTestClasses(new Class[] { Run2.class });
testng.addListener(tla);
testng.run();

本示例创建一个TestNG对象并运行测试类Run2它还添加了一个TestListener您可以使用适配器类org.testng.TestListenerAdapter自己实现org.testng.ITestListener此接口包含各种回调方法,可让您跟踪测试的开始时间,成功时间,失败时间等。

同样,您可以在testng.xml文件上调用TestNG,也可以自己创建一个虚拟的testng.xml文件。为此,您可以使用发现包org.testng.xml的类: XmlClassXmlTest等。这些类中的每一个都对应于它们的XML标记对应物。

例如,假设您要创建以下虚拟文件:

<suite name="TmpSuite" >
  <test name="TmpTest" >
    <classes>
      <class name="test.failures.Child"  />
    <classes>
    test>
suite>

您将使用以下代码:

XmlSuite suite = new XmlSuite();
suite.setName("TmpSuite");
 
XmlTest test = new XmlTest(suite);
test.setName("TmpTest");
List classes = new ArrayList();
classes.add(new XmlClass("test.failures.Child"));
test.setXmlClasses(classes) ;

然后,您可以将此XmlSuite传递给TestNG:

List suites = new ArrayList();
suites.add(suite);
TestNG tng = new TestNG();
tng.setXmlSuites(suites);
tng.run();

有兴趣的:请参阅JavaDocs了解整个API。

七、BeanShell和高级组选择

如果testng.xml标记不足以满足您的需要,则可以使用BeanShell表达式来确定是否应在测试运行中包括某种测试方法。您可以在标记下指定此表达式

<test name="BeanShell test">
   <method-selectors>
     <method-selector>
       <script language="beanshell">
         groups.containsKey("test1")
       ]]>script>
     method-selector>
   method-selectors>
  

你可能感兴趣的:(Java自动化测试框架-08 - TestNG之并行性和超时篇 (详细教程))