Java自动化测试框架--TestNG详解

发表于:2024-1-26 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Summer沙漠    来源:知乎

  一. 什么是TestNG
  TestNG是一个开源的自动化测试框架,它受JUnit和NUnit启发,其中“NG”即表示Next Generation,其功能更强大使用更方便。
  二. TestNG配置
  2.1 POM文件配置
  在maven工程的pom.xml文件中加入以下依赖:
  <dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>6.14.2</version>
  </dependency>
  2.2 TestNG插件安装
  三. 用例运行方法
  3.1 单个用例
  选中该用例->右键,Run As ->TestNG Test
  3.2 单个类的用例
  打开类文件,空白处右键,Run As ->TestNG Test
  和单个用例一样,不同之处只是在类文件里空白处点击右键。此操作会执行该类下所有的测试用例
  3.3 多个类的用例(Test Suite)
  使用testng.xml文件,该文件用来管理测试用例,并运行testNG。
  <suite>:套件就是将所有的测试类整理在一块,形成一套测试用例
  <test>:测试集是指测试模块,一般一个项目可以按照模块分为几部分,即不同的test
  <classes>:测试集下的所有测试类
  <class>:具体测试类,name 属性指定测试类的路径
  <methods>:测试类下具体的测试方法,如果不写此标签则默认包含测试类下的所有方法。
  举例,本文的testng.xml内容如下:
  <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
  <suite name="testng test" parallel="false">
    <test name="API test">
      <classes>
        <class name="com.apitest.APITest"/>
        <class name="com.apitest.APITest2"/>
      </classes>
    </test>
    <test name="GUI test">
      <classes>
        <class name="com.seletest.FirstWebTest"/>
      </classes>
    </test>
  </suite>
  注:<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 必须要添加,这是testng.xml文件的规范要求。
  运行结果如下:
  四. TestNG注解
  4.1 Before/After注解
  4.2 Test注解
  @Test 注解的作用很简单,即用来标识当前方法是测试方法。它可以加很多参数:
  1) denpendsOnMethonds: 用来设置用例依赖。
  @Test
  public void apitest01() {
  System.out.println("in APITest, apitest01");
  Assert.assertEquals(false,true);
  }
  @Test(dependsOnMethods= {"apitest01"})
  public void apitest02() {
  System.out.println("in APITest, apitest02");
  }
  如上的两个用例,apitest01执行通过,则执行apitest02;如果apitest01执行失败,则apitest02直接跳过,不会执行:
  2) alwaysRun:默认是false,设置为true时,无论什么情况都会运行。一般和dependsOnMethods结合。
  @Test
  public void apitest01() {
  System.out.println("in APITest, apitest01");
  Assert.assertEquals(false,true);
  }
  @Test(dependsOnMethods= {"apitest01"},alwaysRun=true)
  public void apitest02() {
  System.out.println("in APITest, apitest02");
  }
  如上的两个用例,不管apitest01是否失败,apitest02都运行。运行结果如下:
  3) enabled:默认是true,设置为false时表示用例失效(即不运行)。使用方法:
  @Test(enabled=false)
  4) Priority:设置用例运行的优先级。默认是0,优先级P0最高,其次是P1;高优先级的用例优先运行
  @Test(priority=3)
  public void apitest01() {
  System.out.println("in APITest, apitest01 -- P3 ");
  //Assert.assertEquals(false,true);
  }
  @Test(priority=2)
  public void apitest02() {
  System.out.println("in APITest, apitest02 -- P2");
  }
  @Test(priority=1)
  public void apitest03() {
  System.out.println("in APITest, apitest03 -- P1");
  }
  上述用例的运行结果如下:
  5)timeOut:指定测试方法执行的超时时间,如果超过指定的毫秒数,则认为执行失败并终止执行抛出异常。使用方法:
  @Test(timeOut = 1000)
  6)Groups: 指定用例所属的组,一般是对用例进行逻辑划分,譬如只想执行一部分用例,例如冒烟测试,可以定义一个冒烟用例集:
  @Test(groups="smoke")
  public void apitest01() {
  System.out.println("in APITest, apitest01 -- P3 ");
  //Assert.assertEquals(false,true);
  }
  @Test(groups="regression")
  public void apitest02() {
  System.out.println("in APITest, apitest02 -- P2");
  }
  @Test()
  public void apitest03() {
  System.out.println("in APITest, apitest03 -- P1");
  }
  注意,group需要在testng.xml中加入以下配置:
  则运行结果如下,即“API test”中,只有属于smoke组的用例才会执行:
  五. 用例的传参
  即给测试方法传递参数,更进一步说,如何实现数据-脚本的分离。
  5.1 Parameters
  需要首先在testng.xml里设置,注意此时必须通过testng.xml来运行,否则找不到parameter。
  @Test()
  @Parameters({"name","age"})
  public void apitest01(String name, int age) {
  System.out.println("in APITest, apitest01");
  System.out.println(name + "'s age is: " + age + ".");
  }
  运行结果如下:
  这种方式传参缺点很明显:
  ·只能通过testng.xml来运行,不够灵活
  · 只能传递基础类型的参数
  · 只能传递一组参数
  5.2 DataProvider
  DataProvider是更灵活更强大的参数传递方式。它支持各种数据类型的参数,可以传递多组参数。其返回值类型是Object类型的二维数组,定义如下:
  @DataProvider(name="paraDatas")
  public Object[][] paraDatas(){
  Object[][] paras = {
  {"zhang san", 20},
  {"li si", 21},
  {"wang wu", 22}
  };
  return paras;
  }
  在测试用例的Test方法里,使用方法如下:
  @Test(dataProvider = "paraDatas")
  public void apitest01(String name, int age) {
  System.out.println("in APITest, apitest01");
  System.out.println(name + "'s age is: " + age + ".");
  }
  运行结果如下:
  DataProvider比较灵活且强大,但它也有局限,即实际上还是在代码中hardcode的方式。如果多一种情况,还需要修改case(paraDatas)。
  5.3 POI技术
  Apache POI 是基于 Office Open XML 标准(OOXML)和 Microsoft 的 OLE 2 复合文档格式(OLE2)处理各种文件格式的开源项目。简而言之,可以使用 Java 读写 MS Excel 文件,可以使用 Java 读写 MS Word 和 MS PowerPoint 文件。
  本质上它还是使用DataProvider的方式传参,但可以真正实现数据-脚本的分离。
  这里不多讲了~
  此外还可以将数据库查询的结果作为参数传递,但本质是一样的。
  六. 思考与总结
  testNG还有很多很强大的机制,例如用例失败重试,需要实现IRetryAnalyzer接口,相比其他参数的使用,其稍微复杂一些,有空了再搞吧~
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号