『动善时』JMeter基础 — 37、将JMeter测试结果写入Excel
在使用JMeter进行测试的过程中,有时候需要将测试结果写入到Excel文件,本篇文章将详细说明具体步骤。
把测试结果写入Excel文件中操作思路分析:
(1)准备需要的环境
- 引入操作Excel文件的基础JAR包:
jxl.jar。 - 封装自定义操作Excel的JAR包
- Excel中一般有三个要素:
workbook,sheet,cell。
要想把结果存储到指定的单元格中,那么就必须要确定好这三个元素依次来定位。
1)先获取Excel的文件名。
2)获取表单名。
3)获取单元格的坐标。 - 获取结果,写入到对应的单元格里面去。
- 需要利用BeanShell编写Java代码,获取对应的数据写入到Excel里面去。
- Excel中一般有三个要素:
(2)准备需要的数据文件。
(3)编写JMeter脚本,添加需要的组件,并控制组件的执行顺序,完成最终的测试。
1、环境准备
(1)引入操作Excel文件的基础JAR包
- 需要使用第三方jar包:
jxl.jar。 jxl.jar的作用:完成对Excel文件的读写以及修改操作。- 下载好之后,放到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、准备测试需要的数据
代码准备好后,我们要准备对应的测试数据,需要准备的数据有两部分:
- 测试用例数据。
- 参数化数据。
说明:我们都用
.csv格式的数据文件,注意编码UTF-8,防止中文乱码。
(1)测试用例数据
测试用例数据文件内容如下:

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

提示:测试用例数据和参数化数据可以准备到一个文件中,也可以分开准备,根据自己的需求去做。
3、测试结果写入Excel演示
(1)测试计划内包含的元件
添加元件操作步骤:
- 创建测试计划。
- 创建线程组:
选中“测试计划”右键 —> 添加 —> 线程(用户) —> 线程组。 - 在线程组中,添加配置元件
CSV Data Set Config组件:选中“线程组”右键 —> 添加 —> 配置元件 —> CSV Data Set Config。 - 在线程组中,添加取样器“HTTP请求”组件:
选中“线程组”右键 —> 添加 —> 取样器 —> HTTP请求。 - 在取样器下,添加后置处理器“正则表达式提取器”组件:
选中“取样器”右键 —> 添加 —> 后置处理器 —> 正则表达式提取器。 - 在线程组中,添加逻辑控制器“仅一次控制器”组件:
选中“线程组”右键 —> 添加 —> 逻辑控制器 —> 仅一次控制器。 - 在线程组中,添加取样器“BeanShell 取样器”组件:
选中“线程组”右键 —> 添加 —> 取样器 —> BeanShell取样器。 - 在线程组中,添加监听器“察看结果树”组件:
选中“线程组”右键 —> 添加 —> 监听器 —> 察看结果树。
提示:需要重复添加的组件这里不重复描述。
最终测试计划中的元件如下:

