TestNG介绍
TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试(隔离测试一个类)到集成测试(测试由多个类多包甚至多个外部框架组成的系统)。
在Eclipse中安装TestNG
方法一、在线安装:
打开Eclipse Help ->Install New Software , 然后Add "http://beust.com/eclipse"
方法二、
1.下载附件,并解压。百度网盘:http://pan.baidu.com/s/1i3y1QtR
2.将解压后的文件..\eclipse-testng离线包\features\目录下的文件夹org.testng.eclipse_6.8.6.20130607_0745放到eclipse-->features目录下
3.将解压后的文件..\eclipse-testng离线包\org.testng.eclipse_6.8.6.20130607_0745文件夹放到eclipse-->plugins目录下
4.重启eclipse
5.验证是否安装成功,windows->preferences,如下图
TestNG的基本注解
注解 | 描述 |
---|---|
@BeforeSuite | 被注释的方法将在所有测试运行前运行 |
@AfterSuite | 被注释的方法将在所有测试运行后运行 |
@BeforeClass | 被注释的方法将在当前类的第一个测试方法调用前运行。 |
@AfterClass | 被注释的方法将在当前类的所有测试方法调用后运行。 |
@BeforeTest | 被注释的方法将在测试运行前运行 |
@AfterTest | 被注释的方法将在测试运行后运行 |
@BeforeGroups | 被配置的方法将在列表中的group前运行,这个方法保证在第一个属于这些组的测试方法调用前立即执行。 |
@AfterGroups | 被配置的方法将在列表中的group后运行,这个方法保证在最后一个属于这些组的测试方法调用后立即执行。 |
@BeforeMethod | 被注释的方法将在每一个测试方法调用前运行。 |
@AfterMethod | 被注释的方法将在每一个测试方法调用后运行。 |
@DataProvider |
标记一个方法用于为测试方法提供数据。被注释的方法必须返回object[][],其中每个object[]可以指派为这个测试方法的参数列表。从这个DataProvider接受数据@Test方法需要用一个和当前注释相同名称的dataProvider名称。
|
@Factory | 标记方法作为一个返回对象的工厂,这些对象将被TestNG用于作为测试类。这个方法必须返回object[]. |
@Listeners | 定义一个测试类的监听器。 |
@Parameters | 描述如何将参数传递给@Test方法。 |
@Test | 标记一个类或方法作为测试的一部分。 |
下面是TestNG的简单的一个例子,可以看到注释都是如何工作的
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class TestNGLearn {
@BeforeSuite
public void beforeSuite(){
System.out.println("this is beforeSuite");
}
@AfterSuite
public void afterSuite(){
System.out.println("this is afterSuite");
}
@BeforeClass
public void beforeClass(){
System.out.println("this is before class");
}
@AfterClass
public void afterClass(){
System.out.println("this is after class");
}
@BeforeTest
public void beforeTest(){
System.out.println("this is a beforeTest");
}
@AfterTest
public void afterTest(){
System.out.println("this is a afterTest");
}
@BeforeMethod
public void beforeMethod(){
System.out.println("this is a beforeMethod");
}
@AfterMethod
public void afterMethod(){
System.out.println("this is a afterMethod");
}
@Test
public void testNgLearn(){
System.out.println("this is a testcase1");
}
@Test
public void testNgLearn1(){
System.out.println("this is a testcase2");
}
}
TestNG中如何执行测试
第一种直接执行:右键要执行的方法,点Run As ->TestNG Test
第二种: 通过testng.xml文件来执行. 把要执行的case, 放入testng.xml文件中。 右键点击testng.xml, 点Run As
testng.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="test1">
<classes>
<class name="com.study.testng.TestCalculate" />
</classes>
</test>
</suite>
TestNG测试准备工作
我们编写一个Calculator类,这是一个能够简单实现加减乘除、平方、开方的计算器类,方法中故意设置了一些错误,然后对这些功能进行单元测试。
public class Calculate {
private static int result;
public void add(int n){
result+=n;
}
public void substract(int n){
result=result-1; //方法有错误
}
public void multiply(int n){
//方法未写好
}
public void divide(int n){
result=result/n;
}
public void twoMultiply(int n,int m){
result=m*n;
}
public void squareRoot(int n){
for(;;); //Bug:死循环
}
public void clear(){
result=0; //将结果清零
}
public int getResult(){
return result;
}
}
TestNG按顺序执行Case
在testng.xml中,可以控制测试用例按顺序执行。 当preserve-order="true"是,可以保证节点下面的方法是按顺序执行的
package com.study.testng;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TestCalculate {
Calculate calculate=new Calculate();
@BeforeMethod
public void init(){
calculate.clear();
System.out.println("计算机初始化");
}
@Test
public void testAdd(){
calculate.add(2);
calculate.add(3);
System.out.println("加法结果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),5);
}
@Test
public void testSubstract() {
calculate.add(10);
calculate.substract(2);
System.out.println("减法结果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(), 8);
}
@Test
public void testDivide(){
calculate.add(9);
calculate.divide(3);
System.out.println("除法结果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),3);
}
}
然后我们在文件testng.xml中指定执行顺序:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="test1" <span style="color:#FF0000;">preserve-order="true"</span>>
<classes>
<class name="com.study.testng.TestCalculate" />
<methods>
<include name="testSubstract" />
<include name="testAdd" />
<include name="testDivide" />
</methods>
</classes>
</test>
</suite>
TestNG异常测试
public class TestCalculate {
Calculate calculate=new Calculate();
@BeforeMethod
public void init(){
calculate.clear();
System.out.println("计算机初始化");
}
@Test(expectedExceptions=ArithmeticException.class,expectedExceptionsMessageRegExp="/ by zero")
public void testDivide(){
calculate.add(9);
calculate.divide(0);
System.out.println("除法结果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),3);
}
}
testNG组测试
我们的测试类如下,一个测试方法可以同时属于多个不同的测试组:
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class TestCalculateGroup {
Calculate calculate=new Calculate();
@BeforeMethod
public void init(){
calculate.clear();
System.out.println("计算机初始化");
}
@Test(groups={"groupone"})
public void testAdd(){
calculate.add(2);
calculate.add(3);
System.out.println("加法结果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),5);
}
@Test(groups={"groupone"})
public void testSubstract() {
calculate.add(10);
calculate.substract(2);
System.out.println("减法结果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(), 8);
}
@Test(groups={"groupone","grouptwo"})
public void testDivide2(){
calculate.add(9);
calculate.divide(3);
System.out.println("除法结果2:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),3);
}
@Test(groups={"grouptwo"},expectedExceptions=ArithmeticException.class,expectedExceptionsMessageRegExp="/ by zero")
public void testDivide1(){
calculate.add(9);
calculate.divide(0);
System.out.println("除法结果1:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),3);
}
}
testng.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="test1">
<groups>
<run>
<include name="grouptwo"></include>
</run>
</groups>
<classes>
<class name="com.study.testng.TestCalculateGroup" />
</classes>
</test>
</suite>
testNG参数化测试
软件测试中,经常需要测试大量的数据集。 测试代码的逻辑完全一样,只是测试的参数不一样。 这样我们就需要一种 “传递测试参数的机制”。 避免写重复的测试代码
TestNG提供了2种传递参数的方式。
第一种: testng.xml 方式使代码和测试数据分离,方便维护
第二种:@DataProvider能够提供比较复杂的参数。方法一: 通过testng.xml 传递参数给测试代码
public class TestCalculateParam {
Calculate calculate=new Calculate();
@BeforeMethod
public void init(){
calculate.clear();
System.out.println("计算机初始化");
}
@Test
@Parameters({"m","n","result"})
public void testAdd(int m,int n,int result){
calculate.add(m);
calculate.add(n);
System.out.println("加法的结果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),result);
}
}
testng.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1">
<test name="test1">
<parameter name="m" value="3"/>
<parameter name="n" value="4" />
<parameter name="result" value="7"/>
<classes>
<class name="com.study.testng.TestCalculateParam" />
</classes>
</test>
<test name="test2">
<parameter name="m" value="4"/>
<parameter name="n" value="5" />
<parameter name="result" value="9"/>
<classes>
<class name="com.study.testng.TestCalculateParam" />
</classes>
</test>
</suite>
方式二: 通过DataProvider传递参数
public class TestCalculateParam {
Calculate calculate=new Calculate();
@BeforeMethod
public void init(){
calculate.clear();
System.out.println("计算机初始化");
}
@DataProvider(name="mydata")
public Object[][] creater(){
return new Object[][]{
{3,3,6},
{3,7,10}
};
}
@Test(dataProvider="mydata")
public void testAdd1(int m,int n,int result){
calculate.add(m);
calculate.add(n);
System.out.println("加法运算结果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),result);
}
}
testNG忽略测试
有时候代码功能还没实现,但是测试用例已经写好了, 可以给测试用例加上@Test(enable = false), 来禁用此测试用例,等代码完成后再开发这个测试用例。
@Test(enabled=false)
public void testMultiply(){
calculate.add(2);
calculate.multiply(3);
System.out.println("乘法结果:"+calculate.getResult());
Assert.assertEquals(calculate.getResult(),6);
}
testNG依赖测试
有时候,我们需要按顺序来调用测试用例, 那么测试用例之间就存在依赖关系。 TestNG支持测试用例之间的依赖
public class DependsTest {
@Test
public void setupEnv(){
System.out.println("this is setup Env");
}
@Test(dependsOnMethods = {"setupEnv"})
public void testMessage(){
System.out.println("this is test message");
}
}
testNG测试报告
测试报告是测试非常重要的部分.
TestNG默认情况下,会生产两种类型的测试报告HTML的和XML的。 测试报告位于 "test-output" 目录下.
file:///F:/eclipseworkSpace/testNG/test-output/Suite1/test1.html
文本参考了一些网络资料:
http://www.cnblogs.com/TankXiao/p/3888070.html