目录

一、概述

二、@Test注解常用参数

三、测试中常用的断言(assert)

四、TestNG常用注解及使用

五、配置文件xml常用标签

六、参数传递

七、测试报告

一、概述

1、TestNG是一个开源自动化测试框架,其灵感来自JUnit和NUnit,TestNG还涵盖了整个核心的JUnit4功能,但引入了一些新的功能,使其功能更强大,使用更方便。

优势:支持依赖测试方法,并行测试,负载测试,局部故障;灵活的插件API;支持多线程测试;

2、Maven依赖

       <dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.7</version>
<scope>test</scope>
</dependency>

注:Eclicpe上想要直接运行还需要安装testng插件

3、helloword

(1)被测试方法类HelloWrold:

package study.testng;

public class HelloWorld {

    public String hello(){
return "hello world !";
}
}

(2)测试类TestHelloWorld:

package study.testng;

import org.testng.Assert;
import org.testng.annotations.Test; public class TestHelloWorld { //测试返回结果不为空
@Test
public void tester1(){
HelloWorld hello = new HelloWorld();
String helloworld = hello.hello(); Assert.assertNotNull(helloworld);
} //测试返回结果为”hello world !“字符串
@Test
public void tester2(){
HelloWorld hello = new HelloWorld();
String helloworld = hello.hello();
System.out.println(helloworld); Assert.assertEquals(helloworld, "hello world !");
}
}

(3)运行测试

(4)测试结果

二、@Test注解常用参数

1、测试方法是否执行enable

默认是true,如果设置为false,则在运行时不会执行这个测试方法;

2、预期异常expectedExeption

@Test(expectedExceptions = ClassName.class)

如果ClassName类抛出了异常,测算测试通过,没有异常算测试不通过;

expectedExceptions的值也可以是一个数组:

@Test(expectedExceptions = {ClassName.class, ClassName2.class,... })

3、超时timeOut

单位为毫秒,如果测试方法运行时间超这个值算测试不通过;

4、分组groups

(1)把在一个<test>标签内的中所有类方法再进行组,在运行时,一个组的方法会一起运行,然后再运行下一个组的方法;

(2)分组的最小维度为方法,当把带分组的@Test(groups = ”groupName”)注解对类使用时,这个测试类中的所有方法都属于这同一个组;

(3)一个方法也可以同时属于多个组,@Test(groups = {“groupName1”, “groupName2”}),那么每组运行时这个方法都会被执行一次;

(4)同一个组里的方法类,如果分别属于两个不同的测试用例(<test>)内,那么它们其实可以算两个组,它们会在每个测试用例分别运行,而不会合在一起运行;

5、依赖方法dependsOnMethods

在被依赖的方法运行完成之后运行当前方法,如果依赖方法测试不通过,那么当前方法也不会继续运行了;依赖的方法可以有多个;

例:@Test(dependsOnMethods = { "methodName1" , “methodName2” })

6、依赖组,dependsOnGroups

和依赖方法类似,在被依赖组运行完成之后运行当前组,如果依赖组中的方法没有测试能过,那么当前的方法也不会继续运行了;依赖组可以有多个;

三、测试中常用的断言(assert)

 assertEqual ([String message], expected value, actual value)        断言两个值相等。值可能是类型有 int, short, long, byte, char or java.lang.Object. 第一个参数是一个可选的字符串消息;
assertTrue([String message], boolean condition)         断言一个条件为真;
assertFalse([String message],boolean condition)           断言一个条件为假;
assertNotNull([String message], java.lang.Object object)   断言一个对象不为空(null);
assertNull([String message], java.lang.Object object)      断言一个对象为空(null);
assertSame([String message], java.lang.Object expected, java.lang.Object actual)    断言两个对象引用相同的对象;
assertNotSame([String message], java.lang.Object unexpected, java.lang.Object actual) 断言两个对象不是引用同一个对象;
assertArrayEquals([String message], expectedArray, resultArray)              断言预期数组和结果数组相等。数组的类型可能是 int, long, short, char, byte or java.lang.Object.;

