• 将JMeter测试结果写入Excel【BeanShell取样器】


    在使用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目录下。简易自定义封装代码如下:

    1. import java.io.File;
    2. import java.io.FileInputStream;
    3. import java.io.IOException;
    4. import java.io.InputStream;
    5. import java.text.SimpleDateFormat;
    6. import java.util.Date;
    7. import jxl.Cell;
    8. import jxl.JXLException;
    9. import jxl.Workbook;
    10. import jxl.format.Alignment;
    11. import jxl.format.Colour;
    12. import jxl.format.VerticalAlignment;
    13. import jxl.read.biff.BiffException;
    14. import jxl.write.Label;
    15. import jxl.write.WritableCellFormat;
    16. import jxl.write.WritableFont;
    17. import jxl.write.WritableSheet;
    18. import jxl.write.WritableWorkbook;
    19. import jxl.write.WriteException;
    20. import jxl.write.biff.RowsExceededException;
    21. public class CWOutputFile {
    22. /**
    23. * wOutputFile 作用:把内容写入到Excel文件中。
    24. * wOutputFile写结果文件 wOutputFile(文件路径、用例编号、用例标题、预期结果、实际结果、测试结果)
    25. * @throws IOException
    26. * @throws BiffException
    27. * @throws WriteException
    28. */
    29. public void wOutputFile(String filepath,String caseNo,String testPoint,String testData,String preResult,String fresult) throws BiffException, IOException, WriteException{
    30. File output=new File(filepath);
    31. String result = "";
    32. InputStream instream = new FileInputStream(filepath);
    33. Workbook readwb = Workbook.getWorkbook(instream);
    34. WritableWorkbook wbook = Workbook.createWorkbook(output, readwb); //根据文件创建一个操作对象
    35. WritableSheet readsheet = wbook.getSheet(0); //定位到文件的第一个sheet页签
    36. int rsRows = readsheet.getRows(); //获取sheet页签的总行数
    37. //获取sheet表中所包含的总行数
    38. /******************设置字体样式***************************/
    39. WritableFont font = new WritableFont(WritableFont.createFont("宋体"),10,WritableFont.NO_BOLD);
    40. WritableCellFormat wcf = new WritableCellFormat(font);
    41. /****************************************************/
    42. Cell cell = readsheet.getCell(0,rsRows); //获取sheet页的单元格
    43. if(cell.getContents().equals("")){
    44. Label labetest1 = new Label(0,rsRows,caseNo); //第一列:用例编号
    45. Label labetest2 = new Label(1,rsRows,testPoint);//第二列:用例标题
    46. Label labetest3 = new Label(2,rsRows,testData); //第三列:测试数据
    47. Label labetest4 = new Label(3,rsRows,preResult);//第四列:预期结果
    48. Label labetest5 = new Label(4,rsRows,fresult); //第五列:实际结果
    49. if(preResult.equals(fresult)){ // 判断两个值同时相等才会显示通过
    50. result = "通过"; //预期结果和实际结果相同,测试通过
    51. wcf.setBackground(Colour.BRIGHT_GREEN); //通过案例标注绿色
    52. }
    53. else{
    54. result = "不通过"; //预期结果和实际结果不相同,测试不通过
    55. wcf.setBackground(Colour.RED); // 不通过案例标注红色
    56. }
    57. Label labetest6 = new Label(5,rsRows,result,wcf);//第六列:测试结果
    58. readsheet.addCell(labetest1);
    59. readsheet.addCell(labetest2);
    60. readsheet.addCell(labetest3);
    61. readsheet.addCell(labetest4);
    62. readsheet.addCell(labetest5);
    63. readsheet.addCell(labetest6);
    64. }
    65. wbook.write();
    66. wbook.close();
    67. }
    68. /**
    69. * cOutputFile 作用:创建Excel文件,
    70. * tradeType为文件名称前缀,
    71. * 返回结果:文件路径,作为wOutputFile写入结果文件的入参
    72. * @throws IOException
    73. * @throws WriteException
    74. * */
    75. public String cOutputFile(String tradeType) throws IOException, WriteException{
    76. String temp_str = "";
    77. Date dt = new Date();
    78. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    79. temp_str = sdf.format(dt); //获取时间戳
    80. // 相对路径默认为 JMeter_home\bin 目录
    81. // 以时间戳命名结果文件,确保唯一
    82. // 生成文件路径
    83. String filepath = "D:\\\\"+tradeType+"_output_" + "_" + temp_str + ".xls";
    84. File output = new File(filepath);
    85. if(!output.isFile()){
    86. // 如果指定的文件不存在,创建新该文件
    87. output.createNewFile();
    88. // 写文件
    89. // 新建一个writeBook,在新建一个sheet
    90. WritableWorkbook writeBook = Workbook.createWorkbook(output);
    91. //命名sheet // createsheet(sheet名称,第几个sheet)
    92. WritableSheet sheet = writeBook.createSheet("输出结果", 0);
    93. //设置首行字体为宋体,11号,加粗
    94. WritableFont headfont = new WritableFont(WritableFont.createFont("宋体"),11,WritableFont.BOLD);
    95. WritableCellFormat headwcf = new WritableCellFormat(headfont);
    96. headwcf.setBackground(Colour.GRAY_25); // 灰色颜色
    97. // 设置列宽度setcolumnview(列号,宽度)
    98. sheet.setColumnView(0, 11); //设置列宽
    99. sheet.setColumnView(1, 20);
    100. sheet.setColumnView(2, 40);
    101. sheet.setColumnView(3, 10);
    102. sheet.setColumnView(4, 10);
    103. sheet.setColumnView(5, 10); //如果需要再新增列,这里往下添加
    104. headwcf.setAlignment(Alignment.CENTRE); //设置文字居中对齐方式;//文字居中
    105. headwcf.setVerticalAlignment(VerticalAlignment.CENTRE); // 设置垂直居中;
    106. Label labe00 = new Label(0,0,"用例编号",headwcf); //写入内容:Label(列号,行号,内容)
    107. Label labe10 = new Label(1,0,"用例标题",headwcf);
    108. Label labe20 = new Label(2,0,"测试数据",headwcf);
    109. Label labe30 = new Label(3,0,"预期结果",headwcf);
    110. Label labe40 = new Label(4,0,"实际结果",headwcf);
    111. Label labe50 = new Label(5,0,"执行结果",headwcf); //往下添加
    112. sheet.addCell(labe00);
    113. sheet.addCell(labe10);
    114. sheet.addCell(labe20);
    115. sheet.addCell(labe30);
    116. sheet.addCell(labe40);
    117. sheet.addCell(labe50);//往下添加
    118. writeBook.write();
    119. writeBook.close();
    120. }
    121. return filepath;
    122. }
    123. }

    提示:

    • 使用自己的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)测试用例数据测试用例数据文件内容如下:

    (2)参数化数据参数化数据文件内容如下:

     

    提示:测试用例数据参数化数据可以准备到一个文件中,也可以分开准备,根据自己的需求去做。

    3、测试结果写入Excel演示

    (1)测试计划内包含的元件

    添加元件操作步骤

    1、创建测试计划。

    2、创建线程组:选中“测试计划”右键—>添加—>线程(用户)—>线程组。

    3、在线程组中,添加配置元件CSV Data Set Config组件:选中“线程组”右键—>添加—>配置元件—> CSV Data Set Config。

    4、在线程组中,添加取样器“HTTP请求”组件:选中“线程组”右键—>添加—>取样器—> HTTP请求。

    5、在取样器下,添加后置处理器“正则表达式提取器”组件:选中“取样器”右键—>添加—>后置处理器—>正则表达式提取器。

    6、在线程组中,添加逻辑控制器“仅一次控制器”组件:选中“线程组”右键—>添加—>逻辑控制器—>仅一次控制器。

    7、在线程组中,添加取样器“BeanShell 取样器”组件:选中“线程组”右键—>添加—>取样器—> BeanShell取样器。

    8、在线程组中,添加监听器“察看结果树”组件:选中“线程组”右键—>添加—>监听器—>察看结果树。

    提示:需要重复添加的组件这里不重复描述。

    最终测试计划中的元件如下:

     

    点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。

    (2)CSV数据文件设置界面内容

    我们需要添加两个CSV Data Set Config组件,一个用于读取测试用例的数据文件,另一个用于读取测试数据的参数化文件。

    读取测试用例数据的CSV组件:

     读取测试数据参数化文件的CSV组件:

    提示:要查看好数据文件中是否有标题行,是否有中文,数据是否带引号,进行相应的配置。如果不明白请看前面的参数化文章,写的很详细。

    (3)登陆接口请求内容

    标准的POST请求,填写好请求的基本要素,和需要的参数。

    如下图所示:

    (4)正则表达式提取器内容

    使用正则表达式提取器,将每一次请求返回的数据,提取出来,用于后面的操作。

    并且正则表达式提取器是放在登陆请求的下一级。

    如下图所示,提取返回的全部内容,赋值给fresult变量。

     

    (5)BeanShell取样器(创建Excel)

    创建一个BeanShell取样器请求,用于创建Excel文件。

    因为登陆操作有多条用例,但不需要创建多个Excel文件,我们就需要使用一个逻辑控制器,来控制该BeanShell请求只执行一次。

    把此BeanShell取样器请求放在仅一次控制器的下一级,使该取样器整个循环过程中只会执行一次,也就是只会生成一个Excel文件。

    如下图所示:

    然后在脚本中,写入BeanShell代码:

    1. // 1.新建对象
    2. t = new CWOutputExcelFile();
    3. // 2.新建excel文件
    4. String filepath = t.cOutputFile("测试");
    5. // 3.将excel文件路径保存为jmeter变量,方便后期使用。
    6. 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文件中。因为每次循环都要执行,所以放在和登陆请求同级。

    内容如下图所示:

     

    编写脚本内容如下:

    1. // 1.创建写回结果的对象
    2. s = new CWOutputExcelFile();
    3. // 2.参数准备
    4. //1)拼接成json格式的测试数据
    5. String testData="{"+"\"mobilephone\":\""+"${mobilephone}\","+"\"pwd\":\""+"${pwd}\""+"}";
    6. //get方法可以确保获取到的是字符串,里面传递的是变量名,不需要用${变量名}这种方式咯!
    7. //2)获取预期结果
    8. // 获取参数化文件中的变量,返回值为字符串类型,否则直接引用为json类型
    9. String preResult = vars.get("preResult");
    10. //3)获取返回结果
    11. // 获取正则表达式中的结果文件,返回值为字符串类型,否则直接引用为json类型
    12. String fresult = vars.get("fresult");
    13. // 3.写测试结果到excel文件,调用方法wOutputFile方法
    14. s.wOutputFile("${filepath}","${caseNo}","${testPoint}",testData,preResult,fresult);

    提示:在JMeter中我们经常会使用正则表达式去获取接口返回的参数,在引用参数的时候,可以直接使用${参数名}。如果这个参数中不带有任何需要转义的符号的时候,那么这种引用方式就没有问题,否则JMeter就没法识别。这时可以用vars.get("参数名")的方式,将JMeter变量先变成Java变量,然后再去操作,就不会报错了。

    (7)线程组界面内容

    因为我们有4个用例,所以循环数填写4。(不要修改线程数)

    提示:线程数和循环次数的区别仅一次控制器,对某个线程组只执行一次。

    • 如果修改线程数,如10 ,就是开启是10个线程跑这个线程组,所以仅一次控制器中的内容执行10次。
    • 如果修改循环次数,如10 ,表示只开启一个线程,跑这个线程组10次,而这10次中仅执行一次仅一次控制器中的内容。

    (8)运行查看结果

    运行脚本查看结果,我们可以看到创建了一次Excel文件,执行了4次登陆操作,也写了四次内容到Excel中。这和我们预习的流程是一样的。

    如下图所示:

     

    然后我们再来看看Excel文件中的内容,如下图所示:

    我们可以根据自己的需求,自定义文件中的格式和需要存储的内容(修改封装代码)。

    最后:下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!【100%无套路免费领取】

    软件测试面试小程序

    被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

    涵盖以下这些面试题板块:

    1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

    6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

      全套资料获取方式:点击下方小卡片自行领取即可

  • 相关阅读:
    安防监控/视频存储/视频汇聚平台EasyCVR接入海康Ehome车载设备出现收流超时的原因排查
    docker alpine镜像中遇到 not found
    AdaMixer--真正的降维打击!!
    un7.28:如何将项目打包到Linux虚拟机中并成功运行(下)?
    复习一周,字节跳动三场技术面+HR面,不小心拿了offer
    Hive 定义变量 变量赋值 引用变量
    【送书活动】网络安全(黑客)自学
    基于STM32设计的酒驾报警系统
    【matplotlib】绘制散点图,为不同区域的点添加不同颜色+添加纵向\横向分割线(含Python代码实例)
    arthas的监控java性能
  • 原文地址:https://blog.csdn.net/weixin_57794111/article/details/133308486