jmeter初体验(三)

文章目录

  • 一、cookie处理方式
  • 二、测试结果写入Excel
  • 三、多个线程传递参数


一、cookie处理方式


列如:在进行登录与登录后才能执行的步骤(列如搜索)的测试时,会出现登录测试成功了但是其他的步骤却显示"请先登录"等的情况(我这里是提示我传送的token值不正确,ps:token是不断变化的,非手动输入的,一般需要的token在此请求之前的某个请求的响应结果里面,找到后使用正则表达式提取器提取参数或者JSON Extractor提取,只有在需要输入token的地方动态引用。)
这时就可以添加一个HTTP Cookie 管理器放到所有的请求上面,这时重新运行就成功了。
因为浏览器会保存每次操作的cookie,但是jmeter没有,所以只能人为的去进行添加。
jmeter初体验(三)_第1张图片
jmeter初体验(三)_第2张图片
添加cookie管理器是一种比较简单直接的方式,但是有时候cookie的值动态变动了可能会不起作用,另外一种方式就是利用正则表达式处理器。
我们先找到自己要提取的cookie的值如下图。
jmeter初体验(三)_第3张图片
之后添加正则表达式提取器提取信息如下图。
jmeter初体验(三)_第4张图片
最后在需要的http请求下面添加cookie管理器,这样就可以动态的获取cookie的值了(这个方法不行的话就在http信息头管理器中添加一个Cookie参数,值为刚刚提取的${cookie})jmeter初体验(三)_第5张图片



二、测试结果写入Excel


使用参数化进行测试多组不同的数据。
写入结果到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
jmeter初体验(三)_第6张图片
在调用代码之前我们要对http请求进行参数化(利用CSV Data Set Config),引用多组不同的数据来使得有多组不同的结果。
创建一个BeanShell Sampler元件来创建Excel和调用代码
jmeter初体验(三)_第7张图片
在BeanShell Sampler中写入代码创建Excel
jmeter初体验(三)_第8张图片
代码为:

import file.CWResultFile;
t=new CWResultFile();
String filepath = t.cOutputFile("测试结果");
vars.put("filepath",filepath);  //转为Jmeter变量,方便后期获取

为了使创建Excel表格只执行一次(一次把所有结果写进表格),创建一个仅一次控制器(逻辑控制器中),将BeanShell Sampler元件放在这个控制器下。
在讲结果写回前要准备一个Excel模板文件,文件就写入自己要写入的数据准备。
jmeter初体验(三)_第9张图片
添加CSV Data Set Config提取这三个数据之后再代码上会用到
jmeter初体验(三)_第10张图片
创建正则表达式提取器获得结果的所有值,获得实际结果
jmeter初体验(三)_第11张图片
之后再创建一个BeanShell Sampler元件写回结果到Excel。
jmeter初体验(三)_第12张图片
代码如下:

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元件,把我们提取的变量设置为公变量。
jmeter初体验(三)_第13张图片
jmeter初体验(三)_第14张图片

jmeter初体验(三)_第15张图片
利用函数助手生成设置公变量的表达式,先要打开函数助手选择__setProperty函数,再填入需要生成公变量的参数的对应信息。
jmeter初体验(三)_第16张图片
之后便在另一个线程组中利用${__property(变量名)}函数来吧公变量转化为局部变量自己使用。
对于一般在http请求中要传的参数就直接在Parameters中将参数的值改为${__property(变量名)}来使用(列如传token:${__property(token)}),像cookie这个参数就要在http信息头管理器中加一个Cookie参数,值为刚刚自己提取的以及自己命名的变量名的__property()函数写法。
jmeter初体验(三)_第17张图片

jmeter初体验(三)_第18张图片

你可能感兴趣的:(新手,软件测试)