• Jmeter—生成excel结果文件


      相信很多用jmeter进行接口测试的童鞋都会有这样的苦恼:同时执行上百条测试案例,如何能轻松加愉快地检查案例输出结果?仅仅靠jmeter的断言、debug sampler、察看结果树等是无法满足我们要求的!下面跟大家分享一个小技巧,利用beanshell和外部jar包来生成excel结果文件。

     
    Jmeter接口自动化脚本编写流程

      1、下载开源jar包

    下载jxl.jar, fastjson.jar(本文以json接口为例),并放到jmeter的lib目录下。

      2、开发外部jar包

    (1)创建CWResultFile java项目,创建CWOutputFile类,该类包含两个方法,cOutputFile用于创建结果文件,wOutputFile用于写结果文件。


    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.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;

    /*

    *导入jxl.jar;

    *后续扩充功能,sheet2增加测试报告展现;------待实现;

    */

    public class CWOutputFile {

    /*

    * wOutputFile方法写结果文件

    * wOutputFile(文件路径,案例编号,测试验证点,预期结果,实际结果,错误码,状态码,响应结果)

    */

    public  void wOutputFile(String filepath, String caseNo,

    String testPoint, String preResult, String fresult, String errCode,

    String status, String respond) throws IOException,

    RowsExceededException, WriteException, BiffException {

    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);

    // int rsColumns = readsheet.getColumns(); //获取Sheet表中所包含的总列数

    int rsRows = readsheet.getRows(); // 获取Sheet表中所包含的总行数

    /********************************字体样式设置 ****************************/

    WritableFont font = new WritableFont(WritableFont.createFont("宋体"), 10,

    WritableFont.NO_BOLD);// 字体样式

    WritableCellFormat wcf = new WritableCellFormat(font);

    /***********************************************************************/

    Cell cell1 = readsheet.getCell(0, rsRows);

    if (cell1.getContents().equals("")) {

    Label labetest1 = new Label(0, rsRows, caseNo);    // 第1列--案例编号;

    Label labetest2 = new Label(1, rsRows, testPoint); // 第2列--验证测试点;

    Label labetest3 = new Label(2, rsRows, preResult); // 第3列--预期结果;

    Label labetest4 = new Label(3, rsRows, fresult);  // 第4列--实际结果;

    Label labetest5 = new Label(4, rsRows, errCode);  // 第5列--错误码;

    if (preResult == fresult) {

    result = "通过";

    wcf.setBackground(Colour.BRIGHT_GREEN); // 通过案例标注绿色

    } else {

    result = "不通过";

    wcf.setBackground(Colour.RED);          // 不通过案例标注红色

    }

    Label labetest6 = new Label(5, rsRows, result, wcf); // 第6列--执行结果;

    Label labetest7 = new Label(6, rsRows, status);      // 第7列--状态码

    Label labetest8 = new Label(7, rsRows, respond);    // 第8列--响应结果

    readsheet.addCell(labetest1);

    readsheet.addCell(labetest2);

    readsheet.addCell(labetest3);

    readsheet.addCell(labetest4);

    readsheet.addCell(labetest5);

    readsheet.addCell(labetest6);

    readsheet.addCell(labetest7);

    readsheet.addCell(labetest8);

    }

    wbook.write();

    wbook.close();

    }

    /*

    * cOutputFile方法创建输出文件,传入参数为交易类型,如开户等;

    * cOutputFile方法返回文件路径,作为wOutputFile的入参;

    */

    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); // 获取时间戳

    // 相对路径默认为 apache-jmeter-3.1in

    String filepath = "D:\\"+tradeType+"_output_" + "_" + temp_str + ".xls"; // 以时间戳命名结果文件,确保唯一

    File output = new File(filepath);

    if (!output.isFile()) {

    output.createNewFile(); // 如果指定文件不存在,则新建该文件

    WritableWorkbook writeBook = Workbook.createWorkbook(output);

    WritableSheet Sheet = writeBook.createSheet("输出结果", 0); // createSheet(sheet名称,第几个sheet)

    WritableFont headfont = new WritableFont(

    WritableFont.createFont("宋体"), 11, WritableFont.BOLD); // 字体样式

    WritableCellFormat headwcf = new WritableCellFormat(headfont);

    headwcf.setBackground(Colour.GRAY_25); // 灰色颜色

    Sheet.setColumnView(0, 11); // 设置列宽度setColumnView(列号,宽度)

    Sheet.setColumnView(1, 30);

    Sheet.setColumnView(2, 35);

    Sheet.setColumnView(3, 35);

    Sheet.setColumnView(4, 18);

    Sheet.setColumnView(5, 11);

    Sheet.setColumnView(6, 11);

    Sheet.setColumnView(7, 50);

    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);

    Label labe60 = new Label(6, 0, "返回状态", headwcf);

    Label labe70 = new Label(7, 0, "响应结果", headwcf);

    Sheet.addCell(labe00);

    Sheet.addCell(labe10);

    Sheet.addCell(labe20);

    Sheet.addCell(labe30);

    Sheet.addCell(labe40);

    Sheet.addCell(labe50);

    Sheet.addCell(labe60);

    Sheet.addCell(labe70);

    writeBook.write();

    writeBook.close();

    }

    return filepath;

    }

    }

    1 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.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;/**导入jxl.jar;*后续扩充功能,sheet2增加测试报告展现;------待实现;*/public class CWOutputFile {/** wOutputFile方法写结果文件* wOutputFile(文件路径,案例编号,测试验证点,预期结果,实际结果,错误码,状态码,响应结果)*/public  void wOutputFile(String filepath, String caseNo,String testPoint, String preResult, String fresult, String errCode,String status, String respond) throws IOException,RowsExceededException, WriteException, BiffException {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);// int rsColumns = readsheet.getColumns(); //获取Sheet表中所包含的总列数int rsRows = readsheet.getRows(); // 获取Sheet表中所包含的总行数/********************************字体样式设置 ****************************/WritableFont font = new WritableFont(WritableFont.createFont("宋体"), 10,WritableFont.NO_BOLD);// 字体样式WritableCellFormat wcf = new WritableCellFormat(font);/***********************************************************************/Cell cell1 = readsheet.getCell(0, rsRows);if (cell1.getContents().equals("")) {Label labetest1 = new Label(0, rsRows, caseNo);    // 第1列--案例编号;Label labetest2 = new Label(1, rsRows, testPoint); // 第2列--验证测试点;Label labetest3 = new Label(2, rsRows, preResult); // 第3列--预期结果;Label labetest4 = new Label(3, rsRows, fresult);   // 第4列--实际结果;Label labetest5 = new Label(4, rsRows, errCode);   // 第5列--错误码;if (preResult == fresult) {result = "通过";wcf.setBackground(Colour.BRIGHT_GREEN); // 通过案例标注绿色} else {result = "不通过";wcf.setBackground(Colour.RED);          // 不通过案例标注红色}Label labetest6 = new Label(5, rsRows, result, wcf); // 第6列--执行结果;Label labetest7 = new Label(6, rsRows, status);      // 第7列--状态码Label labetest8 = new Label(7, rsRows, respond);     // 第8列--响应结果readsheet.addCell(labetest1);readsheet.addCell(labetest2);readsheet.addCell(labetest3);readsheet.addCell(labetest4);readsheet.addCell(labetest5);readsheet.addCell(labetest6);readsheet.addCell(labetest7);readsheet.addCell(labetest8);}wbook.write();wbook.close();}/** cOutputFile方法创建输出文件,传入参数为交易类型,如开户等;* cOutputFile方法返回文件路径,作为wOutputFile的入参;*/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); // 获取时间戳// 相对路径默认为 apache-jmeter-3.1inString filepath = "D:\\"+tradeType+"_output_" + "_" + temp_str + ".xls"; // 以时间戳命名结果文件,确保唯一File output = new File(filepath);if (!output.isFile()) {output.createNewFile(); // 如果指定文件不存在,则新建该文件WritableWorkbook writeBook = Workbook.createWorkbook(output);WritableSheet Sheet = writeBook.createSheet("输出结果", 0); // createSheet(sheet名称,第几个sheet)WritableFont headfont = new WritableFont(WritableFont.createFont("宋体"), 11, WritableFont.BOLD); // 字体样式WritableCellFormat headwcf = new WritableCellFormat(headfont);headwcf.setBackground(Colour.GRAY_25); // 灰色颜色Sheet.setColumnView(0, 11); // 设置列宽度setColumnView(列号,宽度)Sheet.setColumnView(1, 30);Sheet.setColumnView(2, 35);Sheet.setColumnView(3, 35);Sheet.setColumnView(4, 18);Sheet.setColumnView(5, 11);Sheet.setColumnView(6, 11);Sheet.setColumnView(7, 50);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);Label labe60 = new Label(6, 0, "返回状态", headwcf);Label labe70 = new Label(7, 0, "响应结果", headwcf);Sheet.addCell(labe00);Sheet.addCell(labe10);Sheet.addCell(labe20);Sheet.addCell(labe30);Sheet.addCell(labe40);Sheet.addCell(labe50);Sheet.addCell(labe60);Sheet.addCell(labe70);writeBook.write();writeBook.close();}return filepath;}}
    View Code

    (2)导出CWResultFile.jar包,并放到jmeter的lib/ext目录下。

      3、脚本示例

    (1)准备案例数据

     
    testcase.csv

    (2)调用cOutputFile方法创建结果文件

     
    ps:此处使用“仅一次控制器”是因为对于testcase.csv的N条案例数据我们只需一个结果文件即可;

    (3)调用wOutputFile方法写结果文件

     
    调用wOutputFile方法写文件

    (4)生成结果文件

     
    以时间戳命名输出结果文件,确保唯一性
     
    输出结果文件内容如上所示

      4、下一阶段展望

    持续集成;



    作者:Tomandy
    链接:https://www.jianshu.com/p/eebbeaf80fd2
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  • 相关阅读:
    跟一声响骚扰说“拜拜”
    来电过滤 全靠防火墙
    android sd卡读取数据库
    Java程序员十戒
    Java常用的正则表达式验证
    Java 3D 教程:6. Java 3D 与用户界面
    成为Java高手的25个学习目标
    Java数据结构内容整理
    Java中类与类之间的关系
    求助,Java字符串分割问题
  • 原文地址:https://www.cnblogs.com/a00ium/p/10351313.html
Copyright © 2020-2023  润新知