介绍
TestNG是一个开源自动化测试框架,其灵感来自JUnit和NUnit,TestNG还涵盖了整个核心的JUnit4功能,但引入了一些新的功能,使其功能更强大,使用更方便。TestNG支持JDK7以上的版本;他提供包括Eclipse、NetBeans、IDEA IntelliJ的插件支持。熟悉JUnit4的同学入门TestNG会非常的轻松!个人感觉TestNG较Junit4最大的不同就是通过配置文件对用例进行运行时的配置管理。另外支持依赖测试和多线程测试也是其亮点。本文主要介绍TestNG的环境搭建、xml配置、常用的注解和常用断言,目的是让大家入门TestNG,在后面的文章中还会持续地对TestNG的其他功能(依赖测试、多线程、分组、参数传递、用例失败重试等等)进行讲解。
环境搭建
1.以Eclipse为例,在Eclipse中安装插件TestNG for Eclipse
插件安装成功后,重启eclipse即可。
2.创建一个TestNG用例,如下图:
3.设置用例选用的标签,如下图:
TestNG基础用例代码如下:
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
importorg.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import static org.testng.Assert.assertEquals;
public class Case1 {
@Test
public void f1() {
System.out.println("f11");
assertEquals("a","b");
}
@Test
public void f2() {
System.out.println("f21");
assertEquals("a","a");
}
@BeforeMethod
public void beforeMethod(){
System.out.println("beforeMethod1");
}
@AfterMethod
public void afterMethod() {
System.out.println("afterMethod1");
}
@BeforeClass
public void beforeClass() {
System.out.println("BeforeClass1");
}
@AfterClass
public void afterClass(){
System.out.println("afterClass1");
}
@BeforeTest
public void beforeTest() {
System.out.println("beforeTest1");
}
@AfterTest
public void afterTest() {
System.out.println("afterTest1");
}
@BeforeSuite
public void beforeSuite() {
System.out.println("beforeSuite1");
}
@AfterSuite
public void afterSuite() {
System.out.println("afterSuite1");
}
}
不难看出TestNg的测试用例设计模式几乎与juint4一致,最后我们运行用例。鼠标右键Run As>TestNG Test
运行结果如下:
配置文件
xml配置文件
Testng通过配置文件来完成suite功能,即:一次运行多个测试类。在项目根目录testng下,编辑xml文件,testng.xml,xml文件名自定义。内容如下:
在配置好的xml文件中,右键选择TestNG Suite完成多用例的执行
配置文件中的常用标签
<suite> 套件,根标签,通常由几个<test组成>
属性:
name 套件的名称,必须属性;
verbose 运行的级别或详细程度;
parallel 是否运行多线程来运行这个套件;
thread-count 如果启用多线程,用于指定开户的线程数;
annotations 在测试中使用的注释类型;
time-out 在本测试中的所有测试方法上使用的默认超时时间;
<test> 测试用例,name为必须属性。选择测试脚本可以从包、类、方法三个层级进行;
<packages> 用例中包含的包,包中所有的方法都会执行,子标签为;
<package> 测试包,name为必须属性;
<classes> 用例中包含的类,子标签为;
<class> 测试类,其中属性name为必须属性;;
<methods> 指定测试类中包含或排除的方法,子类为,;
<include> 指定需要测试的方法,name为必须属性;
<exclude> 指定类中不需要测试的方法,name为必须属性;
<groups> 指定测试用例中要运行或排除运行的分组,子标签为<run>,<run>下包含<include>,<exclude>标签,<include>,<exclude>的name指定运行、不运行的分组;
java命令执行suite
使用命令java –cp完成suite的运行。java
-cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库和jar包,需要全路径到jar包,多个jar包之间连接符:window上分号“;”.Linux下使用“:”,具体命令如下:
java -cp你的testngjar包所在目录;你要测试类的bin目录
org.testng.TestNG 你的配置文件所在目录\testng.xml
例如:
java -cp
E:/eclipse-committers-photon-R-win32-x86_64/eclipse/plugins/*;
C:\Users\Kevin\eclipse-workspace\TestNGDemo\bin
org.testng.TestNG
C:\Users\Kevin\eclipse-workspace\TestNGDemo\testng.xml
测试用例常用注解
@BeforeSuite 在该套件的所有测试都运行在注释的方法之前,仅运行一次(套件测试是一起运行的多个测试类)。
@AfterSuite 在该套件的所有测试都运行在注释方法之后,仅运行一次。
@BeforeClass 在调用当前类的第一个测试方法之前运行,注释方法仅运行一次。
@AfterClass 在调用当前类的第一个测试方法之后运行,注释方法仅运行一次。
@BeforeTest 注释的方法将在属于<test>标签内的类的所有测试方法运行之前运行。
@AfterTest 注释的方法将在属于<test>标签内的类的所有测试方法运行之后运行。
@BeforeGroups 配置方法将在之前运行组列表。此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行。
@AfterGroups 此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行。
@BeforeMethod 注释方法将在每个测试方法之前运行。
@AfterMethod 注释方法将在每个测试方法之后运行。
@Test 将类或方法标记为测试的一部分。
@Parameters 描述如何将参数传递给@Test方法。
@DataProvider 标记一种方法来提供测试方法的数据。注释方法必须返回一个Object[] [],其中每个Object []可以被分配给测试方法的参数列表。要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称。
@Factory 将一个方法标记为工厂,返回TestNG将被用作测试类的对象。该方法必须返回Object[]。
@Listeners 定义测试类上的侦听器。
常用断言
TestNG的常用断言与Junit4几乎一致!
assertEqual ([String message], expectedvalue, actual value) 断言两个值相等。值可能是类型有 int, short, long, byte, char or java.lang.Object. 第一个参数是一个可选的字符串消息;
assertTrue([String message], boolean condition) 断言一个条件为真;
assertFalse([String message],booleancondition) 断言一个条件为假;
assertNotNull([String message], java.lang.Objectobject) 断言一个对象不为空(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.;
总结
熟悉JUnit4的同学读完这篇文章就会觉得非常轻松,因为TestNG的整体设计跟JUnit4是非常相似的!大家学习TestNG只要注意其使用xml来管理用例以及对比其和JUnit4的标签使用就能够在工作中上手工作了!至于TestNG其他的一些高级功能在大家的实际工作中的应用是比较有限的!在后面的文章中,我会持续地对TestNG的其他功能进行介绍!原创不易,如果文章帮到了你,欢迎转发,让更多的朋友受益!