testNG入门学习(一)

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");
	}

}

输出结果:
this is beforeSuite
this is a beforeTest
this is before class
this is a beforeMethod
this is a testcase1
this is a afterMethod
this is a beforeMethod
this is a testcase2
this is a afterMethod
this is after class
this is a afterTest
this is afterSuite

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>

运行结果:
计算机初始化
减法结果:9
计算机初始化
加法结果:5
计算机初始化
除法结果:3

从结果中可以看出方法是按顺序执行的。

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



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值