testng2 testng.xml

参考:

https://www.cnblogs.com/meitian/p/5221202.html
https://testerhome.com/topics/10093?locale=en
说明:本文部分内容来源于网络,侵删

3. testng.xml

你可以通过以下几种方式调用testng.xml

1. 用testng.xml文件
2. ant
3. 命令行

本节描述了testng.xml的格式(您将在ant和下面的命令行中找到文档)。

下面是一个testng.xml文件的简单样例:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
  
<suite name="Suite1" verbose="1" >
  <test name="Nopackage" >
    <classes>
       <class name="NoPackageTest" />
    </classes>
  </test>
 
  <test name="Regression1">
    <classes>
      <class name="test.sample.ParameterSample"/>
      <class name="test.sample.ParameterTest"/>
    </classes>
  </test>
</suite>

您可以指定包名称而不是类名称:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
 
<suite name="Suite1" verbose="1" >
  <test name="Regression1"   >
    <packages>
      <package name="test.sample" />
   </packages>
 </test>
</suite>

在此示例中,TestNG将查看包test.sample中的所有类,并将仅保留具有TestNG批注的类。

您还可以指定要包括和排除的组和方法:

<test name="Regression1">
  <groups>
    <run>
      <exclude name="brokenTests"  />
      <include name="checkinTests"  />
    </run>
  </groups>
  
  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod" />
      </methods>
    </class>
  </classes>
</test>

您还可以在testng.xml内定义新组,并在属性中指定其他详细信息,例如是否并行运行测试,使用多少线程,是否正在运行JUnit测试等。

默认情况下,TestNG将按照在XML文件中找到的顺序运行测试。如果要以不可预测的顺序运行此文件中列出的类和方法,请将preserve-order属性设置为false:

<test name="Regression1" preserve-order="false">
  <classes>
 
    <class name="test.Test1">
      <methods>
        <include name="m1" />
        <include name="m2" />
      </methods>
    </class>
 
    <class name="test.Test2" />
 
  </classes>
</test>


到此结束

以下是拓展学习内容


testng.xml详细样例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!--suite(测试套件)为根路径,仅允许出现1次,是多个test(测试用例)的集合,以下为各属性含义及取值
    @name 必填,标记suite的名称
    @junit 选填,是否以junit模式运行,可选值(true|false) 默认值"false"
    @verbose 选填,命令行信息打印等级(与测报内容无关),可在测试代码注释中配置,可选值(1|2|3|4|5)
    @parallel 选填,是否多线程并发运行测试,可选值(false | methods | tests | classes | instances),默认 "false"
    @thread-count 选填,填写值为正整数,当为并发执行时的线程池数量,默认为"5"
    @configfailurepolicy 一旦Before/After Class/Methods这些方法失败后,是继续执行测试还是跳过测试;可选值 (skip | continue),默认"skip
    @annotations="javadoc" 获取注解的位置,如果为"javadoc", 则使用javadoc注解,否则使用jdk注解
    @time-out 为具体执行单元设定一个超时时间,具体参照parallel的执行单元设置;单位为毫秒
    @skipfailedinvocationcounts 是否跳过失败的调用,可选值(true | false),默认"false"
    @data-provider-thread-count 并发执行时data-provider的线程池数量,默认为"10"
    @object-factory 一个实现IObjectFactory接口的类,用来实例测试对象
    @allow-return-values="true" 是否允许返回函数值,可选值(true | false),默认"false"
    @preserve-order:顺序执行开关,可选值(true | false) "true"
    @group-by-instances:是否按实例分组,可选值(true | false) "false"
    @guice-stage 支持使用JSR-330的​@Inject注解​来配置运行时提供的实例
    @parent-module 和Guice框架有关,只运行一次,创建一个parent injector给所有guice injectors
    -->
<suite name="suitename" junit="false" verbose="3" parallel="false" thread-count="5" configfailurepolicy="skip"
       annotations="javadoc" time-out="10000" skipfailedinvocationcounts="true" data-provider-thread-count="5"
       object-factory="classname" allow-return-values="true" preserve-order="true" group-by-instances="false">

    <!--可以执行多个suite,@path 必填,欲引用的suitefile的绝对路径-->
    <suite-files>
        <suite-file path="/path/to/suitefile1"></suite-file>
    </suite-files>
    <!--全局参数,@name和@value必填,分别为参数名和参数值-->
    <parameter name="par1" value="value1"></parameter>
    <parameter name="par2" value="value2"></parameter>

    <!--方法选择器,在suite/test中增加需要额外执行的类(根据父标签而定),及安排执行优先级-->
    <method-selectors>
        <method-selector>
            <!--
                @name 必填
                @priority 选填
                -->
            <selector-class name="classname" priority="1"></selector-class>
            <!--
                @language 必填
                -->
            <script language="java"></script>
        </method-selector>
    </method-selectors>

    <!--test定义一次测试执行,以下为各属性含义及取值
        @name:必填,test的名字,测试报告中会有体现
        @junit:选填,是否以Junit模式运行,可选值(true | false),默认"false"
        @verbose:选填,命令行信息打印等级,不会影响测试报告输出内容;可选值(1|2|3|4|5)
        @parallel:选填,是否多线程并发运行测试;可选值(false | methods | tests | classes | instances),默认 "false"
        @thread-count:选填,当为并发执行时的线程池数量,默认为"5"
        @annotations:选填,获取注解的位置,如果为"javadoc", 则使用javadoc注解,否则使用jdk5注解
        @time-out:选填,为具体执行单元设定一个超时时间,具体参照parallel的执行单元设置;单位为毫秒
        @enabled:选填,设置当前test是否生效,可选值(true | false),默认"true"
        @skipfailedinvocationcounts:选填,是否跳过失败的调用,可选值(true | false),默认"false"
        @preserve-order:选填,顺序执行开关,可选值(true | false) "true"
        @group-by-instances:选填,是否按实例分组,可选值(true | false) "false"
        @allow-return-values:选填,是否允许返回函数值,可选值(true | false),默认"false"
        -->
    <test name="testename" junit="false" verbose="3" parallel="false" thread-count="5" annotations="javadoc"
          time-out="10000" enabled="true" skipfailedinvocationcounts="true" preserve-order="true"
          allow-return-values="true">
        <!--局部参数,@name和@value必填,分别为参数名和参数值,如果参数名与全局参数一致,则覆盖全局参数取值-->
        <parameter name="par1" value="value1"></parameter>
        <parameter name="par2" value="value2"></parameter>
        <!--搭配class使用,执行class内指定组-->
        <groups>
            <!--定义执行组名,在run中使用
                @name 必填,组中组的名称
            -->
            <define name="xxx">
                <!--定义包含的测试组,测试方法属于哪个测试组在测试代码注释中定义。
                    @name 必填,需要包含进组中组的组名
                    @description 选填,关于组的描述
                    @invocation-numbers 选填,执行次序或者执行次数——TODO
                    -->
                <include name="" description="" invocation-numbers=""/>
                <include name="" description="" invocation-numbers=""/>
            </define>
            <!--运行组中组的配置-->
            <run>
                <!--执行指定的组中组,@name必填,与define name一致-->
                <include name=""/>
                <!--排除指定的组中组,@name必填,与define name一致-->
                <exclude name=""/>
            </run>
            <!--组中组的依赖配置-->
            <dependencies>
                <!--配置依赖
                    @name 必填,需要依赖其他组的组名,define中设置
                    @depends-on 必填,被依赖的组名,define中设置,可以有多个,用空格隔开
                    -->
                <group name="" depends-on=""></group>
                <group name="" depends-on=""></group>
            </dependencies>
        </groups>
        <!--配置要执行的类,是多个class的集合-->
        <classes>
            <!--局部参数,@name和@value必填,分别为参数名和参数值,如果参数名与全局参数和父标签的局部参数一致,则覆盖全局参数和父标签的局部参数取值-->
            <parameter name="par1" value="value1"></parameter>
            <parameter name="par2" value="value2"></parameter>
            <!--多个methods的集合,@name 必填,对应class的名称,如com.example.autotest.testcase-->
            <class name="classname">
                <!--要执行的方法,如为空,则执行整个class内包含的全部方法-->
                <methods>
                    <!--局部参数,@name和@value必填,分别为参数名和参数值,如果参数名与全局参数和父标签的局部参数一致,则覆盖全局参数和父标签的局部参数取值-->
                    <parameter name="par3" value="value3"></parameter>
                    <!--类内要执行的测试方法名,在测试代码注释中配置,如设置inclde,则只执行该方法,其他跳过
                        @name 必填,执行方法名
                        @description 选填,方法描述
                        @invocation-number 选填,宣发执行顺序或执行次数——TODO
                        -->
                    <include name="" description="" invocation-numbers=""></include>
                    <!--除了该方法外,类内其他方法都执行,@name 必填,不执行的方法名-->
                    <exclude name=""></exclude>
                </methods>
                <methods></methods>
            </class>
        </classes>
        <!--可以执行指定包下面所有类,是多个package的汇聚-->
        <packages>
            <!--配置要执行的包,@name 必填,要执行的package名,如com.example.autotest-->
            <package name="">
                <!--包内要执行的测试方法名,在测试代码注释中配置,如设置inclde,则只执行该方法,其他跳过
                    @name 必填,执行方法名
                    @description 选填,方法描述
                    @invocation-number 选填,宣发执行顺序或执行次数——TODO
                    -->
                <include name="" description="" invocation-numbers=""></include>
                <!--除了该方法外,包内其他方法都执行,name 必填,不执行的方法名-->
                <exclude name=""></exclude>
            </package>
        </packages>
    </test>
    <!--设置监听的类名,可设置多个,class-name 必填,类名,如com.example.autotest.Listener-->
    <listeners>
        <listener class-name="classname1"/>
        <listener class-name="classname2"/>
    </listeners>
