Jmeter BeanShell断言

操作文件 BeanShell Assertion

import java.io.*;
import java.io.IOException;
import org.apache.commons.io.*;

//源文件和目标文件路径
File source = new File("\\\\scmisrma02/Shipping/Web/ShippingExternal/LogisticsShippingLabel/V2/Config_bak.json");
File dest = new File("\\\\scmisrma02/Shipping/Web/ShippingExternal/LogisticsShippingLabel/V2/Config.json");

//判断源文件存在则复制文件,若目标文件已存在,会强制覆盖目标文件
if (source.exists())
{
	FileUtils.copyFile(source, dest);
}
else
{
	Failure = true;
	FailureMessage = "源文件Config_bak.json不存在";
	return;
}

后置处理器 BeanShell PostProcessor

//导入需要的程序包
import org.json.*;

//将Response取出为String类型
String response_string = prev.getResponseDataAsString();

//将String类型的Response构造成JSONObject对象
JSONObject response_obj = new JSONObject(response_string);

//将LabelInformations节点下数据取出构造为数组对象
JSONArray labelInformations = response_obj.getJSONArray("LabelInformations");
int len = labelInformations.length();

//创建一个HashMap,以LabelNumber为Key,单个包裹数据为Value,构造成键值对Map
Map packages = new HashMap();
for(int i = 0; i < len; i++)
{
	JSONObject packages_temp = (JSONObject)labelInformations.getJSONObject(i);//获取数组对象
	String labelNumber_str = packages_temp.get("LabelNumber").toString();;
	int labelNumber = Integer.valueOf(labelNumber_str).intValue();
	packages.put(labelNumber,packages_temp);
}
//将Response对象和LabelInformations键值对赋值给变量,在BeanShell断言中调用

props.put("${__RandomString(10,abcdefghijklmn,packages)}",packages);
props.put("${__RandomString(10,asdfghnjvkclm,response_obj)}",response_obj);




断言 BeanShell Assertion

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.regex.*;
import org.json.*;

//获取BeanShell后置处理程序中定义的变量
HashMap packages_new = props.get("${packages}");
JSONObject response_obj_new = props.get("${response_obj}");

//数据库查询到的总条数和接口返回的总条数
int dbcount = vars.getObject("sqlresult").size();
int res_count = packages_new.size();

//获取响应中校验的字段值
String res_ActualShippingMethod = response_obj_new.get("ActualShippingMethod").toString();
String res_AddressType = response_obj_new.get("AddressType").toString();

//获取从excel中得到的字段的值
req_DeclaredValue = vars.get("DeclaredValue");
req_DeclaredValueRequired = vars.get("DeclaredValueRequired");
req_SignatureRequired = vars.get("SignatureRequired");
req_ShipviaCode = vars.get("ShipviaCode");
req_STState = vars.get("STState");

//ActualShippingMethod校验
if(!res_ActualShippingMethod.equals("RRTRTT"))
{
	Failure = true;
	FailureMessage = "ActualShippingMethod校验失败";
	return;
}

//判断数据库查询的结果总数与响应中的结果总数是否一样,一样再继续后续步骤
if(dbcount != res_count || res_count != 1)
{
	Failure=true;
	FailureMessage="接口结果数量:"+res_count+"和数据库结果数量:"+dbcount+"不一致";
	return;
}

