現在位置:首頁 > Java技術 > TestNG > TestNG參數化測試

TestNG參數化測試

來源:原創文章    由 極客書 更新版本    瀏覽:人次

TestNG的另一個有趣的功能是參數測試。在大多數情況下,你會遇到這樣一個場景,業務邏輯需要一個巨大的不同數量的測試。參數測試,允許開發人員運行同樣的測試,一遍又一遍使用不同的值。

TestNG讓你直接傳遞參數測試方法兩種不同的方式:

  • 使用testng.xml

  • 數據提供程序

傳遞參數使用testng.xml

有了這種技術,在testng.xml文件中定義的簡單參數,然後在源文件中引用這些參數。讓我們看看下麵的例子中如何使用這種技術來傳遞參數。

創建測試案例類

  • 創建一個Java測試類 ParameterizedTest1.java.

  • 測試方法parameterTest()添加到測試類。此方法需要一個字符串作為輸入參數。

  • 添加注釋 @Parameters("myName") 到此方法。該參數將被傳遞testng.xml,在下一步我們將看到一個值。

創建Java類文件名 ParameterizedTest1.java 在 C:\ > TestNG_WORKSPACE

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class ParameterizedTest1 {
    @Test
    @Parameters("myName")
    public void parameterTest(String myName) {
        System.out.println("Parameterized value is : " + myName);
    }
}

創建 TESTNG.XML

創建 testng.xml C:\ > TestNG_WORKSPACE 執行測試案例

<?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="myName" value="manisha"/> 
	<classes>
	    <class name="ParameterizedTest1" />
	    </classes>
    </test>
</suite>
我們還可以定義參數在<suite>級彆。假設我們已經定義在兩個<suite>和<test>級彆myName,在這種情況下,常規的作用域規則適用。這意味著,任何類裡麵<test>標簽將查看值參數定義在<test>,而testng.xml文件中的類的其餘部分將看到定義在<suite>中值

編譯使用javac的測試用例類。

C:\TestNG_WORKSPACE>javac ParameterizedTest1.java

現在,運行testng.xml,其中將運行parameterTest方法。TestNG的將試圖找到一個命名myName的第一<test>標簽的參數,然後,如果它不能找到它,它會搜索包圍在的<suit>標簽。

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

Parameterized value is : manisha

===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================

TestNG 對testng.xml 的參數的類型指定的值會自動嘗試轉換。下麵是支持的類型:

  • String

  • int/Integer

  • boolean/Boolean

  • byte/Byte

  • char/Character

  • double/Double

  • float/Float

  • long/Long

  • short/Short

傳遞參數與數據提供者

當你需要通過複雜的參數或參數需要創建從Java(複雜的對象,對象讀取屬性文件或數據庫等..),在這種情況下,可以將參數傳遞使用數據提供者。數據提供者@DataProvider的批注的方法。這個注解隻有一個字符串屬性:它的名字。如果不提供名稱,數據提供者的名稱會自動默認方法的名稱。數據提供者返回一個對象數組。

讓我們看看下麵的例子使用數據提供者。第一個例子是@DataProvider的使用Vector,String或Integer 作為參數,第二個例子是關於@DataProvider 的使用對象作為參數。

實例 1

在這裡 @DataProvider 通過整數和布爾參數。

創建Java類

創建一個java類PrimeNumberChecker.java。這個類檢查,如果是素數。創建這個類在 C:\ > TestNG_WORKSPACE

public class PrimeNumberChecker {
    public Boolean validate(final Integer primeNumber) {
        for (int i = 2; i < (primeNumber / 2); i++) {
            if (primeNumber % i == 0) {
                return false;
             }
        }
        return true;
    }
}

