天天看點

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

目錄

  • 1、環境準備
    • (1)引入操作Excel檔案的基礎JAR包
    • (2)引入封裝自定義操作Excel檔案的JAR包
  • 2、準備測試需要的資料
  • 3、測試結果寫入Excel示範
    • (1)測試計劃内包含的元件
    • (2)CSV資料檔案設定界面内容
    • (3)登陸接口請求内容
    • (4)正規表達式提取器内容
    • (5)BeanShell取樣器(建立Excel)
    • (6)BeanShell取樣器(寫回結果)
    • (7)線程組界面内容
    • (8)運作檢視結果

在使用JMeter進行測試的過程中,有時候需要将測試結果寫入到Excel檔案,本篇文章将詳細說明具體步驟。

把測試結果寫入Excel檔案中操作思路分析:

(1)準備需要的環境

  1. 引入操作Excel檔案的基礎JAR包:

    jxl.jar

  2. 封裝自定義操作Excel的JAR包
    • Excel中一般有三個要素:

      workbook

      sheet

      cell

      要想把結果存儲到指定的單元格中,那麼就必須要确定好這三個元素依次來定位。

      1)先擷取Excel的檔案名。

      2)擷取表單名。

      3)擷取單元格的坐标。

    • 擷取結果,寫入到對應的單元格裡面去。
    • 需要利用BeanShell編寫Java代碼,擷取對應的資料寫入到Excel裡面去。

(2)準備需要的資料檔案。

(3)編寫JMeter腳本,添加需要的元件,并控制元件的執行順序,完成最終的測試。

1、環境準備

(1)引入操作Excel檔案的基礎JAR包

  1. 需要使用第三方jar包:

    jxl.jar

  2. jxl.jar

    的作用:完成對Excel檔案的讀寫以及修改操作。
  3. 下載下傳好之後,放到JMeter的安裝路徑下的

    lib

    目錄下。

(2)引入封裝自定義操作Excel檔案的JAR包

我們可以使用Java語言,對

jxl.jar

包的功能,進行自定義封裝,定制成我們自己需要功能。

然後把封裝好的代碼,打成JAR包,放入到JMeter安裝目錄下的

lib\ext

目錄下。

簡易自定義封裝代碼如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import jxl.Cell;
import jxl.JXLException;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;


public class CWOutputFile {

    /**
     * wOutputFile 作用:把内容寫入到Excel檔案中。
     * wOutputFile寫結果檔案   wOutputFile(檔案路徑、用例編号、用例标題、預期結果、實際結果、測試結果)
     * @throws IOException
     * @throws BiffException
     * @throws WriteException
     */
    public void wOutputFile(String filepath,String caseNo,String testPoint,String testData,String preResult,String fresult) throws BiffException, IOException, WriteException{
        File output=new File(filepath);
        String result = "";
        InputStream instream = new FileInputStream(filepath);
        Workbook readwb = Workbook.getWorkbook(instream);
        WritableWorkbook wbook = Workbook.createWorkbook(output, readwb);  //根據檔案建立一個操作對象
        WritableSheet readsheet = wbook.getSheet(0);  //定位到檔案的第一個sheet頁簽
        int rsRows = readsheet.getRows();   //擷取sheet頁簽的總行數
        //擷取sheet表中所包含的總行數

        /******************設定字型樣式***************************/
        WritableFont font = new WritableFont(WritableFont.createFont("宋體"),10,WritableFont.NO_BOLD);
        WritableCellFormat wcf = new WritableCellFormat(font);
        /****************************************************/

        Cell cell = readsheet.getCell(0,rsRows);  //擷取sheet頁的單元格
        if(cell.getContents().equals("")){
            Label labetest1 = new Label(0,rsRows,caseNo);   //第一列:用例編号
            Label labetest2 = new Label(1,rsRows,testPoint);//第二列:用例标題
            Label labetest3 = new Label(2,rsRows,testData); //第三列:測試資料
            Label labetest4 = new Label(3,rsRows,preResult);//第四列:預期結果
            Label labetest5 = new Label(4,rsRows,fresult); //第五列:實際結果
            if(preResult.equals(fresult)){ // 判斷兩個值同時相等才會顯示通過
                result = "通過"; //預期結果和實際結果相同,測試通過
                wcf.setBackground(Colour.BRIGHT_GREEN);  //通過案例标注綠色
            }
            else{
                result = "不通過"; //預期結果和實際結果不相同,測試不通過
                wcf.setBackground(Colour.RED);  // 不通過案例标注紅色
            }
            Label labetest6 = new Label(5,rsRows,result,wcf);//第六列:測試結果
            readsheet.addCell(labetest1);
            readsheet.addCell(labetest2);
            readsheet.addCell(labetest3);
            readsheet.addCell(labetest4);
            readsheet.addCell(labetest5);
            readsheet.addCell(labetest6);
        }
        wbook.write();
        wbook.close();
    }

    /**
     * cOutputFile 作用:建立Excel檔案,
     * tradeType為檔案名稱字首,
     * 傳回結果:檔案路徑,作為wOutputFile寫入結果檔案的入參
     * @throws IOException
     * @throws WriteException
     * */
    public String cOutputFile(String tradeType) throws IOException, WriteException{
        String temp_str = "";
        Date dt = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        temp_str = sdf.format(dt); //擷取時間戳
        // 相對路徑預設為 JMeter_home\bin 目錄
        // 以時間戳命名結果檔案,確定唯一
        // 生成檔案路徑
        String filepath = "D:\\\\"+tradeType+"_output_" + "_" + temp_str + ".xls";
        File output = new File(filepath);
        if(!output.isFile()){
            // 如果指定的檔案不存在,建立新該檔案
            output.createNewFile();
            // 寫檔案
            // 建立一個writeBook,在建立一個sheet
            WritableWorkbook writeBook = Workbook.createWorkbook(output);
            //命名sheet // createsheet(sheet名稱,第幾個sheet)
            WritableSheet sheet = writeBook.createSheet("輸出結果", 0);
            //設定首行字型為宋體,11号,加粗
            WritableFont headfont = new WritableFont(WritableFont.createFont("宋體"),11,WritableFont.BOLD);
            WritableCellFormat headwcf = new WritableCellFormat(headfont);
            headwcf.setBackground(Colour.GRAY_25); // 灰色顔色
            // 設定列寬度setcolumnview(列号,寬度)
            sheet.setColumnView(0, 11); //設定列寬
            sheet.setColumnView(1, 20);
            sheet.setColumnView(2, 40);
            sheet.setColumnView(3, 10);
            sheet.setColumnView(4, 10);
            sheet.setColumnView(5, 10); //如果需要再新增列,這裡往下添加
            headwcf.setAlignment(Alignment.CENTRE); //設定文字居中對齊方式;//文字居中
            headwcf.setVerticalAlignment(VerticalAlignment.CENTRE); // 設定垂直居中;
            Label labe00 = new Label(0,0,"用例編号",headwcf); //寫入内容:Label(列号,行号,内容)
            Label labe10 = new Label(1,0,"用例标題",headwcf);
            Label labe20 = new Label(2,0,"測試資料",headwcf);
            Label labe30 = new Label(3,0,"預期結果",headwcf);
            Label labe40 = new Label(4,0,"實際結果",headwcf);
            Label labe50 = new Label(5,0,"執行結果",headwcf); //往下添加
            sheet.addCell(labe00);
            sheet.addCell(labe10);
            sheet.addCell(labe20);
            sheet.addCell(labe30);
            sheet.addCell(labe40);
            sheet.addCell(labe50);//往下添加
            writeBook.write();
            writeBook.close();
        }
        return filepath;
    }
}
           
提示:
  • 使用自己的IDE開發工具,把該檔案生成JAR檔案。
  • 在編寫Java代碼的時候,别忘記把

    jxl.jar

    導入到項目中,因為是對

    jxl.jar

    中的功能進行的封裝。
  • 我使用的是IDEA編輯Java代碼,建立的Maven項目,在

    src/main/java

    目錄下直接建立該檔案即可。如果你自己增加了Package,也就是多增加了路徑,在下面引用代碼的時候,就會變得麻煩。需要導包操作,或者調用的時候增加路徑。
  • 上面定義生成的Excel檔案在D盤根目錄,如需生成到其他位置,在代碼中修改。
  • 關于生成Excel檔案内容的格式,可以自定義修改。
當然,你也可以不封裝上面的代碼,把上面的代碼直接寫在BeanShell取樣器腳本中也是一樣的。(有Java基礎你會明白的)

2、準備測試需要的資料

代碼準備好後,我們要準備對應的測試資料,需要準備的資料有兩部分:

  1. 測試用例資料。
  2. 參數化資料。
說明:我們都用

.csv

格式的資料檔案,注意編碼UTF-8,防止中文亂碼。

(1)測試用例資料

測試用例資料檔案内容如下:

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

(2)參數化資料

參數化資料檔案内容如下:

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel
提示:測試用例資料和參數化資料可以準備到一個檔案中,也可以分開準備,根據自己的需求去做。

3、測試結果寫入Excel示範

(1)測試計劃内包含的元件

添加元件操作步驟:

  1. 建立測試計劃。
  2. 建立線程組:

    選中“測試計劃”右鍵 —> 添加 —> 線程(使用者) —> 線程組

  3. 線上程組中,添加配置元件

    CSV Data Set Config

    元件:

    選中“線程組”右鍵 —> 添加 —> 配置元件 —> CSV Data Set Config

  4. 線上程組中,添加取樣器“HTTP請求”元件:

    選中“線程組”右鍵 —> 添加 —> 取樣器 —> HTTP請求

  5. 在取樣器下,添加後置處理器“正規表達式提取器”元件:

    選中“取樣器”右鍵 —> 添加 —> 後置處理器 —> 正規表達式提取器

  6. 線上程組中,添加邏輯控制器“僅一次控制器”元件:

    選中“線程組”右鍵 —> 添加 —> 邏輯控制器 —> 僅一次控制器

  7. 線上程組中,添加取樣器“BeanShell 取樣器”元件:

    選中“線程組”右鍵 —> 添加 —> 取樣器 —> BeanShell取樣器

  8. 線上程組中,添加監聽器“察看結果樹”元件:

    選中“線程組”右鍵 —> 添加 —> 監聽器 —> 察看結果樹

提示:需要重複添加的元件這裡不重複描述。

最終測試計劃中的元件如下:

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

點選運作按鈕,會提示你先儲存該腳本,腳本儲存完成後會直接自動運作該腳本。

(2)CSV資料檔案設定界面内容

我們需要添加兩個

CSV Data Set Config

元件,一個用于讀取測試用例的資料檔案,另一個用于讀取測試資料的參數化檔案。

讀取測試用例資料的CSV元件:

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

讀取測試資料參數化檔案的CSV元件:

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel
提示:要檢視好資料檔案中是否有标題行,是否有中文,資料是否帶引号,進行相應的配置。如果不明白請看前面的參數化文章,寫的很詳細。

(3)登陸接口請求内容

标準的POST請求,填寫好請求的基本要素,和需要的參數。

如下圖所示:

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

(4)正規表達式提取器内容

使用正規表達式提取器,将每一次請求傳回的資料,提取出來,用于後面的操作。

并且正規表達式提取器是放在登陸請求的下一級。

如下圖所示,提取傳回的全部内容,指派給

fresult

變量。

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

(5)BeanShell取樣器(建立Excel)

建立一個BeanShell取樣器請求,用于建立Excel檔案。

因為登陸操作有多條用例,但不需要建立多個Excel檔案,我們就需要使用一個邏輯控制器,來控制該BeanShell請求隻執行一次。

把此BeanShell取樣器請求放在僅一次控制器的下一級,使該取樣器整個循環過程中隻會執行一次,也就是隻會生成一個Excel檔案。

如下圖所示:

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

然後在腳本中,寫入BeanShell代碼:

// 1.建立對象
t = new CWOutputExcelFile();