四、TestNG常用注解及使用

@BeforeSuite     在该套件的所有测试都运行在注释的方法之前,仅运行一次(套件测试是一起运行的多个测试类)。
@AfterSuite 在该套件的所有测试都运行在注释方法之后,仅运行一次。
@BeforeClass 在调用当前类的第一个测试方法之前运行,注释方法仅运行一次。
@AfterClass 在调用当前类的第一个测试方法之后运行,注释方法仅运行一次
@BeforeTest 注释的方法将在属于<test>标签内的类的所有测试方法运行之前运行。
@AfterTest 注释的方法将在属于<test>标签内的类的所有测试方法运行之后运行。
@BeforeGroups 配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行。
@AfterGroups 此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行。
@BeforeMethod 注释方法将在每个测试方法之前运行。
@AfterMethod 注释方法将在每个测试方法之后运行。
@Parameters 描述如何将参数传递给@Test方法。
@DataProvider 标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称。
@Factory 将一个方法标记为工厂,返回TestNG将被用作测试类的对象。 该方法必须返回Object []。
@Listeners 定义测试类上的侦听器。
@Test 将类或方法标记为测试的一部分。

例:

1、增加一个测试类TestConfig

package study.testng;

import org.testng.annotations.AfterGroups;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test; public class TestConfig { @BeforeSuite
public void beforeSuite() {
System.out.println("测试套件(当前xml中<suite>标签)之前运行@BeforeSuite--------------------");
} @AfterSuite
public void afterSuite() {
System.out.println("测试套件(当前xml中<suite>标签)之后运行@AfterSuite--------------------\n");
} @BeforeTest
public void beforeTest() {
System.out.println("测试用例(当前xml中<test>标签)之前运行@BeforeTest----------");
} @AfterTest
public void afterTest() {
System.out.println("测试用例(当前xml中<test>标签)之后运行@AfterTest----------\n");
} @BeforeMethod
public void beforeMethod() {
System.out.println("当前类每个测试方法(@Test)之前运行@BeforeMethod");
} @AfterMethod
public void AfterMethod(){
System.out.println("当前类每个测试方法(@Test)之后运行@AfterMethod");
} @BeforeGroups(value="group1")
public void beforeGroups(){
System.out.println("配置组配group1之前运行@BeforeGroups..................");
}
@AfterGroups(value="group1")
public void afterGroups(){
System.out.println("配置组配group1之前运行@AfterGroups..................");
} @Test
public void test1(){
System.out.println("runnig TestConfig.test1()");
} @Test(groups = "group1")
public void test2(){
System.out.println("runnig TestConfig.test2()");
} @Test(groups = "group1")
public void test3(){
System.out.println("runnig TestConfig.test3()");
} }

2、新建一个自定义xml配置文件tester.xml(位置在哪都行)

<?xml version="1.0" encoding="UTF-8"?>

<!-- @BeforeSuite -->
<suite name="tester"> <!-- @BeforeTest -->
<test name="case1">
<classes>
<class name="study.testng.TestConfig" />
<class name="study.testng.TestHelloWorld" />
</classes>
</test>
<!-- @AfterTest --> <!-- @BeforeTest -->
<test name="case2">
<classes>
<class name="study.testng.TestConfig" />
</classes>
</test>
<!-- @AfterTest --> </suite>
<!-- @AfterSuite -->

3、运行此配置测试

在有@Test方法的类页面右键

选择xml文件

4、运行结果

从这个结果显示出注释的作用位置。其中@BeforeGroups和@AfterGroups的作用范围是可以跨类的,但类必须是在同一个测试用例(<test>标签)范围内;

这些标签的运行先后顺序可以总结为:

@BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite(其中{}内的与多少个@Test,就循环执行多少次)。

五、配置文件xml常用标签