</suite>

标签详细介绍

1. suite
  1. 一个xml文件只能由一个标签,是xml文件的根标签
  2. suite由test和parameters组成

在这里插入图片描述

说明
parallel
    该参数的值false,methods,tests,classes,instances。默认false
    parallel必须和thread-count配套使用,否则相当于无效参数,thread-count决定了并行测试时开启的线程数量
    parallel="mehods"  TestNG将并行执行所有的测试方法在不同的线程里
    parallel="tests"  TestNG将并行执行在同一个<test>下的所有方法在不同线程里
    parallel="classes"  TestNG将并行执行在相同<class>下的方法在不同线程里
    parallel="instances"  TestNG将并行执行相同实例下的所有方法在不同的线程里
    
parent-module和guice-stage——————需补充
Guice注入使用样例:http://note.youdao.com/s/CbQofrRg
testng并发测试-parallel演示:http://note.youdao.com/s/ExXqnGk
2. -suite-file

说明:引入外部的xml文件(地址由path参数决定,path必填项),将引入的xml与当前的xml文件一起使用。

声明方法:

<suite-files>
     <suite-file path="/path/suitefile1"></suite-file>
</suite-files>
3. -test

说明:一个下可以有多个,可以通过的parallel="tests"来进行并行测试,必须和thread-count配套使用,否则是无效参数。

由、、三部分组成。

在这里插入图片描述

-4. parameter

说明:提供测试数据,有name和value两个参数。testng.xml文件中的可以声明在或者级别,在下的会覆盖在下声明的同名变量

声明方法:

<parameter name = "parameter_name" value = "parameter_value "/>
-5. method-selectors

说明:方法选择器定义了哪些类的方法需要去执行,类必须继承自org.testng.IMethodSelector。

声明方法:

<method-selectors>
     <method-selector>
          <selector-class name="classname" priority="1"></selector-class>
          <script language="java"></script>    (language还可以用beanshell等)
     </method-selector>
</method-selectors>
–6. groups

说明:要运行的组,可以自定义一个组,可以包括要执行的,还排除要执行的方法。

必须和配套使用。

由和、三部分组成。

可以将group组成一个新组,包括要执行和不执行的大组;

要执行的方法;

指定了某group需要依赖的group(比如下面的例子,group1需要依赖group2和group3先执行)。

声明方法:

<groups>
     <define name ="all">
          <include name ="testgroup1"/>
          <exclude name ="testgroup2'/>
     </define>
     <run>
          <include name ="all"/>
          <include name ="testmethod1"/>
          <exclude name="testmethod2"/>
     </run>
     <dependencies>
          <group name ="group1" depends-on="goup2 group3"/>
     </dependencies>
</groups>

具体使用方法参考 testng4 测试方法 测试组

-7. classes

说明:方法选择器,要执行的方法写在这里,参数有name和priority。

  1. 下必须写要执行的,否则不会执行任何内容,如果填写了class没有写methods,会按照填写的class的下的注释@Test去执行所有的方法
  2. 下的如果填写了,那只会执行所填写的方法,没有填写的方法不会去执行

声明方法:

<classes>
     <class name="要执行的class名">
          <methods>
               <include name ="要执行的方法名"></include>
          </methods>
     </class> 
</classes>
-8. packages

说明:指定包名代替类名。查找包下的所有包含testNG 注解的类进行测试.

声明方法:

<packages>
     <package name="packagename"/>
     <package name="packagename">
          <include name="methodname"/>
          <exclude name="methodname"/>
     </package>
</packages>
-9. listener

说明:指定listeners,这个class必须继承自org.testng.ITestNGListener。在java中使用@Listeners({com.example.MyListener.class,com.example.MyMethodInterceptor.class})的注释也可以有同样效果。

样例-通过监听实现-测试失败自动重试:


