測試驅動技術(TDD)系列之:從excel中讀取數據
測試框架中參數化的一般形式
在Junit4和TestNG框架中實現參數化的形式幾乎是一致的。
Junit4定義參數化數據,代碼如下:
- public static Collection prepareData(){
- Object [][]object= {{1,2,3},{0,2,2},{0,3,3}};
- return Arrays.asList(object);
- }
TestNG定義參數化數據,代碼如下:
- @DataProvider
- public Object[][] dp1() {
- return new Object[][] {
- new Object[] { 1, 1,0 },
- new Object[] { 2, 1,1 },
- new Object[] { 2, 1,2 },
- };
- }
從excel中讀取測試驅動數據的實現思路
在前面的文章中,我詳細地講解了,java中數組的應用,以及如何利用api來操控excel文件。接下來我就把在測試框架中讀取excel進行接口測試參數化的核心代碼以及實現思路講解給大家。
1.首先我們看到測試數據的參數化返回值是Object [][] object,那么我們就需要寫一個讀取excel的方法,該方法的返回值是Object [][],方法可以定義為:Object[][] readExcel(String p_file,int p_sheetindex)
2.excel中讀取cell的名稱是通過行和列確認的,而且不同類型的cell在讀取值時用到的api是不同的,我們寫一個讀取Cell值得方法,代碼實現如下:
- 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) //判斷是數字類型
- {
- 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(); // 其他類型統一轉化成String類型
- }
- return value;
- }
3.結合getCellVaule方法,我們編寫一個讀取完整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); // 獲取第一個工作表.0代表第一個sheet頁
- int iRowNum=sheet.getPhysicalNumberOfRows(); //獲取工作表中的行數
- int iColumnNum= sheet.getRow(0).getPhysicalNumberOfCells(); //獲取工作表中的列數
- data=new Object[iRowNum][iColumnNum];//通過行列數,創建一個二維數組來保存cell中的數據
- for(int i=0;i<iRowNum;i++) {
- for(int j=0;j<iColumnNum;j++) {
- data[i][j]= getCellVaule(sheet,i,j); //通過循環以及之前編寫好的讀取excel單元格值的方法,把cell中的數據保存到二維數組中
- }
- }
- workbook.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return data;
- }
4.我們可以把這兩個方法作為工具方法,寫入到工具類ExcelTool中,方便在測試框架中應用
測試用例中參數化的應用
在測試用例中(以junit4為例),使用該工具方法實現參數化的代碼實現如下:
- @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里保存的測試數據如下所示

運行測試用例,發現參數化成功執行,如下圖所示
