在使用JMeter进行测试的过程中,有时候需要将测试结果写入到Excel文件,本篇文章将详细说明具体步骤。

把测试结果写入Excel文件中操作思路分析

(1)准备需要的环境

  1. 引入操作Excel文件的基础JAR包:jxl.jar
  2. 封装自定义操作Excel的JAR包
    • Excel中一般有三个要素:workbooksheetcell
      要想把结果存储到指定的单元格中,那么就必须要确定好这三个元素依次来定位。
      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,在新建一个sheetWritableWorkbook 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;}
}

Jmeter高级性能测试实战https://edu.csdn.net/course/detail/35834

提示:

  • 使用自己的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.新建对象
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文件中。因为每次循环都要执行,所以放在和登陆请求同级。

编写脚本内容如下:

// 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。(不要修改线程数)

提示:线程数和循环次数的区别

仅一次控制器,对某个线程组只执行一次。

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

(8)运行查看结果

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

如下图所示:

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

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

Jmeter高级性能测试实战https://edu.csdn.net/course/detail/35834

性能测试之JMeter测试结果写入Excel相关推荐

  1. 性能测试之Jmeter元件

    性能测试之Jmeter元件 1.性能测试的本质 性能测试的定义 基于协议模拟用户发请求,对服务器形成一定的负载,来测试服务器的性能指标是否满足用户(产品&公司)的需求. 关注点 时间性能 空间 ...

  2. 多测师肖sir__性能测试之jmeter操作(2)

    一.jmeter 介绍 1·.jmeter jmeter 性能测试工具,是apache组织开发基于java的压力测试工具. 2.jmeter 的特点 (1)jmeter可以对http和ftp 服务器进 ...

  3. 性能测试之JMeter函数助手详解

    1.函数助手介绍 在性能测试过程中,为了模拟真实的用户,往往我们需要让提交的表单内容每次都发生变化,这个过程叫做参数化. JMeter中的配置元件与前置处理器都能帮助我们实现参数化,为了能够更好的帮助 ...

  4. jmeter csv参数化_性能测试之Jmeter中如何设置参数化数据

    参数化配置 jmeter中进行参数化设置,右击测试计划或者线程组,add->config element->CSV Data Set Config参数1.png Allow quoted ...

  5. jmeter 线程执行顺序_性能测试之jmeter逻辑控制种类详解一

    逻辑控制器介绍 Jmeter逻辑控制可以对元件的执行逻辑进行控制,除Once only Controller仅一次控制器以外,其他控制器都可以可以嵌套其他种类的控制器,下面是jmeter5.3支持的控 ...

  6. 性能测试之JMeter配置元件【HTTP信息头管理器】

    JMeter提供了丰富的配置元件,常用的包括参数化配置元件.HTTP请求默认值.HTTP信息头管理器.计数器等,这些配置元件用于设置默认值和变量,提供给后面的sampler(取样器)使用. 提示:本文 ...

  7. 性能测试之JMeter主页面布局

    在介绍JMeter主页面布局的菜单栏和图标之前,我们可以把语言切换为简体中文,如下图所示: JMeter的主界面布局分为标题栏.菜单栏.工具栏.树形标签栏和内容栏,如下图所示: 接下来我们来逐一说明. ...

  8. 性能测试之JMeter取样器详解:sampler

    1.取样器介绍 取样器是用来模拟用户操作的,向服务器发送请求以及接收服务器的响应数据. 取样器是在线程组内部的元件,也就是说取样器只能在线程组中添加. 取样器(Sampler)是性能测试中向服务器发送 ...

  9. 性能测试之JMeter配置元件【随机变量】

    1.随机变量介绍 随机变量应用场景:在一些数据要求不重复,或者对数据取值需要正态分布的时候,我们可以采用随机变量组件来满足需求. 随机变量与用户自定义变量的区别: 随机变量(random variab ...

最新文章

  1. mysql 查询绑定变量_MySQL高级特性——绑定变量
  2. Java Socket入门实例
  3. 子恩域名授权系统2.0全解无加密无授权版盗版入库源码
  4. Google谷歌通过地址计算两地距离 HOW TO CALCULATE DRIVING DISTANCE BETWEEN 2 LOCATIONS
  5. 嵌入式知识概要(1)
  6. 数据结构与算法之-----总览
  7. 关于imx8mp的es8316的芯片调试
  8. 卷积法求解系统的零状态响应_信号与系统题
  9. 计算机英语(第四版)
  10. python you-get ffmpeg 下载哔哩哔哩视频
  11. 电脑怎么压缩图片大小kb?压缩图片用什么软件?
  12. centos 7(桌面应用)-桌面的应用合集
  13. 华为使用计算机投屏要打开什么,华为Mate20手机怎么投屏到电脑上呢
  14. 炫酷粒子表白,双十一脱单靠它了!
  15. intellij idea处理xml文件File encoding is disabled,Encoding is hard-coded in the text.提示的方法
  16. pygame战棋游戏制作之战棋回合切换(五)
  17. Three.js指定路径漫游(站走切换、路径动画、展示路线、开始、暂停、继续、退出、镜头跟随)
  18. threejs 场景中模型部分剖切
  19. 到圣诞节了,不得不庆祝一下,用C++ Beep函数做了一个小程序
  20. Cannot run program “mvn“ (in directory “/var/lib/jenkins/workspace)

热门文章

  1. python 如何做密码对话框_Python GUI教程(八):在主窗口中调用对话框
  2. Tomcat学习总结(10)——Tomcat多实例冗余部署
  3. Git学习总结(8)——Git和SVN之间的基本区别
  4. java持久层用文件_Java持久层框架MyBatis简单实例
  5. Java深入研究_Java底层深入研究(一)
  6. 织梦tag标签按照设定的栏目id获取相应的内容或自动获取相应栏目tag
  7. 找回被删并清空了回收站的文件
  8. ionic 图片加载失败,显示默认图片代替
  9. Atitit.病毒木马程序的感染 传播扩散 原理
  10. Spinner与适配器模式总结