<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="scp-business" parallel="false">

    <test name="regression">
       ...
    </test>

    <listeners>
        <listener class-name="util.testngRetry.RetryListener"></listener>
    </listeners>

</suite>
public class RetryListener implements IAnnotationTransformer{//

    @SuppressWarnings("rawtypes")
    @Override
    public void transform(ITestAnnotation annotation,Class testClass,
                          Constructor testConstructor, Method testMethod) {

        IRetryAnalyzer retry = annotation.getRetryAnalyzer();
        if (retry == null) {
            annotation.setRetryAnalyzer(RetryFail.class);
        }
    }

}

public class RetryFail implements IRetryAnalyzer
{
    private final int m_maxRetries = 3;//重试次数
    private final int m_sleepBetweenRetries = 3000;//失败后等待时间,毫秒
    private int currentTry;
    private String previousTest = null;
    private String currentTest = null;
    public RetryFail()
    {
        currentTry = 0;
    }

    @Override
    public boolean retry(final ITestResult result)
    {
        // If a testcase has succeeded, this function is not called.
        boolean retValue = false;

        // Getting the max retries from suite.
        // String maxRetriesStr = result.getTestContext().getCurrentXmlTest().getParameter("maxRetries");
        String maxRetriesStr = result.getTestContext().getSuite().getParameter("maxRetries");
        int maxRetries = m_maxRetries;
        if(maxRetriesStr != null)
        {
            try
            {
                maxRetries = Integer.parseInt(maxRetriesStr);
            }
            catch (final NumberFormatException e)
            {
                System.out.println("NumberFormatException while parsing maxRetries from suite file." + e);
            }
        }

        // Getting the sleep between retries from suite.you can from the suite parameter
        String sleepBetweenRetriesStr = result.getTestContext().getSuite().getParameter("sleepBetweenRetries");
        int sleepBetweenRetries = m_sleepBetweenRetries;
        if(sleepBetweenRetriesStr != null)
        {
            try
            {
                sleepBetweenRetries = Integer.parseInt(sleepBetweenRetriesStr);
            }
            catch (final NumberFormatException e)
            {
                System.out.println("NumberFormatException while parsing sleepBetweenRetries from suite file." + e);
            }
        }

        currentTest = result.getTestContext().getCurrentXmlTest().getName();

        if (previousTest == null)
        {
            previousTest = currentTest;
        }
        if(!(previousTest.equals(currentTest)))
        {
            currentTry = 0;
        }

        if (currentTry < maxRetries &&!result.isSuccess())
        {
            try
            {
                Thread.sleep(sleepBetweenRetries);
                System.out.println("*****************************测试失败,等待30s");
            }
            catch (final InterruptedException e)
            {
                e.printStackTrace();
            }
            currentTry++;
            result.setStatus(ITestResult.SUCCESS_PERCENTAGE_FAILURE);
            System.out.println("*****************************开始重试,此时是第"+currentTry+"次尝试");
            retValue = true;

        }
        else
        {
            currentTry = 0;
        }
        previousTest = currentTest;
        // if this method returns true, it will rerun the test once again.


        return retValue;
    }
}


testng.xmlTestNG测试框架中的配置文件,用于定义测试套件、测试类和测试方法的执行顺序、参数和其他设置。以下是一个典型的testng.xml文件的示例: ```xml <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" > <suite name="Test Suite" verbose="1"> <test name="Test Case 1"> <parameter name="browser" value="chrome" /> <classes> <class name="com.example.TestClass1" /> </classes> </test> <test name="Test Case 2"> <parameters> <parameter name="username" value="john" /> <parameter name="password" value="secret" /> </parameters> <classes> <class name="com.example.TestClass2" /> </classes> </test> <listeners> <listener class-name="com.example.CustomListener" /> </listeners> </suite> ``` 在这个示例中,testng.xml包含一个suite元素,表示整个测试套件。suite元素中包含了两个test元素,分别代表两个测试用例。每个test元素可以包含一个或多个classes元素,其中定义了要执行的测试类。 通过parameter元素,我们可以为测试方法提供参数值。在示例中,Test Case 1使用了一个名为"browser"的参数,并将其值设置为"chrome"。Test Case 2使用了两个参数:"username"和"password",并分别设置为"john"和"secret"。 listeners元素用于指定自定义的测试监听器。在示例中,我们指定了一个名为"com.example.CustomListener"的监听器类。 这只是testng.xml文件的一个简单示例,可以根据您的需求进行扩展和定制。在运行测试时,您可以使用testng.xml文件来配置测试套件的执行方式和参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值