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

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

1、大概流程

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


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

HttpClient +Testng(2)使用testng的DataProvicer来进行数据驱动_第1张图片

2、创建一个Excel表格

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

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

如下图所示:

HttpClient +Testng(2)使用testng的DataProvicer来进行数据驱动_第2张图片

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 results = new ArrayList();
            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 formparams1 = new ArrayList();
    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、运行程序

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

HttpClient +Testng(2)使用testng的DataProvicer来进行数据驱动_第3张图片

你可能感兴趣的:(testng,httpclient)