<suite>  套件,根标签,通常由几个<test组成>
属性:
  name 套件的名称,必须属性;
  verbose 运行的级别或详细程度;
  parallel 是否运行多线程来运行这个套件;
  thread-count 如果启用多线程,用于指定开户的线程数;
  annotations 在测试中使用的注释类型;
  time-out 在本测试中的所有测试方法上使用的默认超时时间;
<test>    测试用例,name为必须属性;
<classes> 用例中包含的类,子标签为<class name=”className”>;
<class> 测试类,其中属性name为必须属性;;
<packages> 用例中包含的包,包中所有的方法都会执行,子标签为<package name=”packageName”>;
<package> 测试包,name为必须属性;
<methods> 指定测试类中包含或排除的方法,子类为<include>,<exclude>;
<include> 指定需要测试的方法,name为必须属性;
<exclude> 指定类中不需要测试的方法,name为必须属性;
<groups> 指定测试用例中要运行或排除运行的分组,子标签为<run>,<run>下包含<include>,<exclude>标签,<include>,<exclude>的name指定运行、不运行的分组;

例:

<?xml version="1.0" encoding="UTF-8"?>
<suite name="tester"> <test name="case1">
<classes>
<class name="study.testng.TestHelloWorld"/>
<class name="study.testng.TestConfig">
<methods>
<include name="test1" /> <!-- 运行test1()方法-->
<exclude name="test2" /> <!-- 不运行test2()方法-->
</methods>
</class>
</classes>
</test> <test name="case2">
<packages>
<package name="study.testng" />
</packages>
<groups>
<run>
<exclude name="group1" /> <!-- 不运行组group1的所有方法,或者也可include标签来表示需要行的组-->
</run>
</groups>
</test> </suite>

六、参数传递

1、使用@Parameters注解从测试配置xml文件获取参数

(1)新建测试类TestParameter

package study.testng;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test; public class TestParameter { @Test
@Parameters({"param", "param2"})
public void printParameters(String param, String param2){
System.out.println("param参数值为 : " + param);
System.out.println("param2参数值为 : " + param2);
}
}

(2)新建配置xml文件,parameterTeser.xml

<?xml version="1.0" encoding="UTF-8"?>

<suite name="parameterTester">
<test name="case1">
<parameter name="param" value="param的值"/>
<parameter name="param2" value="param2的值"/>
<classes>
<class name="study.testng.TestParameter" />
</classes>
</test>
</suite>

(3)以这个配置文件运行测试

(4)结果

2、使用@DataProvider传送参数,@DataProvider可以传递一些比较复杂的参数

(1)新建一个测试类TestParameter2

package study.testng;

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; public class TestParameter2 {
@DataProvider(name="user")
public Object[][] Users(){
return new Object[][]{
{"root","passowrd"},
{"cnblogs.com", "tankxiao"},
{"tank","xiao"}
};
}
@Test(dataProvider="user")
public void verifyUser(String userName, String password){
System.out.println("Username: "+ userName + " Password: "+ password);
}
}

(2)点击运行得到如下结果

七、测试报告

默认的测试报告位于当前项目文件夹下的test-output文件夹内,index.html即为总的测试报告(html文件用浏览器打开),tester文件夹下是按测试用例生成的报告,old文件夹下为历史报告。

附:与Junit4的异同比较,可直接参考使用Junit4;