創建測試案例類

  • 創建一個Java測試類 ParamTestWithDataProvider1.java.

  • 定義方法primeNumbers(),其定義為DataProvider 使用注釋。此方法返回的對象數組的數組。

  • 測試方法testPrimeNumberChecker()添加到測試類中。此方法需要一個整數和布爾值作為輸入參數。這個方法驗證,如果傳遞的參數是一個素數。

  • 添加注釋 @Test(dataProvider = "test1") 到此方法。dataProvider的屬性被映射到"test1".

創建Java類文件名ParamTestWithDataProvider1.java 在 C:\ > TestNG_WORKSPACE

import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParamTestWithDataProvider1 {
    private PrimeNumberChecker primeNumberChecker;

    @BeforeMethod
    public void initialize() {
        primeNumberChecker = new PrimeNumberChecker();
    }

    @DataProvider(name = "test1")
    public static Object[][] primeNumbers() {
        return new Object[][] { { 2, true }, { 6, false }, { 19, true },
        	{ 22, false }, { 23, true } };
    }

    // This test will run 4 times since we have 5 parameters defined
    @Test(dataProvider = "test1")
    public void testPrimeNumberChecker(Integer inputNumber,
        Boolean expectedResult) {
	System.out.println(inputNumber + " " + expectedResult);
	Assert.assertEquals(expectedResult,
        	primeNumberChecker.validate(inputNumber));
    }
}

創建 TESTNG.XML

創建 testng.xml C:\ > TestNG_WORKSPACE 執行測試案例。

<?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="ParamTestWithDataProvider1" />
	    </classes>
    </test>
</suite>

編譯使用javac的測試用例類。

C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java

運行testng.xml.

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

2 true
6 false
19 true
22 false
23 true

===============================================
Suite1
Total tests run: 5, Failures: 0, Skips: 0
===============================================

實例 2

在這裡,@DataProvider 傳遞對象作為參數。

創建Java類

創建一個Java類 Bean.java, 對象帶有 get/set 方法, 在 C:\ > TestNG_WORKSPACE.

public class Bean {
    private String val;
    private int i;
    public Bean(String val, int i){
        this.val=val;
        this.i=i;
    }
    public String getVal() {
	return val;
    }
    public void setVal(String val) {
	this.val = val;
    }
    public int getI() {
	return i;
    }
    public void setI(int i) {
	this.i = i;
    }
}

創建測試案例類

  • 創建一個Java測試類 ParamTestWithDataProvider2.java.

  • 定義方法primeNumbers(),其定義為DataProvider使用注釋。此方法返回的對象數組的數組。

  • 添加測試類中測試方法TestMethod()。此方法需要對象的bean作為參數。

  • 添加注釋 @Test(dataProvider = "test1") 到此方法.  dataProvider 屬性被映射到 "test1".

創建Java類文件名 ParamTestWithDataProvider2.java 在 C:\ > TestNG_WORKSPACE

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class ParamTestWithDataProvider2 {
    @DataProvider(name = "test1")
    public static Object[][] primeNumbers() {
        return new Object[][] { { new Bean("hi I am the bean", 111) } };
    }

    @Test(dataProvider = "test1")
    public void testMethod(Bean myBean) {
        System.out.println(myBean.getVal() + " " + myBean.getI());
    }
}

創建 TESTNG.XML

創建一個文件 testng.xml C:\ > TestNG_WORKSPACE 來執行測試用例.

<?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="ParamTestWithDataProvider2" />
	    </classes>
    </test>
</suite>

編譯使用javac的測試用例類。

C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java

運行 testng.xml.

C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml

驗證輸出。

hi I am the bean 111

===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================

本站文章除注明轉載外,均為本站原創或編譯
歡迎任何形式的轉載,但請務必注明出處,尊重他人勞動,傳播學習教學;
轉載請注明:文章轉載自:極客書 [http://www.gitbook.net]
本文標題:TestNG參數化測試
轉載請保留原文鏈接:http://www.gitbook.net/html/testng/2013/0916303.html
上一篇:TestNG依賴測試      下一篇:TestNG運行JUnit測試