//Shipvia in ('038','039')&PR时,ShippingLabelPath校验逻辑
if((req_ShipviaCode.equals("038") || req_ShipviaCode.equals("039")) && req_STState.equals("PR"))
{
	//判断返回的ShippingLabelPath路径正确
	String res_ShippingLabelPath = response_obj_new.get("ShippingLabelPath").toString();
	String pattern = "^http\\\\S+${ShippingLabelPath}\\\\S+pdf$";
	if(!Pattern.matches(pattern, res_ShippingLabelPath))
	{
		Failure = true;
		FailureMessage = "ShippingLabelPath校验失败";
		return;
	}
	//判断LabelInformations节点下的ShippingLabelPath为''
	for(int i = 1; i <= res_count; i++)
	{
		//获取LabelInformations中ShippingLabelPath值
		JSONObject packages_new_temp = (JSONObject)packages_new.get(i);
		String res_ShippingLabelPath = packages_new_temp.get("ShippingLabelPath").toString();
		//ShippingLabelPath为空判断
		if(!res_ShippingLabelPath.equals(""))
		{
			Failure = true;
			FailureMessage = "LabelInformations下ShippingLabelPath校验失败";
			break;
		}	
	}
}
else //非038,039 PR校验逻辑
{
	//ShippingLabelPath校验
	for(int i = 1; i <= res_count; i++)
	{
		//获取LabelInformations中ShippingLabelPath值
		JSONObject packages_new_temp = (JSONObject)packages_new.get(i);
		String res_ShippingLabelPath = packages_new_temp.get("ShippingLabelPath").toString();
		//定义正则表达式进行匹配
		String pattern = "^http\\\\S+${ShippingLabelPath}\\\\S+pdf$";
		if(!Pattern.matches(pattern, res_ShippingLabelPath))
		{
			Failure = true;
			FailureMessage = "ShippingLabelPath校验失败";
			break;
		}
	}
}

//逐项对比
for(int i = 0; i < dbcount; i++)
{
	//获取数据库中数据对应的值
	db_TrackingNumber = vars.getObject("sqlresult").get(i).get("TrackingNumber").toString().trim();
	db_DeclaredValue = vars.getObject("sqlresult").get(i).get("DeclaredValue").toString().trim();
	db_Coverage = vars.getObject("sqlresult").get(i).get("Coverage").toString().trim();
	db_AdditionalMark = vars.getObject("sqlresult").get(i).get("AdditionalMark").toString().trim();
	db_AddressType = vars.getObject("sqlresult").get(i).get("AddressType").toString().trim();
	
	//获取LabelInformations中对应字段值
	JSONObject packages_new_temp = (JSONObject)packages_new.get(i+1);
	String res_TrackingNumber = packages_new_temp.get("TrackingNumber").toString();
	String res_SignatureRequired = packages_new_temp.get("SignatureRequired").toString();
	String res_DeclaredValueRequired = packages_new_temp.get("DeclaredValueRequired").toString();
	
	//TrackingNumber判断
	if(!db_TrackingNumber.equals(res_TrackingNumber))//当校验数据不相等,则校验失败
	{
		Failure = true;
		FailureMessage = "接口TrackingNumber:"+ResTrackingNumber+"和数据库结果:"+db_TrackingNumber+"不一致";
		break;
	}
	
	//响应与输入SignatureRequired与存储AdditionalMark判断
	if(!res_SignatureRequired.equals(db_AdditionalMark) || !res_SignatureRequired.equals(req_SignatureRequired))
	{
		Failure = true;
		FailureMessage = "SignatureRequired校验失败";
		break;
	}

	//DeclaredValueRequired判断
	if(!res_DeclaredValueRequired.equals(req_DeclaredValueRequired))
	{
		Failure = true;
		FailureMessage = "DeclaredValueRequired校验失败";
		break;
	}

	//DeclaredValue与Coverage判断
	if(!db_DeclaredValue.equals(req_DeclaredValue) || !db_Coverage.equals(req_DeclaredValue))
	{
		Failure = true;
		FailureMessage = "DeclaredValue校验失败";
		break;
	}

	//AddressType判断
	if(!db_AddressType.equals(res_AddressType))
	{
		Failure = true;
		FailureMessage = "AddressType校验失败";
		break;
	}
}

JSON Extractor
在这里插入图片描述