点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。
(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基础 — 37、将JMeter测试结果写入Excel的更多相关文章
- 『动善时』JMeter基础 — 6、使用JMeter发送一个最基础的请求
目录 步骤1:创建一个测试计划 步骤2:创建线程组 步骤3:创建取样器 步骤4:创建监听器 步骤5:完善信息 步骤6:保存测试计划 步骤7:查看结果 总结:JMeter测试计划要素 当我们第一次打开J ...
- 『动善时』JMeter基础 — 41、使用JMeter连接数据库(MySQL)
目录 1.为什么要使用JMeter连接数据库 2.JMeter连接数据库的前提 3.JDBC连接配置组件界面介绍 4.JMeter连接数据库演示 (1)测试计划内包含的元件 (2)测试计划中添加链接数 ...
- 『动善时』JMeter基础 — 2、JMeter的安装和启动
1.安装Java环境 由于JMeter是纯Java的桌面应用程序,因此它的运行环境需要Java环境,即需要安装JDK或JRE.(也就是安装JDK环境) 步骤简要说明: 下载并安装JDK 配置环境变量 ...
- 『动善时』JMeter基础 — 7、jmeter.properties文件常用配置
目录 1.默认语言设置 2.配置默认编码格式 3.GUI图标放大比例设置 4.功能区工具栏图标大小设置 5.视图区目录树图标大小设置 6.内容区编辑字体设置 7.添加JMeter元素快捷键设置 8.捕 ...
- 『动善时』JMeter基础 — 27、通过JMeter函数助手实现参数化
目录 1.测试计划中的元件 2.数据文件内容 3.函数助手配置 (1)函数助手的打开方式 (2)函数助手界面介绍 (3)编辑后的函数助手界面 4.HTTP请求组件内容 5.线程组元件内容 6.脚本运行 ...
- 『动善时』JMeter基础 — 32、JMeter察看结果树组件详解
目录 1.察看结果树介绍 2.察看结果树界面详解 3.察看结果树的其他功能 (1)将数据写入文件中 (2)Search功能 (3)Scroll automatically选项 4.总结 1.察看结果树 ...
- 『动善时』JMeter基础 — 47、JMeter的HTTP代理服务器详细介绍
目录 1.HTTP代理服务器的添加 2.HTTP代理服务器界面详解 (1)State:状态 (2)Global Settings:全局设置 (3)Test Plan Creation:测试计划创建 ( ...
- 『动善时』JMeter基础 — 48、使用JMeter自身代理录制测试脚本
目录 1.测试计划内包含的元件 2.HTTP代理服务器的设置内容 3.设置浏览器的代理服务器 4.录制脚本 5.查看录制的脚本 6.HTTP代理服务器的排除模式 7.保存脚本 录制脚本只不过是我们日常 ...
- 『动善时』JMeter基础 — 49、使用JMeter自身代理录制APP测试脚本
目录 1.测试计划内包含的元件 2.HTTP代理服务器的设置内容 3.设置手机的代理服务器 4.录制脚本 5.查看录制的脚本 6.HTTP代理服务器的排除模式 7.保存脚本 8.注意坑点 录制脚本只不 ...
随机推荐
- 基于Docker配置本地Gitlab
技术背景 Github和Gitee(码云)是最常见的基于git的代码托管平台,现在基于svn的代码管理仓库已经相对比较少见了,大部分还都是企业内部的代码仓.但是基于开源的Gitlab,我们在企业内网也 ...
- UVA11549计算器谜题
题意: 有一个计算机只能保留数字的前n位,你有一个数字k(k<=9),反复平方后在计算机上显示的最大数字是多少. 思路: 显然这个题目是有循环节的,为什么有循环节?首先 ...
- POJ3422简单费用流
题意: 给一个n*n的矩阵,从左上角走到右下角,的最大收益,可以走k次,每个格子的价值只能取一次,但是可以走多次. 思路: 比较简单的一个费用流题目,直接拆点,拆开的点之间连接两 ...
- Linux提权之利用 /etc/passwd 文件
当我们获得了某个Linux服务器的低权限之后,我们想要对该低权限账号进行提权,以执行更多的操作. 接下来我们的提权是利用 /etc/passwd 文件的可写入权限,导致我们写入一个其他用户进去. 首先 ...
- XCTF-mfw
mfw mfw是什么东西??? 看题: 进来只有几个标签,挨着点一遍,到About页面 看到了Git,猜测有git泄露,访问/.git/HEAD成功 上Githack,但是会一直重复 按了一次ctrl ...
- MySQL权限管理实战
前言: 不清楚各位同学对数据库用户权限管理是否了解,作为一名 DBA ,用户权限管理是绕不开的一项工作内容.特别是生产库,数据库用户权限更应该规范管理.本篇文章将会介绍下 MySQL 用户权限管理相关 ...
- MySQL8.0大表秒加字段,是真的吗?
前言: 很早就听说 MySQL8.0 支持快速加列,可以实现大表秒级加字段.笔者自己本地也有8.0环境,但一直未进行测试.本篇文章我们就一起来看下 MySQL8.0 快速加列到底要如何操作. 1.了解 ...
- OO_Unit1_表达式求导
CSDN链接 一.第一次作业 1.需求分析 简单多项式导函数 带符号整数 支持前导0的带符号整数,符号可省略,如: +02.-16.19260817等. 幂函数 一般形式 由自变量x和指数组成,指数为 ...
- API网关才是大势所趋?SpringCloud Gateway保姆级入门教程
什么是微服务网关 SpringCloud Gateway是Spring全家桶中一个比较新的项目,Spring社区是这么介绍它的: 该项目借助Spring WebFlux的能力,打造了一个API网关.旨 ...
- CSS层叠性
比较id,类,标签的数量 谁多就谁在上面 255个类的权重等于一个id 当权重一样时,以后设置的为准 通过继承而来的,权重为0 !important (设置权重无限大)可以影响权重,但只能影响选中的, ...