Java 使用POI操作EXCEL及測試框架搭建、測試開發的一些想法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM