TestNG - 參數化測試

一、前言

  在自動化測試項目中,參數化是必不可少的,以下將會介紹TestNG中的參數化測試運用。

  TestNG可以通過兩種不同的方式將參數直接傳遞給測試方法:

  • 使用testng.xml
  • 使用數據提供者

二、使用testng.xml傳送參數

1、示例代碼如下:

package com.tech.design;

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

public class Case {
    @Test
    @Parameters({"username","password"})
    public void Login(String username, String password){
        System.out.println("您的用戶名是:"+username);
        System.out.println("您的密碼是:"+password);
    }
}

2、xml配置如下:

<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >

<suite name="Suite1" verbose="1" >
    <test name="param">
        <parameter name="username" value="李白"></parameter>
        <parameter name="password" value="123456"></parameter>
        <classes>
            <class name="com.tech.design.Case"></class>
        </classes>
    </test>
</suite>

3、運行xml,結果如下:

三、使用@DataProvider傳遞參數

  如果需要傳遞複雜的參數或java創建的對象(複雜對象、從屬性文件或數據庫讀取數據等),通過testng.xml文件的方式可能不太適合。這種情況可以使用數據驅動的方式爲你的測試提供數據。數據庫驅動是在類中定義一個方法,返回一組數據對象。該方法使用@DataProvider註解。

  此處需要注意,傳參的類型必須要一致,且帶有@DataProvider註解的函數返回的必然是Object[][],此處需要注意。

  通過DataProvider,返回值分別是Object[][]和Iterator<Object[]>

1、返回值是Object[][],代碼如下:

package com.tech.design;

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

public class Case {

    @DataProvider(name = "data")
    public Object[][] provideData(){
        return new Object[][] { {"李白",100},{"杜甫",110},{"魯班",210} };
    }
  //若調用者和提供在不同的類,則寫法如下
  //
@Test(dataProvider = "data",dataProviderClass = Case.class)
    @Test(dataProvider = "data")
    public void Test(String par1, int par2){
        System.out.println("姓名:"+par1+","+"年齡:"+par2);
    }

}

2、返回值是Iterator<Object[]>,代碼如下:

  輸出:

  4

  5

package com.tech.design;

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

import java.util.HashSet;
import java.util.Iterator;

public class Case {
    @DataProvider(name="testdp")
    public static Iterator<Object[]> createData() {
        HashSet<Integer> set = new HashSet<Integer>();
        set.add(Integer.valueOf(4));
        set.add(Integer.valueOf(5));

        HashSet<Object[]> so = new HashSet<Object[]>();
        for(Integer intg:set){
            so.add(new Object[]{intg});
        }

        return so.iterator();
    }

    @Test(dataProvider="testdp")
    public void login(Integer caseNum) {
        System.out.println(caseNum);
    }

}

3、dataProvider方法可接受 的參數:Method method, ITestContext context

  參數可以傳其中一個,也可以兩個一起傳入,這裏只演示Method參數,

  用處:當多個測試方法使用同一個@DataProvider提供的測試數據,並希望不同的測試方法返回不同的值時,這是很有用的方式

  示例:定義1個數據提供方法和2個測試方法。

package com.tech.design;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.lang.reflect.Method;public class Case {
    @DataProvider(name = "datapro")
    public Object[][] Data(Method method){
        System.out.println("當前測試方法爲:"+method.getName());
        Object[] S1 = new Object[]{"李白"};
        Object[] S2 = new Object[]{"張楚"};
        if(method.getName().equals("Test2")){
            return new Object[][] {S1};
        }else {
            return new Object[][] {S2};
        }
    }

    @Test(dataProvider = "datapro")
    public void Test1(String s){
        System.out.println(s);
    }
    @Test(dataProvider = "datapro")
    public void Test2(String s){
        System.out.println(s);
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章