目录

一、概述

二、@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. Python入门系列教程(三)列表和元组

    增 1.insert A = ['] A.insert(0,0) print A 2.append A = ['] A.append(7) print A 3.extend A = ['] B = [ ...

  2. CentOS 6 / RHEL 6配置bonding 4模式

    实现bond 802.3ad or 4 模式:(IEEE 802.3ad), 方式:创建一个整合的组,这个组会共享网速和网络双工(duplex)设置.模式 4 会根据 IEEE 802.3ad 标准使 ...

  3. 怎么样通过编写Python小程序来统计测试脚本的关键字

    怎么样通过编写Python小程序来统计测试脚本的关键字 通常自动化测试项目到了一定的程序,编写的测试代码自然就会很多,如果很早已经编写的测试脚本现在某些基础函数.业务函数需要修改,那么势必要找出那些引 ...

  4. MySQL防范SQL注入风险

    MySQL防范SQL注入风险 0.导读 在MySQL里,如何识别并且避免发生SQL注入风险 1.关于SQL注入 互联网很危险,信息及数据安全很重要,SQL注入是最常见的入侵手段之一,其技术门槛低.成本 ...

  5. 通过BurpSuite和sqlmap配合对dvwa进行sql注入测试和用户名密码暴力破解

    0x1 工具和环境介绍 dvwa:渗透测试环境 BurpSuite:强大的WEB安全测试工具 sqlmap:强大的sql注入工具 以上工具和环境都在kali linux上安装和配置. 0x2 步骤说明 ...

  6. 更改arch的默认终端

    实在是厌倦了gnome的资源管理器nautilus和终端gnome-terminal,于是卸载之,然后更换了xfce4的终端,但是出现了一个问题,那就是在资源管理器中使用邮件打开终端的时候打不开了,解 ...

  7. Wannacry样本取证特征与清除

    一.取证特征 1)网络域名特征 http://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com 2)文件特征 母体文件 mssecsvc.exe c: ...

  8. C# WebClient进行FTP服务上传文件和下载文件

    定义WebClient使用的操作类: 操作类名称WebUpDown WebClient上传文件至Ftp服务: //// <summary> /// WebClient上传文件至Ftp服务 ...

  9. linux用户权限 -> 系统用户管理

    用户基本概述: Linux用户属于多用户操作系统,在windows中,可以创建多个用户,但不允许同一时间多个用户进行系统登陆,但是Linux可以同时支持多个用户同时登陆操作系统,登陆后互相之间并不影响 ...

  10. Gradle教程链接

    Gradle教程:https://www.yiibai.com/gradle/ https://www.cnblogs.com/wxishang1991/p/5532006.html