int dbcount = vars.getObject("sqlresult").size();//数据库查询到的总条数
if(dbcount==1)//判断数据库查询的条数是否为1,为1在进行对比
{
	Failure=false;
}	
else
{
	Failure=true;
	FailureMessage="数据库校验失败";
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JMeter Beanshell断言是一种使用Beanshell脚本语言编写的断言方式,用于在JMeter测试计划中验证响应结果是否符合预期。 Beanshell是一种动态语言,可以方便地使用Java API和JMeter内置函数。 ### 回答2: JMeter是一个功能强大的开源负载测试工具,它可以通过模拟多种负载条件对Web应用程序或服务器进行测试,以评估其性能和稳定性。BeanshellJMeter的一种断言方式,它能够实现复杂的测试逻辑和定制化断言,并且非常容易编写和使用。 首先,布尔型断言比较简单,它能够检查响应中的指定文本是否存在。例如,我们可以通过以下方式创建一个布尔型断言: 1.添加一个HTTP请求,并指定要测试的网址。 2.选择添加断言并选择“响应断言”。 3.选择“Beanshell Assertion”。 4.在Beanshell编辑器中输入以下代码: String response = new String(data); if (!response.contains("expected text")){ Failure = true; FailureMessage = "Could not find expected text"; } 这个断言逻辑非常简单,它将HTTP响应中的文本转换为字符串,然后检查它是否包含特定的预期文本。如果未找到预期文本,则会将断言标记为“失败”并显示消息“未找到预期文本”。 其次,JMeterBeanshell还支持更高级的断言,例如XPath断言和JSON断言等。例如,我们可以通过以下方式创建一个XPath断言: 1.添加一个HTTP请求,并指定要测试的网址。 2.选择添加断言并选择“响应断言”。 3.选择“Beanshell Assertion”。 4.在Beanshell编辑器中输入以下代码: import javax.xml.xpath.*; DocumentBuilderFactory Factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = Factory.newDocumentBuilder(); Document doc = builder.parse(new InputSource(new StringReader(new String(data)))); doc.getDocumentElement().normalize(); XPathFactory xPathfactory = XPathFactory.newInstance(); XPath xpath = xPathfactory.newXPath(); XPathExpression expr = xpath.compile("xpath expression"); if (!Boolean.parseBoolean(expr.evaluate(doc))){ Failure = true; FailureMessage = "Could not find expected element using XPath"; } 这个断言逻辑比较复杂,它使用XPath表达式来遍历文档树并查找特定的XML元素。如果未找到预期元素,则会将断言标记为“失败”并显示消息“使用XPath无法找到预期元素”。 总的来说,JMeterBeanshell断言提供了一种非常灵活和强大的测试工具,可以轻松地实现复杂的测试逻辑和定制化断言。无论您是测试Web应用程序还是服务器,都可以使用Beanshell来创建高品质的测试和评估。 ### 回答3: JMeter是一个开源的性能测试工具,而Beanshell是一种基于Java的脚本语言,它允许开发人员在运行时编写程序代码。如果需要在JMeter中编写自定义的测试脚本或逻辑,就需要使用Beanshell来实现。 在JMeter中,Beanshell可以用于断言中,以验证测试结果。断言是用来确认请求的响应是否符合预期的工具。Beanshell断言是一种用户自定义的断言类型,利用Beanshell脚本语言编写。 要添加Beanshell断言,首先需要创建一个断言类型。在JMeter的测试计划中,右键单击线程组并选择“添加” ->“断言” ->“响应断言”。然后在“响应断言”窗口中,选择“对于响应断言的测试元素” ->“Beanshell断言”。 接下来,需要编写Beanshell脚本。Beanshell脚本根据用户需求定义,可以在测试计划中使用变量,如响应头、响应数据和URL。脚本应该返回一个Boolean类型的值。如果脚本返回true,则测试结果符合预期;否则,测试结果不符合预期。 在执行测试时,JMeter对每个响应进行断言测试。如果某个响应不符合预期,则测试计划会生成失败结果。用户可以根据断言结果来获取有关测试质量的详细信息。 总体来说,JMeter Beanshell断言是一种非常有用的测试工具,允许开发人员自定义断言逻辑,并通过脚本解决特定的测试问题。SuppressWarnings(“unchecked”)注释和其他技术可用于确保编写的脚本的正确执行,并获得名称良好和可读性良好的测试结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值