0%

TestNG使用简单总结

TestNG介绍

TestNG是一个开源自动化测试框架;TestNG表示下一代(Next Generation的首字母)。

TestNG的特点:

  • 注解
  • 使用Java和面向对象的功能
  • 灵活的运行时配置
  • 支持依赖测试方法,并行测试,负载测试,局部故障
  • 灵活的插件API
  • 支持多线程测试

TestNG测试类配置注释说明

注解描述
@BeforeMethod在每个测试方法 前 执行
@AfterMethod在每个测试方法 后 执行
@BeforeClass被注释的方法将在当前类的第一个测试方法调用前运行
@AfterClass被注释的方法将在当前类的所有测试方法调用后运行
@BeforeGroups被配置的方法将在列表中的gourp前运行。这个方法保证在第一个属于这些组的测试方法调用前立即执行
@BeforeTest被注释的方法将在测试运行前运行
@AfterTest被注释的方法将在测试运行后运行
@BeforeSuite被注释的方法将在所有测试运行前运行
@AfterSuite被注释的方法将在所有测试运行后运行
alwaysRun对于每个bufore方法(beforeSuite, beforeTest, beforeTestClass 和 beforeTestMethod, 但是不包括 beforeGroups):\n如果设置为true,被配置的方法将总是运行而不管它属于哪个组。\n对于after方法(afterSuite, afterClass, …): 如果设置为true,被配置的方法甚至在一个或多个先调用的方法失败或被忽略时也将运行。
dependsOnGroups这个方法依赖的组列表
dependsOnMethods这个方法依赖的方法列表
enabled这个类的方法是否激活
groups这个类或方法所属的分组列表
inheritGroups如果设置为true,这个方法被属于在类级别被@Test annotation指定的组

testng.xml 配置详解

XML规则

  • suite
  • –tests
  • —-parameters
  • —-groups
  • ——definitions
  • ——runs
  • —-classes
  • –parameters

XML简单的大概结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<suite name="xxx">
<test name="xxxx">
  <!-- 参数定义的方法 -->
  <parameter name="first-name" value="Cedric"/>

  <!-- groups的用法,前提是需要存在classes的组,否则所有方法不被运行 -->
  <groups>
  <!-- 定义组中组的方法 -->
    <define name="groups_name">
      <include name="group1"/>
      <include name="group2"/>
    </define>

    <run>
      <!-- 此处用组名来区别 -->
      <inclue name="groups_name" />
      <exclue name="groups_name" />
      </run>
  </groups>

  <!-- classes的用法,classes中包含类名,类名底下可以包含方法名或排除方法名 -->
  <classes>
    <class name="class1">
      <methods>
        <!-- 此处用方法名来区别 -->
        <inclue name="method_name" />
        <exclue name="method_name" />
      </methods>
    </class>
  </classes>
</test>
</suite>

