測(cè)試驅(qū)動(dòng)技術(shù)(TDD)系列之:從excel中讀取數(shù)據(jù)
測(cè)試框架中參數(shù)化的一般形式
在Junit4和TestNG框架中實(shí)現(xiàn)參數(shù)化的形式幾乎是一致的。
Junit4定義參數(shù)化數(shù)據(jù),代碼如下:
- public static Collection prepareData(){
- Object [][]object= {{1,2,3},{0,2,2},{0,3,3}};
- return Arrays.asList(object);
- }
TestNG定義參數(shù)化數(shù)據(jù),代碼如下:
- @DataProvider
- public Object[][] dp1() {
- return new Object[][] {
- new Object[] { 1, 1,0 },
- new Object[] { 2, 1,1 },
- new Object[] { 2, 1,2 },
- };
- }
從excel中讀取測(cè)試驅(qū)動(dòng)數(shù)據(jù)的實(shí)現(xiàn)思路
在前面的文章中,我詳細(xì)地講解了,java中數(shù)組的應(yīng)用,以及如何利用api來(lái)操控excel文件。接下來(lái)我就把在測(cè)試框架中讀取excel進(jìn)行接口測(cè)試參數(shù)化的核心代碼以及實(shí)現(xiàn)思路講解給大家。
1.首先我們看到測(cè)試數(shù)據(jù)的參數(shù)化返回值是Object [][] object,那么我們就需要寫(xiě)一個(gè)讀取excel的方法,該方法的返回值是Object [][],方法可以定義為:Object[][] readExcel(String p_file,int p_sheetindex)
2.excel中讀取cell的名稱是通過(guò)行和列確認(rèn)的,而且不同類型的cell在讀取值時(shí)用到的api是不同的,我們寫(xiě)一個(gè)讀取Cell值得方法,代碼實(shí)現(xiàn)如下:
- public static Object getCellVaule(Sheet p_sheet,int p_rowIndex,int p_cellIndex) {
- Object value=null;
- Row row = p_sheet.getRow(p_rowIndex);
- Cell cell = row.getCell(p_cellIndex);
- if(cell.getCellType()==CellType.NUMERIC) //判斷是數(shù)字類型
- {
- value= cell.getNumericCellValue();
- }
- else if(cell.getCellType()==CellType.STRING) //判斷是String類型
- {
- value=cell.getStringCellValue();
- }
- else if(cell.getCellType()==CellType.BOOLEAN) // 判斷是BOOLEAN類型
- {
- value=cell.getStringCellValue();
- }
- else
- {
- value=cell.toString(); // 其他類型統(tǒng)一轉(zhuǎn)化成String類型
- }
- return value;
- }
3.結(jié)合getCellVaule方法,我們編寫(xiě)一個(gè)讀取完整excel值的方法,返回值為Object[][] ,代碼如下:
- public static Object[][] readExcel(String p_file,int p_sheetindex){
- Workbook workbook=null;
- Object [][] data=null;
- try {
- workbook = new XSSFWorkbook(new FileInputStream(p_file));
- Sheet sheet = workbook.getSheetAt(p_sheetindex); // 獲取第一個(gè)工作表.0代表第一個(gè)sheet頁(yè)
- int iRowNum=sheet.getPhysicalNumberOfRows(); //獲取工作表中的行數(shù)
- int iColumnNum= sheet.getRow(0).getPhysicalNumberOfCells(); //獲取工作表中的列數(shù)
- data=new Object[iRowNum][iColumnNum];//通過(guò)行列數(shù),創(chuàng)建一個(gè)二維數(shù)組來(lái)保存cell中的數(shù)據(jù)
- for(int i=0;i<iRowNum;i++) {
- for(int j=0;j<iColumnNum;j++) {
- data[i][j]= getCellVaule(sheet,i,j); //通過(guò)循環(huán)以及之前編寫(xiě)好的讀取excel單元格值的方法,把cell中的數(shù)據(jù)保存到二維數(shù)組中
- }
- }
- workbook.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return data;
- }
4.我們可以把這兩個(gè)方法作為工具方法,寫(xiě)入到工具類ExcelTool中,方便在測(cè)試框架中應(yīng)用
測(cè)試用例中參數(shù)化的應(yīng)用
在測(cè)試用例中(以junit4為例),使用該工具方法實(shí)現(xiàn)參數(shù)化的代碼實(shí)現(xiàn)如下:
- @RunWith(Parameterized.class)
- public class ParaDemo {
- private Object input1;
- private Object input2;
- @Parameters
- public static Collection prepareData(){
- System.out.println("prepareData");
- Object [][] object=ExcelTool.readExcel("D:\\TestData2.xlsx",0);
- return Arrays.asList(object);
- }
- public ParaDemo(Object input1,Object input2,Object expected){
- System.out.println("ParaDemo");
- this.input1 = input1;
- this.input2 = input2;
- }
- @Test
- public void testEqual(){
- Assert.assertEquals(this.input1,this.input2);
- }
- }
excel里保存的測(cè)試數(shù)據(jù)如下所示

運(yùn)行測(cè)試用例,發(fā)現(xiàn)參數(shù)化成功執(zhí)行,如下圖所示
