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

}

 

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