TestNG 使用教程讲解
一、Testng 介绍
Testng是一套开源测试框架,是从Junit继承而来;TestNG支持多种注解,可以进行各种组合,如下进行简单的说明
1、最常用的注解及描述如下:
@BeforeClass 在调用当前类的第一个测试方法之前运行,注释方法仅运行一次
@AfterClass 在调用当前类的第一个测试方法之后运行,注释方法仅运行一次
@Test 将类或方法标记为测试的一部分,此标记若放在类上,则该类所有公共方法都将被作为测试方法
@Listeners 定义测试类上的侦听器
2、比较常用的注解及描述如下:
@BeforeTest 注释的方法将在属于test标签内的类的所有测试方法运行之前运行
@AfterTest 注释的方法将在属于test标签内的类的所有测试方法运行之后运行
@BeforeMethod 注释方法将在每个测试方法之前运行
@AfterMethod 注释方法将在每个测试方法之后运行
@Parameters 描述如何将参数传递给@Test方法
2、了解即可的注解及描述如下:
@BeforeSuite 在该套件的所有测试都运行在注释的方法之前,仅运行一次
@AfterSuite 在该套件的所有测试都运行在注释方法之后,仅运行一次
@BeforeGroups 配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行
@AfterGroups 此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行
@DataProvider 标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称
@Factory 将一个方法标记为工厂,返回TestNG将被用作测试类的对象。 该方法必须返回Object []
二、在pom.xml中引入testng测试框架
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.10</version>
</dependency>
三、使用Test运行测试用例
1、运行单个测试用例
import org.testng.annotations.Test;
public class testng {
@Test
public void abc(){
System.out.println("这里是abc");
}
}
2、运行多个测试用例
import org.testng.annotations.Test;
public class testng {
@Test
public void abc(){
System.out.println("这里是abc");
}
@Test
public void abc1(){
System.out.println("这里是abc1");
}
@Test
public void abc2(){
System.out.println("这里是abc2");
}
}
三、最常用的注解使用
1、最常用注解使用:
①、@BeforeClass & @AfterClass
在运行类之前或之后执行一次,@BeforeClass 中可写入初始数据,@AfterClass 清除数据
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class testng_before_after_class {
// 运行testng_before_after_class类的时,会执行一次
@BeforeClass
public void BeforeClass(){
System.out.println("BeforeClass被运行");
}
@AfterClass
public void AfterClass(){
System.out.println("AfterClass被运行");
}
// 运行每个测试方法进都会被执行到
@Test
public void abc(){
System.out.println("这里是abc");
}
@Test
public void abc1(){
System.out.println("这里是abc1");
}
@Test
public void abc2(){
System.out.println("这里是abc2");
}
}
②、创建xml文件
class name需要与测试的class类名一致 ,一个测试套件可以包含多个类
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!--可以同时开启多条线程进行测试任务-->
<suite name="Suite1" parallel="methods" thread-count="2">
<test name="test12">
<classes>
<class name="TestXxyx" >
</class>
</classes>
</test>
</suite>
③、运行testng.xml
④、控制台打印结果
2、@AfterMethod & @BeforeMethod
import org.testng.annotations.*;
public class testng_method {
// 运行每个测试方法进都会被执行到
@BeforeMethod
public void BeforeMethod(){
System.out.println("BeforeMethod被运行");
}
@AfterMethod
public void AfterMethod(){
System.out.println("AfterMethod被运行");
}
@Test
public void abc(){
System.out.println("这里是abc");
}
@Test
public void abc1(){
System.out.println("这里是abc1");
}
@Test
public void abc2(){
System.out.println("这里是abc2");
}
}
3、@Test(enabled = false)
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class testng_enable {
@Test(enabled = false)
public void abc(){
System.out.println("这里是abc");
}
@Test
public void abc1(){
System.out.println("这里是abc1");
}
@Test
public void abc2(){
System.out.println("这里是abc2");
}
}
4、执行顺序
①、按xml中方法顺序执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!--可以同时开启多条线程进行测试任务-->
<suite name="Suite1" parallel="methods" thread-count="2">
<test name="test12">
<classes>
<class name="testng_enable" >
<methods>
<include name="abc2" />
<include name="abc1" />
</methods>
<!--<class name="testng_base" >-->
</class>
</classes>
</test>
</suite>
②、按默认顺序执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<!--可以同时开启多条线程进行测试任务-->
<suite name="Suite1" parallel="methods" thread-count="2">
<test name="test12" preserve-order="true">
<classes>
<class name="testng_enable" >
<methods>
<include name="abc2" />
<include name="abc1" />
</methods>
<!--<class name="testng_base" >-->
</class>
</classes>
</test>
</suite>
5、构造参数化@Parameters(“”)
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class testng_parameters {
//参数化
@Test
@Parameters("username")
public void function8(String test1) {
System.out.println("name == " + test1);
}
}
6、引入testng断言
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class testng_assert {
@Test
public void assertTest(){
String str1 = "testerhome";
String str2 = "testerhome";
Assert.assertEquals(str1,str2,"判断是否相等");
boolean bl = true;
boolean b2 = false;
Assert.assertTrue(bl,"判断是否为true");
Assert.assertFalse(b2,"判断是否为false");
Object str3 = null ;
Assert.assertNull(str3,"判断是否为nul");
Assert.assertNotNull(str3,"判断是否不为null");
}
}
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class testng_assert {
@Test
public void assertTest(){
String str1 = "testerhome";
String str2 = "testerhome1";
Assert.assertEquals(str1,str2,"判断是否相等");
boolean bl = true;
boolean b2 = false;
Assert.assertTrue(bl,"判断是否为true");
Assert.assertFalse(b2,"判断是否为false");
Object str3 = null ;
Assert.assertNull(str3,"判断是否为nul");
Assert.assertNotNull(str3,"判断是否不为null");
}
}
6、@Listener
监听器
package Listener;
import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
import org.testng.ITestResult;
public class CustomListener1 implements IInvokedMethodListener {
@Override
public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
System.out.println("beforeInvocation:" + iTestResult.getTestClass().getName() + "-->" + iInvokedMethod.getTestMethod().getMethodName());
}
@Override
public void afterInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
System.out.println("beforeInvocation" + iTestResult.getTestClass().getName() + "-->" + iInvokedMethod.getTestMethod().getMethodName());
}
}
监听方法
package ListenerDemo;
import org.testng.Assert;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
import Listener.CustomListener1;
@Listeners(CustomListener1.class)//通过注释调用监听器
public class ListenerTest {
@Test(alwaysRun = true)
public void test() {
System.out.println("test()");
Assert.assertTrue(false);
}
@Test
public void test2() {
System.out.println("test2()");
Assert.assertTrue(true);
}
}
testng.xml中的配置
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Regression Test">
<test name="Application name" preserve-order="false">
<classes>
<class name="ListenerDemo.ListenerTest"></class>
</classes>
</test>
</suite>
运行testng.xml结果如下: