無論是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操作進行封裝,這個過兩天以我們的自動化測試框架為例分享下如何搭建。
