目录

一、概述

二、@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. vuejs2.0 vue实例的生命周期

    每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 DOM .下图展示的就是一个v ...

  2. Java并发编程原理与实战十六:AQS

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  3. Informatica学习:2、配置存储库服务和集成服务

    继续上一篇的1.安装介质的获取与安装,本文介绍服务端的存储库服务和集成服务的配置. 安装好Informatica的客户端和服务端后,需要登陆Administration Console,配置存储库服务 ...

  4. HDU 6205 (模拟) card card card

    题目链接 Problem Description As a fan of Doudizhu, WYJ likes collecting playing cards very much. One day ...

  5. Ubuntu 通过 Live CD 更新grub恢复引导Boot Menu

    工作需要更换主板,但是不想重装电脑. 怎么办呢? 其实并不需要重装电脑,只需要回复boot menu即可. 1. 首先用u盘制作一个ubuntu的live CD(请自行百度),然后通过u盘启动, 选择 ...

  6. base64 与字符串互转

    #region 将Base64编码的文本转换成普通文本 /// <summary> /// 将Base64编码的文本转换成普通文本 /// </summary> /// < ...

  7. 下拉框 select

    1.select 用来做什么? select 用于实现下来下拉列表,其 html 结构是这样的: <select name="city" id="city" ...

  8. 20165329 Java实验二:面向对象编程

    实验内容: 面向对象程序设计-1 实验要求: 提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图 实验步骤: 1.按照老师博客的要求新建一个MyUtil项目 在src内新建ja ...

  9. 2016.07.13-vector<vector<int>>应用2——Two Sum扩展

    收获: vector<vector<int> >res,不能直接用res[j].push_back(number),因为res[j]是空的,没有初始化 可以先定义 vector ...

  10. 【codeforces】【比赛题解】#855 Codefest 17

    神秘比赛,以<哈利波特>为主题……有点难. C题我熬夜切终于是写出来了,可惜比赛结束了,气啊. 比赛链接:点我. [A]汤姆·里德尔的日记 题意: 哈利波特正在摧毁神秘人的分灵体(魂器). ...