各个参数说明

  1. <suite>
    说明:一个xml文件只能有一个<suite>,是一个xml文件的根级
    <suite><test><parameters>组成

    参数说明:

    参数说明使用方法参数值
    name必选项,的名字,将出现在reports里name=”XXX”suite名字
    junit是否执行Junit模式(识别setup()等)junit=”true”true和false,默认false
    verbose控制台输出的详细内容等级,0-10级(0无,10最详细)verbose=”5”0到10
    parallel是否在不同的线程并行进行测试,要与thread-count配套使用parallel=”mehods”详见表格下内容,默认false
    parent-module和Guice框架有关,只运行一次,创建一个parent injector给所有guice injectors
    guice-stage和Guice框架有关guice-stage=”DEVELOPMENT”DEVELOPMENT,PRODUCTION,TOOL,默认”DEVELOPMENT”
    configfailurepolicy测试失败后是再次执行还是跳过,值skip和continueconfigfailurepolicy=”skip”skip、continue,默认skip
    thread-count与parallel配套使用,线程池的大小,决定并行线程数量thread-count=”10”整数,默认5
    annotations获取注解,值为javadoc时,使用JavaDoc的注释;否则用JDK5注释annotations=”javadoc”javadoc
    time-out设置parallel时,终止执行单元之前的等待时间(毫秒)time-out=”10000”整数,单位毫秒
    skipfailedinvocationcounts是否跳过失败的调用skipfailedinvocationcounts=”true”true和false,默认false
    data-provider-thread-count并发时data-provider的线程池数量data-provider-thread-count=”5”整数
    object-factory一个实现IObjectFactory接口的类,实例化测试对象object-factory=”classname”类名
    allow-return-values是否允许返回函数值all-return-values=”true”true和false
    preserve-order是否按照排序执行preserve-order=”true”true和false,默认true
    group-by-instances按照实例分组group-by-instances=”true”true和false,默认false
  2. <test>
    说明:一个下可以有多个,可以通过的parallel=”tests”来进行并行测试,必须和thread-count配套使用,否则是无效参数
    <test><parameters><groups><classes>三部分组成

    参数说明:

    参数说明使用方法参数值
    nametest的名字,将出现在报告里name=”testname”test的名字
    junit是否按照Junit模式运行junit=”true”true和false,默认false
    verbose控制台输出的详细内容等级,0-10级(0无,10最详细),不在报告显示verbose=”5”0到10
    parallel是否在不同的线程并行进行测试,要与thread-count配套使用parallel=”mehods”与suite的parallel一致,默认false
    thread-count与parallel配套使用,线程池的大小,决定并行线程数量thread-count=”10”整数,默认5
    annotations获取注解,值为javadoc时,使用JavaDoc的注释;否则用JDK5注释annotations=”javadoc”javadoc
    time-out设置parallel时,终止执行单元之前的等待时间(毫秒)time-out=”10000”整数,单位毫秒
    enabled标记是否执行这个testenabled=”true”true和false,默认true
    skipfailedinvocationcounts是否跳过失败的调用skipfailedinvocationcounts=”true”true和false,默认false
    preserve-order是否按照排序执行,如果是true,将按照xml文件中的顺序去执行preserve-order=”true”true和false,默认true
    allow-return-values是否允许返回函数值all-return-values=”true”true和false,默认false
  3. parallel
    该参数的值可以是falsemethodstestsclassesinstances。默认false
    parallel必须和thread-count配套使用,否则相当于无效参数,thread-count决定了并行测试时开启的线程数量

    • parallel="mehods" TestNG将并行执行所有的测试方法在不同的线程里
    • parallel="tests" TestNG将并行执行在同一个下的所有方法在不同线程里
    • parallel="classes" TestNG将并行执行在相同下的方法在不同线程里
    • parallel="instances" TestNG将并行执行相同实例下的所有方法在不同的线程里
  4. <parameter>
    说明:提供测试数据,有namevalue两个参数
    声明方法:<parameter name = "parameter_name" value = "parameter_value "/>
    testng.xml文件中的<parameter>可以声明在<suite>或者<test>级别,在<test>下的<parameter>会覆盖在<suite>下声明的同名变量
    使用示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class TestParameterXML {

    @Test
    @Parameters({ "parameter_name1", "parameter_name2" })
    public void createConnection(String parameter_name1, int parameter_name2) {

    System.out.println("parameter_name1 : " + dbconfig);
    System.out.println("parameter_name2 : " + poolsize);

    Properties prop = new Properties();
    InputStream input = null;
    }
    }
  5. <DataProvider>

    使用示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package com.yiibai;

    import org.testng.Assert;
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;

    public class TestParameterDataProvider {

    @Test(dataProvider = "provideNumbers")
    public void test(int number, int expected) {
    Assert.assertEquals(number + 10, expected);
    }

    @DataProvider(name = "provideNumbers")
    public Object[][] provideData() {

    return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } };
    }
    }
  1. <groups>
    说明:要运行的组,可以自定义一个组,可以包括要执行的,还排除要执行的方法。必须和<classes>配套使用,从下面的类中找到对应名字的方法
    <groups><difine><run><dependencies>三部分组成。<diffine>可以将group组成一个新组,包括要执行和不执行的大组;<run>要执行的方法;<dependencies>指定了某group需要依赖的group(比如下面的例子,group1需要依赖group2group3先执行)。

    声明方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <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>
  2. <classes>
    说明:方法选择器,要执行的方法写在这里,参数有namepriority
    注释:
    1.下必须写要执行的,否则不会执行任何内容,如果填写了class没有写methods,会按照填写的class的下的注释@Test去执行所有的方法
    2.下的如果填写了,那只会执行所填写的方法,没有填写的方法不会去执行

    声明方法:

    1
    2
    3
    4
    5
    6
    7
    <classes>
         <class name="要执行的class名">
              <methods>
                   <include name ="要执行的方法名"/>
              </methods>
         </class> 
    </classes>
  3. <packages>
    说明:<packages>指定包名代替类名。查找包下的所有包含testNG annotation的类进行测试

    声明方法:

    1
    2
    3
    4
    5
    6
    7
    <packages>
         <package name="packagename"/>
         <package name="packagename">
              <include name="methodname"/>
              <exclude name="methodname"/>
         </package>
    </packages>
  4. <listener>
    说明:指定listeners,这个class必须继承自org.testng.ITestNGListener。在java中使用@Listeners({com.example.MyListener.class,com.example.MyMethodInterceptor.class})的注释也可以有同样效果

    声明方法:

    1
    2
    3
    4
    <listeners>
         <listener class-name="com.example.MyListener"/>
         <listener class-name="com.example.MyMehodIntercepor"/>
    </listeners>

忽略测试

在测试用例写好,但是并没有调试或者说还没有测试通过时,希望先不要执行该测试,可以使用@Test(enabled = false)来忽略这个测试方法。默认情况下,enabled参数是true

超时测试

超时表示如果单元测试花费的时间超过指定的毫秒数,那么TestNG将会终止它,并标记为失败。
超时也可用于性能测试,以确保方法在合理的时间内返回。
示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.yiibai;
import org.testng.annotations.Test;
public class TestTimeout {

@Test(timeOut = 5000) // time in mulliseconds
public void testThisShouldPass() throws InterruptedException {
Thread.sleep(4000);
}

@Test(timeOut = 1000)
public void testThisShouldFail() {
while (true){
// do nothing
}
}
}