当前位置 : 主页 > 网络安全 > 测试自动化 >

TestNG数据驱动

来源:互联网 收集:自由互联 发布时间:2021-06-19
T estNG数据驱动 testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。 @DataProvider 注解简介: @DataProvider标记专门为测试方法提供参数

TestNG数据驱动

testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。

@DataProvider注解简介:

@DataProvider标记专门为测试方法提供参数的方法。这类方法必须返回Object[ ][ ]类型的二维数组或者Iterator<Object>[],每一行Object[],都是测试方法的一个测试数据集,测试方法会为每个测试数据集执行一次。如果没有指定参数的名称,则默认为方法的名称,方法的名称没有限制。

 

@DataProvider的小例子:

import java.lang.reflect.Method;

 

import org.testng.annotations.DataProvider;

import org.testng.annotations.Test;

 

public class test {

    @DataProvider(name = "user")

    public Object[][] createUser(Method m) {

        System.out.println(m.getName());

        return new Object[][] { { "root""root" }, { "test""root" }, { "test""test" } };

    }

 

    @Test(dataProvider = "user")

    public void verifyUser(String username, String password) {

        System.out.println("Verify User : " + username + ":" + password);

        assert username.equals(password);

    }

 

}

如上所示@DataProvider注解了createUser方法,返回的二位数组里有三行数据,每行两列。所以@Test(dataProvider = "user")注解的verifyUser方法有两个参数,用来接收每一行的两个数据,如果createUser返回的数据数组的列数和verifyUser的参数个数不同就会报错的。因为返回的有三行,所以verifyUser会被执行三次。结果如下:

PASSED: verifyUser("root", "root")

FAILED: verifyUser("test", "root")

PASSED: verifyUser("test", "test")

CSV文件数据读取和@DataProvider

我自己做了一个以csv为例的测试架子,部分代码可通用。

 

CSV文件读取类(可通用,目录自己可以修改,也可改变成读取EXCEL、TXT等文件):

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.TreeMap;

import java.util.regex.Matcher;

 

public class CSVData implements Iterator<Object[]> {

 

    private BufferedReader br        = null;

    //行数

    private int            rowNum    = 0;

    //获取次数

    private int            curRowNo  = 0;

    //列数

    private int            columnNum = 0;

    //key

    private String[]       columnName;

    //csv中所有行数据

    private List<String>   csvList;

    //实际想要的行数据

    private List<String>   csvListNeed;

 

    /*

    * TestNG中由@DataProvider(dataProvider = "name")修饰的方法

    * csv时,调用此类构造方法(此方法会得到列名并将当前行移到下以后)执行后,转发哦

    * TestNG自己的方法中去,然后由它们调用此类实现的hasNext()next()方法

    * 得到一行数据,然后返回给由@Test(dataProvider = "name")修饰的方法,如此

    * 反复到数据读完为止

    * 

    * 

    * @param filepath CSV文件名

    * @param casename 用例名

    */

    public CSVData(String fileName, String caseId) {

        try {

            File directory = new File(".");

            String ss = "resources.";

            File csv = new File(directory.getCanonicalFile() + "\\src\\test\\" + ss.replaceAll("\\.", Matcher.quoteReplacement("\\"))

                                + fileName + ".csv");

 

            br = new BufferedReader(new FileReader(csv));

            csvList = new ArrayList<String>();

            while (br.ready()) {

                csvList.add(br.readLine());

                this.rowNum++;

            }

            String stringValue[] = csvList.get(0).split(",");

            this.columnNum = stringValue.length;

 

            columnName = new String[stringValue.length];

 

            for (int i = 0; i < stringValue.lengthi++) {

 

                columnName[i] = stringValue[i].toString();

 

            }

            this.curRowNo++;

            csvListNeed = new ArrayList<String>();

            for (int i = 1; i < rowNumi++) {

                String values[] = csvList.get(i).split(",");

                if (caseId.equals(values[0])) {

                    csvListNeed.add(csvList.get(i));

                }

            }

            this.rowNum = 2;//就取一行

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

    @Override

    public boolean hasNext() {

        if (this.rowNum == 0 || this.curRowNo >= this.rowNum) {

            try {

                br.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

            return false;

        } else {

            return true;

        }

    }

 

    @Override

    public Object[] next() {

        /*

        * 将数据放入map 

        */

        Map<String, String> s = new TreeMap<String, String>();

        String csvCell[] = csvListNeed.get(0).split(",");

        for (int i = 0; i < this.columnNumi++) {

            String temp = "";

            try {

                temp = csvCell[i].toString();

            } catch (ArrayIndexOutOfBoundsException ex) {

                temp = "";

            }

            s.put(this.columnName[i], temp);

        }

        Object r[] = new Object[1];

        r[0] = s;

        this.curRowNo++;

        return r;

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

网友评论