1. 程式人生 > >testNG入門學習(一)

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