// 2.建立excel檔案
String filepath = t.cOutputFile("測試");

// 3.将excel檔案路徑儲存為jmeter變量,友善後期使用。
vars.put("filepath",filepath);
           

BeanShell取樣器界面内容介紹:

  • Reset bsh.Interpreter before each call

    :每個BeanShell測試元素都有自己的解釋器副本(對于每個線程)。如果重複調用測試元素,例如在循環内,除非選擇在每次調用之前重置

    bsh.Interpreter

    選項,否則解釋器将保留在調用之間。一些長時間運作的測試可能會導緻解釋器使用大量記憶體。

    由于BeanShell的

    bsh.Interpreter

    存在記憶體洩露,正常方法無法支援長時間的壓力測試。JMeter官網推薦,在使用BeanShell進行長時間測試時,打開選項

    Reset bsh.Interpreterbefore each call

    ,則在每次調用BeanShell程式前,都把解釋器重置,以釋放解釋器之前占用的記憶體。
  • 參數 (-> String Parameters和String[]bsh.args)

    :輸入String參數。

    String []bsh.args

    是主類main函數的形式參數,是一個String 對象數組,可以用來擷取指令行使用者輸入進去的參數。
  • 腳本檔案:腳本檔案(可以填入腳本檔案路徑),可以點選後邊的浏覽選擇腳本檔案。
  • Script (see below for variables that are defined)

    :編寫腳本,參照下文定義的變量(使腳本檔案參照定義的變量來運作)

(6)BeanShell取樣器(寫回結果)

把每次請求接口傳回的結果,寫入到Excel檔案中。因為每次循環都要執行,是以放在和登陸請求同級。

界面内容如下圖所示:

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

編寫腳本内容如下:

// 1.建立寫回結果的對象
s = new CWOutputExcelFile();

// 2.參數準備
// (1)拼接成json格式的測試資料
String testData="{"+"\"mobilephone\":\""+"${mobilephone}\","+"\"pwd\":\""+"${pwd}\""+"}";

//用get方法可以確定擷取到的是字元串,裡面傳遞的是變量名,不需要用${變量名}這種方式咯!
// (2)擷取預期結果
// 擷取參數化檔案中的變量,傳回值為字元串類型,否則直接引用為json類型
String preResult = vars.get("preResult"); 

// (3)擷取傳回結果
// 擷取正規表達式中的結果檔案,傳回值為字元串類型,否則直接引用為json類型
String fresult = vars.get("fresult");


// 3.寫測試結果到excel檔案,調用方法wOutputFile方法
s.wOutputFile("${filepath}","${caseNo}","${testPoint}",testData,preResult,fresult);
           
提示:在JMeter中我們經常會使用正規表達式去擷取接口傳回的參數,在引用參數的時候,可以直接使用

${參數名}

。如果這個參數中不帶有任何需要轉義的符号的時候,那麼這種引用方式就沒有問題,否則JMeter就沒法識别。這時可以用

vars.get("參數名")

的方式,将JMeter變量先變成Java變量,然後再去操作,就不會報錯了。

(7)線程組界面内容

因為我們有4個用例,是以循環數填寫4。(不要修改線程數)

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

提示:線程數和循環次數的差別

僅一次控制器,對某個線程組隻執行一次。

  • 如果修改線程數,如10 ,就是開啟是10個線程跑這個線程組,是以僅一次控制器中的内容執行10次。
  • 如果修改循環次數,如10 ,表示隻開啟一個線程,跑這個線程組10次,而這10次中僅執行一次僅一次控制器中的内容。

(8)運作檢視結果

運作腳本檢視結果,我們可以看到建立了一次Excel檔案,執行了4次登陸操作,也寫了四次内容到Excel中。這和我們預習的流程是一樣的。

如下圖所示:

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

然後我們再來看看Excel檔案中的内容,如下圖所示:

『動善時』JMeter基礎 — 37、将JMeter測試結果寫入Excel

我們可以根據自己的需求,自定義檔案中的格式和需要存儲的内容(修改封裝代碼)。

繼續閱讀