無論是UI自動化測試還是接口自動化測試都需要進行數據驅動,一般很常見的一種方式就是用excel來管理數據,那么就涉及到一些代碼對EXCEL的操作,之前我們介紹過用CSV來處理EXCEL,但是它的功能還不夠強大。比如接口自動化測試框架搭建的時候我們用excel來進行數據驅動,用excel來進行用例的管理和測試結果的統計,那么我們就需要對excel進行讀取,寫入等編輯操作,如果做的更加全面的話還要對測試結果進行個統計。
先來談下如何用excel來進行數據驅動吧。以我們公司的接口自動化測試框架為例,我們用excel來進行輸入設計及輸出對比,input表是請求輸入數據,ouput表是期望輸出數據,result表是實際輸出結果,可以對這些用例進行相應地處理更直觀的看到測試結果。
在這里還想談下接口測試框架的搭建問題,之前也一直在論壇上看一些大神的框架設計,從技術層面上來講涉及到的技術都是大同小異的,基本上都是用相關語言的一些測試框架加上一些數據解析,斷言,數據請求。我認為接口測試框架的搭建,亦或者是UI自動化測試框架的搭建都是從需求出發,從項目本身出發去考慮如何搭建的,並不是從技術角度出發,不能說我做自動化測試做接口測試就要用這些技術搭建框架,要看項目本身的特點,看整體項目開發測試規范需要做到什么程度,再去考慮是否需要搭建框架。因為本身接口測試就由許多工具可以滿足測試需要,如果說本身項目不會涉及到一些特殊需求,例如:
1.是否考慮特殊加密
2.是否考慮接口重復執行數據清理等問題(工具的話都是需要人工手動去處理測試數據的)
3.是否考慮測試批量執行,測試報告生成及郵件發送問題
4.是否考慮持續集成等問題
我認為當考慮了這些問題的時候才需要再去考慮搭建框架進行測試,而不是有了接口測試任務就各種技術各種查的去搭框架。自己有這種感想的原因也是在學習各種各樣的測試技術,接口啊,性能啊,自動化啊等等之后,發現在實際的項目中是不一定都會用到的,那么我們學習這些技術的意義是什么呢?為了找工作加薪嗎,是有這方面原因的。但是我認為還是應該回到測試工程師這個職位本職上來,我們的任務是什么,我越來越從思想上跳出測試者的禁錮,我希望我以后所學習的東西都是以軟件質量管理質量控制為主,而不是各種各樣的技術去堆砌,到最后發現掌握各種各樣的技術卻不知道怎么去測試,怎么當一名合格的測試,一名合格的QA。雖然自己會一直加強技術的學習,往測試開發方向發展,但是自己從思想深處還是堅定一下自己的定位,無論是測試,QA,測試開發,所做的所有工作應該是保證系統軟件的質量,亦或者能在質量把控的工作上提供相應地技術支持,提供測試效率,輔助開發提高開發效率及質量,我想這才是測試應該做的工作,而不是一味的學習技術往開發靠攏來提高自己的市場競爭力。
好了廢話不多說,簡單地POI創建,讀取,修改寫入小Demo記錄下:
package com.javaPOI; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; public class POITest { public static void main(String[] args) { // TODO Auto-generated method stub POITest.createExcel(); //POITest.readExcel(); POITest.writeToExcel(); Map<String, String> student = new HashMap<String, String>(); student.put("名字", "小明"); student.put("性別", "男"); student.put("住址", "地球"); student.put("成績", "良好"); String filePath = "/Users/macbookpro/Desktop/POITest/workbook.xls"; POITest.writeToExcel(filePath, student, "new sheet"); } public static void createExcel() { //創建工作表 Workbook wbook = new HSSFWorkbook(); //創建sheet頁 Sheet sh = wbook.createSheet("new sheet"); //row 行 cell方格 Row row1 = sh.createRow(0); //創建cell Cell cell = row1.createCell(0); //設置方格顯示 cell.setCellValue("姓名"); row1.createCell(1).setCellValue("性別"); row1.createCell(2).setCellValue("住址"); //創建文件 FileOutputStream fos = null; try { fos = new FileOutputStream("/Users/macbookpro/Desktop/POITest/workbook.xls"); wbook.write(fos); } catch (FileNotFoundException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); }finally{ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void readExcel() { InputStream ips = null; try { //獲取文件輸入流 ips = new FileInputStream("/Users/macbookpro/Desktop/POITest/workbook.xls"); //根據輸入流創建workbook對象 Workbook wbook = WorkbookFactory.create(ips); //得到第一個sheet頁 Sheet sh1 = wbook.getSheetAt(0); //遍歷行 for (Row row : sh1) { for (Cell cell : row) { System.out.print(cell.toString()+" "); } } } catch (Exception e) { e.printStackTrace(); } finally{ try { ips.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void writeToExcel() { OutputStream ops = null; InputStream ips = null; try { ips = new FileInputStream("/Users/macbookpro/Desktop/POITest/workbook.xls"); //根據輸出流創建workbook對象 Workbook wbook = WorkbookFactory.create(ips); //獲取sheet頁 Sheet sh = wbook.getSheetAt(0); for (Row row : sh) { for (Cell cell : row) { String str = cell.toString(); //把姓名改成名字 if (str.equals("姓名")) { cell.setCellValue("名字"); } } //新增一個字段 row.createCell(3).setCellValue("成績"); } ops = new FileOutputStream("/Users/macbookpro/Desktop/POITest/workbook.xls"); wbook.write(ops); } catch (Exception e) { e.printStackTrace(); } finally{ try{ ops.close(); ips.close(); }catch(Exception e){ e.printStackTrace(); } } } public static void writeToExcel(String filePath,Map<String, String>student,String sheetName) { OutputStream ops = null; InputStream ips = null; try { ips = new FileInputStream(new File(filePath)); Workbook wbook = WorkbookFactory.create(ips); Sheet sh = wbook.getSheet(sheetName); //獲得sheet行數 加1 int shRowCount = sh.getLastRowNum()+1; System.out.println(shRowCount); //獲得表頭列數 int shColumn = sh.getRow(0).getLastCellNum(); System.out.println(shColumn); Row titleRow = sh.getRow(0); //新增一行 Row newRow = sh.createRow(shRowCount); for (int i = 0; i < shColumn; i++) { //獲取列名 String columnStr = titleRow.getCell(i).toString(); System.out.println(columnStr); newRow.createCell(i).setCellValue(student.get(columnStr)); } ops = new FileOutputStream(new File(filePath)); wbook.write(ops); } catch (Exception e) { e.printStackTrace(); } finally{ try{ ops.close(); ips.close(); }catch(Exception e){ e.printStackTrace(); } } } }
查看結果:
搭建框架的話,就是需要對相關的excel操作進行封裝,這個過兩天以我們的自動化測試框架為例分享下如何搭建。