HttpClient +Testng(2)使用testng的DataProvicer來進行資料驅動
阿新 • • 發佈:2019-02-11
在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、執行程式
再次執行程式,執行結束後檢視日誌,一切正常,如下圖所示