列如:在进行登录与登录后才能执行的步骤(列如搜索)的测试时,会出现登录测试成功了但是其他的步骤却显示"请先登录"等的情况(我这里是提示我传送的token值不正确,ps:token是不断变化的,非手动输入的,一般需要的token在此请求之前的某个请求的响应结果里面,找到后使用正则表达式提取器提取参数或者JSON Extractor提取,只有在需要输入token的地方动态引用。)
这时就可以添加一个HTTP Cookie 管理器放到所有的请求上面,这时重新运行就成功了。
因为浏览器会保存每次操作的cookie,但是jmeter没有,所以只能人为的去进行添加。
添加cookie管理器是一种比较简单直接的方式,但是有时候cookie的值动态变动了可能会不起作用,另外一种方式就是利用正则表达式处理器。
我们先找到自己要提取的cookie的值如下图。
之后添加正则表达式提取器提取信息如下图。
最后在需要的http请求下面添加cookie管理器,这样就可以动态的获取cookie的值了(这个方法不行的话就在http信息头管理器中添加一个Cookie参数,值为刚刚提取的${cookie})
使用参数化进行测试多组不同的数据。
写入结果到Excel表格,首先要有jar包jxl.jar,将jar包放在jmeter文件的lib文件夹内重启jmeter即可。之后书写java脚本,这里需要在java类中引用jxl.jar包。
代码如下(示例,网上找的):
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.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;
public class CWResultFile {
/*
* wOutputFile方法写结果文件
* wOutputFile(文件路径,用例编号,测试验证点,测试数据,预期结果,实际结果)
*/
public void wOutputFile(String filepath, String caseNo, String testPoint, String testData, String preResult, String fresult) throws WriteException, BiffException, IOException {
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表中所包含的总列数
// 获取Sheet表中所包含的总行数
int rsRows = readsheet.getRows();
// System.out.println(rsRows);
/******************************** 字体样式设置 ****************************/
// 字体样式
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, testData); // 第3列--测试数据;
Label labetest4 = new Label(3, rsRows, preResult); // 第4列--预期结果;
Label labetest5 = new Label(4, rsRows, fresult); // 第5列--实际结果;
// 两个值同时相等才会显示通过
if (preResult.equals(fresult)) {
result = "通过";
wcf.setBackground(Colour.BRIGHT_GREEN); // 通过案例标注绿色
} else {
result = "不通过";
wcf.setBackground(Colour.RED); // 不通过案例标注红色
}
Label labetest6 = new Label(5, rsRows, result, wcf); // 第6列--执行结果;
readsheet.addCell(labetest1);
readsheet.addCell(labetest2);
readsheet.addCell(labetest3);
readsheet.addCell(labetest4);
readsheet.addCell(labetest5);
readsheet.addCell(labetest6);
}
wbook.write();
wbook.close();
}
/*
* cOutputFile方法创建输出文件
* cOutputFile方法返回文件路径,作为wOutputFile的入参
*/
public String cOutputFile(String tradeType) throws IOException,
WriteException {
String temp_str = "";
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
// 获取时间戳
temp_str = sdf.format(date);
// 以时间戳命名结果文件,确保唯一
String filepath = "D:\\testtool\\document" + tradeType + "_output_" + "_" + temp_str
+ ".xls";
File output = new File(filepath); // 把filepath封装成一个File对象
if (!output.isFile()) {
// 如果指定文件不存在,则创建该文件
output.createNewFile();
WritableWorkbook writeBook = Workbook.createWorkbook(output); // 创建excel的文档对象
// createSheet(Sheet名称,第几个Sheet)
WritableSheet Sheet = writeBook.createSheet("输出结果", 0);
// 字体样式
WritableFont headFont = new WritableFont(
WritableFont.createFont("宋体"), 11, WritableFont.BOLD);
WritableCellFormat headwcf = new WritableCellFormat(headFont);
// 灰色
headwcf.setBackground(Colour.GRAY_25);
// Sheet.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(列号,行号,内容)
Label label00 = new Label(0, 0, "用例编号", headwcf);
Label label10 = new Label(1, 0, "用例标题", headwcf);
Label label20 = new Label(2, 0, "测试数据", headwcf);
Label label30 = new Label(3, 0, "预期结果", headwcf);
Label label40 = new Label(4, 0, "实际结果", headwcf);
Label label50 = new Label(5, 0, "执行结果", headwcf);
Sheet.addCell(label00);
Sheet.addCell(label10);
Sheet.addCell(label20);
Sheet.addCell(label30);
Sheet.addCell(label40);
Sheet.addCell(label50);
writeBook.write();
writeBook.close();
}
return filepath;
}
}
导出成jar包存在jmeter解压路径下的lib文件夹下的ext文件夹下,之后重启jmeter
在调用代码之前我们要对http请求进行参数化(利用CSV Data Set Config),引用多组不同的数据来使得有多组不同的结果。
创建一个BeanShell Sampler元件来创建Excel和调用代码
在BeanShell Sampler中写入代码创建Excel
代码为:
import file.CWResultFile;
t=new CWResultFile();
String filepath = t.cOutputFile("测试结果");
vars.put("filepath",filepath); //转为Jmeter变量,方便后期获取
为了使创建Excel表格只执行一次(一次把所有结果写进表格),创建一个仅一次控制器(逻辑控制器中),将BeanShell Sampler元件放在这个控制器下。
在讲结果写回前要准备一个Excel模板文件,文件就写入自己要写入的数据准备。
添加CSV Data Set Config提取这三个数据之后再代码上会用到
创建正则表达式提取器获得结果的所有值,获得实际结果
之后再创建一个BeanShell Sampler元件写回结果到Excel。
代码如下:
import file.CWResultFile;
t=new CWResultFile();
String filepath=vars.get("filepath");
String caseNo=vars.get("caseNo");
String testPoint=vars.get("testPoint");
String testData="{\"mobilephone\":\"${mobilephone}\",\"pwd\":\"${pwd}\"}";
String preResult=vars.get("preResult");
String fresult=vars.get("fresult");//用get方法可以确保获取到的是字符串,里面传递的是变量名,不需要用${变量名}这种方式
t.wOutputFile(filepath,caseNo,testPoint,testData,preResult,fresult);
执行程序就可以在之前java代码写的地址里面知道导出的Excel表格,数据结果会根据自己填写的预期结果和在jmeter中获取的实际结果作对比,判断是否通过。
有些时候只需要进行一次登录然后进行多次别的操作,这时候就要把登录请求单独设成一个线程组,把这个线程组要传给别的请求的参数设置成公变量。在登录对应的线程中的http请求下用JSON Extractor或者正则表达式提取器提取出其他请求需要的参数以及cookie的值,再添加一个BeanShell PostProcessor元件,把我们提取的变量设置为公变量。
利用函数助手生成设置公变量的表达式,先要打开函数助手选择__setProperty函数,再填入需要生成公变量的参数的对应信息。
之后便在另一个线程组中利用${__property(变量名)}函数来吧公变量转化为局部变量自己使用。
对于一般在http请求中要传的参数就直接在Parameters中将参数的值改为${__property(变量名)}来使用(列如传token:${__property(token)}),像cookie这个参数就要在http信息头管理器中加一个Cookie参数,值为刚刚自己提取的以及自己命名的变量名的__property()函数写法。