TestNG入门到...的更多相关文章

  1. testng入门教程16数据驱动(把数据写在xml)

    testng入门教程16数据驱动(把数据写在xml) testng入门教程16数据驱动(把数据写在xml)把数据写在xml文件里面,在xml文件右键选择runas---testng执行 下面是case ...

  2. testng入门教程12 TestNG执行多线程测试

    testng入门教程 TestNG执行多线程测试 testng入门教程 TestNG执行多线程测试 并行(多线程)技术在软件术语里被定义为软件.操作系统或者程序可以并行地执行另外一段程序中多个部分或者 ...

  3. TestNG 入门教程【转】

    TestNG 入门教程[转] 国庆7天假期,大部分朋友都出去旅游了,微信圈里全是晒旅游的照片, 东南亚游,欧洲游呀,真是羡慕呀. 悲惨的我只去了上海野生动物园, 在家休息,利用这段假期,把之前学过的东 ...

  4. 自动化测试之 seleniumIDE,Selenium1,selenium2和testNG入门

    由于前期三个月公司的项目一直在改需求阶段,一直是手动测试,现在项目雏形以及基本页面功能都确定下来,为了不让自己陷入天天测同一功能的无限循环中,故开始自动化测试的学习之路,也为自己以后的发展铺铺路. 一 ...

  5. TestNG 入门教程

    原文出处:http://www.cnblogs.com/TankXiao/p/3888070.html 阅读目录 TestNG介绍 在Eclipse中在线安装TestNG 在Eclipse中离线安装T ...

  6. IDEA 单元测试testng入门及testng.xml

    直接进入正题: 1.TestNG的运行方式如下: With a testng.xml file 直接run as test suite With ant 使用ant From the command ...

  7. TestNG 入门指导——理解testng.xml执行/不执行某个包,某个类,某个方法

    这一篇我们主要学习如下几个知识点: ⑴关于testng.xml ⑵创建一个测试套件 ⑶执行testng.xml ⑷在测试套件中创建多个测试用例 ⑸在用例中增加class,packages, metho ...

  8. testng入门教程15数据驱动

    testng在类 里面的数据驱动 package driver_test; import org.testng.annotations.DataProvider; import org.testng. ...

  9. testng入门教程14数据驱动(不同文件)

    数据与test脚本不在同一文件时,下面是数据: package data_driver_two_parts; import org.testng.annotations.DataProvider; p ...

  10. testng入门教程13同文件数据驱动

    下面是@DataProvider有name和没有name时 有name的时候可以引用name 即:@DataProvider(name="testData")----------& ...

随机推荐

  1. ASP.NET CORE API Swagger+IdentityServer4授权验证

    简介 本来不想写这篇博文,但在网上找到的文章博客都没有完整配置信息,所以这里记录下. 不了解IdentityServer4的可以看看我之前写的入门博文 Swagger 官方演示地址 源码地址 配置Id ...

  2. NGINX配置详解及应用

    目录 NGINX    1 1.1    目录结构    1 1.2    基础配置    1 1.3    location    5 1.4    虚拟主机    5 1.5    状态模块    ...

  3. android edittext 获取焦点并弹出软键盘

    editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.requestFocus(); activi ...

  4. Gulp安装笔记

    前言 总的来说,玩gulp的流程是这样的: 安装nodejs -> 全局安装gulp -> 项目安装gulp以及gulp插件 -> 配置gulpfile.js -> 运行任务 ...

  5. 05.UIDynamic

    CHENYILONG Blog 05.UIDynamic Fullscreen © chenyilong. Powered by Postach.io Blog

  6. linux学习记录.5.git & github

    参考 https://www.linuxidc.com/Linux/2016-11/136769.htm 安装 安装 Git: apt-get install git 查看当前版本: git --ve ...

  7. JS设计模式——7.工厂模式(概念)

    工厂模式 本章讨论两种工厂模式: 简单工厂模式 使用一个类(通常是一个单体)来生成实例. 使用场景:假设你想开几个自行车商店(创建自行车实例,组装它,清洗它,出售它),每个店都有几种型号的自行车出售. ...

  8. Android选择头像

    http://www.jianshu.com/p/8b3e78046c1c 注意:在Android6.0之后,使用相机拍照需要权限 在选择头像使用相机拍摄时添加以下代码即可. Acp.getInsta ...

  9. 1->小规模集群架构规划

    "配置无人值守批量安装系统(Cobbler)" "搭建PPTP VPN/ NTP/Firewalld内部共享上网 " "搭建跳板机服务jumpserv ...

  10. mac 升级10.12 php debug 环境 跑不起的解决 解决方案

    1:  mac 升级后发现 php从原来的5.5  升级为 5.6 了...   所以以前 php.ini 里面的配置全部都没有了. mac 给我们做了备份2:  没办法只能升级php对应的插件到5. ...