单元测试框架-testNG

测试人员一般用TestNG来写自动化测试,开发人员一般用JUnit写单元测试

单元测试关注代码的实现逻辑,例如一个if 分支或一个for循环或者某个功能函数

主要问题

  1. 项目=src+库
  2. unable to launch:缺少main()方法  
  3. cannot be resolved to a type:没有导入相应的库

  4. 导入库:项目右键 -> Build Path -> Configure Build Path -> Libraries -> Add Library ->XXX-> apply and close

安装使用

  • JDK,Eclipse--在eclipse中安装testNG--新建project-新建other(testaNG class)--按照注解进行运行,不用main()方法

注解-@

  • 对程序元素(类,方法,变量等)进行说明,提供给框架使用

  • launch-发动;Suite-一套;Test-测试方法;Groups-组;Provider-供应者   

  • 分类

  1. Suite-在某个测试套件测试执行之前/之后执行
  2. Class-在某个类的所有方法执行之前/之后
  3. Test-在某个测试的所有测试方法运行之前/之后
  4. groups--某个组的所有测试方法执行之前/之后
  5. Method--在某个测试方法之前/之后--------执行完测试用例后要重置数据才能执行第二条用例时可用之前
  6. @test--标志一个类或者方法作为测试的一部分
  7. @parameters--介绍如何将参数传递给@Test方法
  8. @listeners--定义一个测试类的监听器
  9. @dateprovider--提供数据的一个测试方法,注解的方法必须返回一个Object[] []
  10.   @Test(groups="group1") //表示这个方法属于group1组
      public void test1() {
          System.out.println("test1 from group1");
          Assert.assertTrue(true);
      }

beforesuit-beforetest-beforeclass-beforegroups-beforemethod(按顺序一个方法之前)-运行一个方法-aftermethod;

{@BeforeMethod->@Test->@AfterMethod->....};有多少个测试方法就循环几次执行{};

{aftermethond-aftergroups}----afterclass-aftertest————aftersuit

@BeforeSuite、@BeforeTest、@AfterTest、@AfterSuite可以对不同的测试类生效,其他的注解的作用范围只在本类中生效。

基本步骤:

  • 编写测试的业务逻辑代码,并在相应代码中插入TestNG的annotation。
  • 将测试信息配置到testng.xml文件中
  • 运行TestNG,测试报告位于 "test-output" 目录下

suite :代表一个测试套件,它可以包含一个或多个测试

test:代表一个测试,可以包含一个或多个TestNG测试类

class:代表一个类,至少一个TestNG的注解,也可以包含一个或多个测试方法

groups:用来表明测试用例的分组,有利于针对一类的测试用例进行专门的测试

如何执行测试

  1. 直接执行--Run As ->TestNG Test

  2. textng.xml

      • 在同包下新建xml文件,填入一些标签,其中class name=测试的包名.类名;
      • 按顺序执行:test标签中preserve-order="true",method标签中的内容按顺序执行
      • 12

异常测试:期望某些代码抛出异常,通过@Test(expectedExceptions=...)添加

忽略测试:用例没写好,修改注解为@Test(enabled=false),@Test不能改

超时测试:常用于性能测试,超过指定的毫秒数就标记为失败

分组测试:xml中使用<group>标签;class中是通过@test(groups={"group1","其它名字"})分组

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <suite name="Suite" parallel="false">
 3   <test name="Test">
 4     <groups>
 5       <incloud name="组名1"></incloud>//先运行组名1,再运行group2
 6       <incloud name="group2"></incloud>
 7     </groups>
 8     <classes>
 9       <class name="包名.类名"/>
10       <class name="com.demo.test.testng.TestCase1"/>
11     </classes>
12   </test> 
13 </suite> 

<suite>标签是testng.xml的根标记,描述了一个测试套件,可以有几个<test>

verbose:日志描述级别,10最详细

依赖测试:以特定顺序调用测试用例中的方法,或者希望在方法之间共享一些数据和状态;添加注解@Test(dependsOnMethods={"依赖的方法名"});先运行被依赖的。

参数化测试:使用不同的值一次又一次地运行相同的测试

      textng.xml传递参数:先在class中多添加个注解@Parameters({"参数1", "参数2"})   //使代码和测试数据分离,方便维护

                再在 <parameter name="参数1" value="1011111" /> 赋值,运行xml

      @DataProvider提供比较复杂的参数:

                返回的必然是Object[][];

                传参的类型,个数必须要一致

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

        return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } };
    }
    
    @Test(dataProvider = "参数")
    public void TestNgLearn1(int param1, int param2) {
        System.out.println("this is TestNG test case1, and param1 is:"+param1+"; param2 is:"+param2);
        Assert.assertFalse(false);
    }

 属性介绍

  • name:必须有,体现在报告中
  • verbose:报告的详细程度,从0开始到10,默认是1
  • parallel:指代运行方式,默认是串行-单线程,为none

    并行方式:

      • methods:方法层级,若为此值,则该suite下所有的测试方法都将进行多线程
      • tests:每个<test>标签都将处于一个单独的线程中
      • classes:TestNG会将该suite下每个class都将在单独的线程中运行
      • instances:实例级别,即TestNG同一实例中的所有方法将在同一线程中运行
  • thread-count:用于指定线程数
  • time-out:指定超时时间
  • preserve-order:如果为true,则用例执行会按照在xml中的顺序执行,否则会乱序执行,不添加此属性的话默认是按顺序执行的;
  • group-by-instances:默认是会将所有重载方法都跑完再运行被依赖方法,将此项设置为true可以先运行被依赖方法
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false">
<suite name="My suite" parallel="methods" thread-count="5">
<!--parallel 指代运行方式;thread-count指定线程数-->
  <test name="Test">
 <parameter name="param1" value="1011111" />
 <!--parameter指定参数名字和值  -->
   <packages>
      <package name = "whole.path.to.package.* />
<!-- 包名-->
   </packages>
<groups> <define name="
functest"> <include name="windows"/> <include name="linux"/> </define> <run> <include name = "includedGroup" /> <!--包含一个包中的某些组 --> <exclude name = "excludedGroup" /> <!--排除一个包中的某些组 --> </run> </groups>

<classes> <!-- 一指定类中的全部测试脚本--> <class name="com.demo.test.testng.NewTest"/> <methods> <!-- methods指示一个类中的部分测试脚本--> <include name = "firstMethod" /> </methods> </class> </classes> </test> </suite> <!-- Suite-->

 

posted @ 2019-08-16 18:01  不回头的浪子  阅读(589)  评论(0编辑  收藏  举报