HttpClient +Testng(2)使用testng的DataProvicer来进行数据驱动

来源:互联网 发布:二更网络 编辑:程序博客网 时间:2024/04/29 10:03

在FirstTest.java 文件中,我们可看到请求URL、请求参数,这些都是属于测试数据。这里我们使用testng中自带的@DataProvider注解来做数据驱动,数据源文件可以是EXCEL,XML,甚至可以是TXT文本。这里我们使用EXCEL数据源。

1、大概流程

每个测试运行前,会先通过@DataProvider的方法来读取EXCEL中数据,该注解的方法会返回一个Object[] []。然后带@Test的测试方法,如果希望从这个 DataProvider 的接收数据,则需要标识获取数据源的dataProvider的名称,也就是这个注解的名字。那么对应的DataProvider会把读取的数据传给该test方法


借用该文档中的一个图来更清楚的说明这个流程


2、创建一个Excel表格

在目录main下新建一个目录TestData,并在该目录下新建一个excel表格,直接命名为LoginTest。然后打开该文档,修改sheet页名称为login.之后把上面http请求URL、请求参数都放到excel表格中。

这里必须把表格第一行用来命名所有参数的名称。测试数据是从第二行开始的。

如下图所示:


3、创建一个读取EXCEL表格的类

这里我们直接在test->java下创建一个包,命名为utl
之后在utl中创建一个类ExcelReader.java
里面的内容如下所示:
package utl;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;import java.io.File;import java.io.FileInputStream;import java.text.DecimalFormat;import java.util.ArrayList;import java.util.List;public class ExcelReader {    /**     * 读取excel文件,excel中不含合并单元格     * @param path     * @param sheetName     * excel表格要注意每行的最后一格不能为空     * 如果要为空,则需要手动随便填写字符,然后再按del键删除才可以     * 目前没找到这个解决办法,后续会继续查找解决办法     * @return     */    public static String[][] getExpectationData(String path, String sheetName) {        try {            File file = new File(path);            FileInputStream fis = new FileInputStream(file);            POIFSFileSystem POIStream = new POIFSFileSystem(fis);            HSSFWorkbook workBook = new HSSFWorkbook(POIStream);            //得到工作表            HSSFSheet sheet1 = workBook.getSheet(sheetName);            //得到总行数            int rowNum = sheet1.getLastRowNum();            List<String[]> results = new ArrayList<String[]>();            for (int i=1;i<=rowNum;i++){                //当前行                HSSFRow row = sheet1.getRow(i);                int colNum = row.getLastCellNum();                String[] data = new String[colNum];                //当前行所有列                for (int j = 0; j < colNum; j++) {                    try {                        data[j] = getCellValue(row.getCell(j));                    }catch (NullPointerException e){ //如果单元格为空的时候,则用这个来处理                        data[j] = "";                    }                }                //把data[]数组的数据存在list<[]>中                results.add(data);            }            fis.close();            String[][] returnArray = new String[results.size()][rowNum];            for (int i = 0; i < returnArray.length; i++) {                returnArray[i] = (String[]) results.get(i);            }            return returnArray;        }catch (Exception e){            return null;        }    }    /**     * 对Excel的各个单元格的格式进行判断并转换     */    public static String getCellValue(HSSFCell cell) {        String cellValue = "";        DecimalFormat df = new DecimalFormat("#");        switch (cell.getCellType()) {            case HSSFCell.CELL_TYPE_STRING:                cellValue =cell.getRichStringCellValue().getString().trim();                break;            case HSSFCell.CELL_TYPE_NUMERIC:                cellValue =df.format(cell.getNumericCellValue()).toString();                break;            case HSSFCell.CELL_TYPE_BOOLEAN:                cellValue = String.valueOf(cell.getBooleanCellValue()).trim();                break;            case HSSFCell.CELL_TYPE_FORMULA:                cellValue =cell.getCellFormula();                break;            default:                cellValue = "";        }        return cellValue;    }}

4、在类FirstTest.java中创建一个含有DataProvider注解的方法

修改类FirstTest.java,在该类中添加一个方法,如下面内容:

@DataProvider(name = "LoginData")public Object[][] login() {    // 测试数据准备    String file = "." + File.separator + "TestData" + File.separator + "LoginTest.xls";    Object[][] records ;    records = ExcelReader.getExpectationData(file, "login");    return records ;}

5、修改类FirstTest.java中的Test方法

Test方法内容如下所示:

@Test(dataProvider = "LoginData")public void loginJDTest(String caseDescription,String loginURL, String uuid,String eid,String fp,String _t, String loginType,String loginname,String nloginpwd, String chkRememberMe, String authcode,String pubKey,String sa_token,String seqSid) {    System.out.println("=====" + caseDescription + "=====");    //创建一个httppost请求    httppost = new HttpPost(loginURL);    //创建Post请求参数    List<NameValuePair> formparams1 = new ArrayList<NameValuePair>();    formparams1.add(new BasicNameValuePair("uuid",uuid));    formparams1.add(new BasicNameValuePair("eid",eid));    formparams1.add(new BasicNameValuePair("fp",fp));    formparams1.add(new BasicNameValuePair("_t",_t));    formparams1.add(new BasicNameValuePair("loginType",loginType));    formparams1.add(new BasicNameValuePair("loginname",loginname));    formparams1.add(new BasicNameValuePair("nloginpwd",nloginpwd));    formparams1.add(new BasicNameValuePair("chkRememberMe",chkRememberMe));    formparams1.add(new BasicNameValuePair("authcode",authcode));    formparams1.add(new BasicNameValuePair("pubKey",pubKey));    formparams1.add(new BasicNameValuePair("sa_token",sa_token));    formparams1.add(new BasicNameValuePair("seqSid",seqSid));    try {        httppost.setEntity(new UrlEncodedFormEntity(formparams1,"UTF-8"));        response = httpClient.execute(httppost);        entity = response.getEntity();        // 在这里可以用Jsoup之类的工具对返回结果进行分析,以判断创建是否成功        postResult = EntityUtils.toString(entity, "UTF-8");        System.out.println("查看登录接口请求返回的结果:" + postResult);    } catch (Exception e) {        e.printStackTrace();    }    httppost.releaseConnection();}

上面可看出,loginJDTest方法带了若干个参数,这里定义的参数要注意:
参数的个数必须和之前创建excel表格中的一样,如excel表格里面有14列参数,则这里也必须对应14个参数。而且定义参数的顺序也必须和excel表格里面参数的顺序保持一样。

6、运行程序

再次运行程序,运行结束后查看日志,一切正常,如下图所示


1 0
原创粉丝点击