1. 程式人生 > >HttpClient +Testng(2)使用testng的DataProvicer來進行資料驅動

HttpClient +Testng(2)使用testng的DataProvicer來進行資料驅動

在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、執行程式

再次執行程式,執行結束後檢視日誌,一切正常,如下圖所示