怎么在公司网站上安装百度商桥,成都网站建设赢展,网站建设措施,网站开发需要的技术的流程JMeter高级使用
案例#xff1a;
用户登录后-选择商品-添加购物车-创建订单-验证结果
问题#xff1a;
JMeter测试中#xff0c;验证结果使用断言#xff0c;但断言都是固定的内容假如要判断的内容(预期内容)是在变化的, 有时候还是不确定的, 那该怎么办呢?
解决
用户登录后-选择商品-添加购物车-创建订单-验证结果
问题
JMeter测试中验证结果使用断言但断言都是固定的内容假如要判断的内容(预期内容)是在变化的, 有时候还是不确定的, 那该怎么办呢?
解决
1.通过查询数据库获取动态的结果2.使用beanshell断言进行结果验证
实现步骤 创建登录接口HTTP请求 创建添加购物车接口HTTP请求 创建订单接口HTTP请求通过数据查看订单号 对订单接口结果验证是否创建订单号 查询数据库获取结果 使用beanshell断言进行动态结果验证
1. JMeter连接数据库
1.1 数据库配置信息
配置信息
ip:192.168.1.242port:7090用户名test密码test123456数据库名称xxxx
可使用数据库连接工具进行连接例如navicat 1.2 连接数据库
元件JDBC Connection Configuration进行连接数据库
实现步骤 1.下载MySQL的jdbc驱动mysql-connector-java.jar https://mvnrepository.com/artifact/mysql/mysql-connector-java 将其放到放在指定的目录或者放在 …\apache-jmeter\lib\ 目录下 在测试计划下添加驱动地址 备注 如果放在jmeter/bin目录则不需要在测试计划下添加jar包 选择线程组-添加-配置原件-JDBC Connection Configuration 主要配置 Variable Name Bound to Pool 配置变量名称Variable Name不能为空 Database connection DataBase URL 格式为jdbc:mysql://服务器ip:端口号/数据库在数据库后加参数?allowMultiQueriestrue,可同时执行多条mysql语句否则报错select语句中含有中文字符的缘故jmeter识别不了。 解决办法就是在JDBC 的连接中增加useUnicodetruecharacterEncodingutf8 jdbc:mysql://211.103.136.242:7090/db-name
test
test123456添加JDBC Request 添加- 取样器- JDBC Request 添加变量和查询语句变量名必须和JDBC Connection Configuration中的变量名保持一致 查询语句 select order_id from tb_order_info where user_id1 order by order_id desc limit 3Variable names:将查询结果当做一个参数使用 查出来的数据有好些内容调用方式
取数据第1值调用$ {test_01}
取数据第5值调用$ {test_05}
取数据第n值调用$ {test_n}2. Beanshell使用
2.1 介绍
什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。 BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
官网:http://www.BeanShell.org/
JMeter中用BeanShell的好处
JMeter也是由java编写的而java运行时需要先编译然后才可以运行而BeanShell是一款解释器直接可能运行源代码
BeanShell在JMeter的作用
对JMeter的功能的扩展对jmeter变量的一些操作
2.2 Jmeter有哪些BeanShell
定时器 BeanShell Timer前置处理器BeanShell PreProcessor取样器 BeanShell Sampler后置处理器BeanShell PostProcessor断言 BeanShell断言监听器 BeanShell Listener
备注
一般归属于线程组或逻辑控制器相对独立而BeanShell PreProcessor和BeanShell PostProcessor归属于sampler取样器 前者是固定在sampler运行前运行后者是在sampler运行后运行二者都依赖于sampler而存在 BeanShell断言同样依赖于sampler作用是断言sampler是否成功
应用场景
生成变量解析响应结果定制化逻辑处理Beanshell还常用于请求发送前后的加密解密
2.3 Bean Shell常用内置变量
JMeter在它的BeanShell中内置了变量用户可以通过这些变量与JMeter进行交互其中主要的变量 log 打印日志 ctx 该变量引用了当前线程的上下文 vars - (JMeterVariables) 操作jmeter变量 props - (JMeterProperties) 操作jmeter属性该变量引用了JMeter的配置信息可以获取Jmeter的属性 prev - (获取sample返回的信息) 获取前面的sample返回的信息 Response 获取Response对象能通过这个对象获取响应信息 Failure 查看接口调使用能否成功假如返回false是成功的true是失败的 FailureMessage 失败信息没有设置的时候失败信息是空的可自定义相关信息 ResponseCode 返回接口code成功是200 SampleLabel 获取接口请求的名称 SamplerData 获取请求的url和body
备注
变量只对当前线程组有效属性是全局的。变量和属性的值只能是字符串。
2.4 内置变量详解介绍
2.4.1 log
介绍
用于打印日志最常用也最简单打印在 jmeter.log 中可以设置打印级别可以打印字符串、变量等。
使用方法
参考http://excalibur.apache.org/apidocs/org/apache/log/Logger.html 打印 info 形式的普通字符串日志 log.info(hello world);
#输出 hello world拼接字符串和变量 (其中 token 是 jmeter 局部变量) log.info(hello world ${token});
#输出 hello world 和 token 变量的拼接结果打印自定义变量 str hello world;
log.info(str);
#输出 hello world打印 error 形式的普通字符串日志,修改JMeter日志输出级别否则看不到 log.error(ERROR-ERROR);备注
print() 打印日志print() 是在控制台中输出信息log() 默认是在 jmeter.log 中输出信息日志文件在安装路径下bin\Jmeter.log中
2.4.2 vars
介绍
用于存取 jmeter 局部变量通常用于存取字符串内容也可以存取对象
使用方法
参考http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html 获取变量 vars.get() String key vars.get(name);
#获取变量名为 name 的值并保存在 key 中保存变量 vars.put() vars.put(name,value);
#把变量 name(值为 value)保存到jmeter变量中对象保存JMeter变量中 vars.putObject() vars.putObject(Object_name,new Object());
把对象Object_name保存到jmeter变量中变量删除 vars.remove() vars.remove(name);
#从jmeter变量中删除nameprint() 是在控制台中输出信息log() 默认是在 jmeter.log 中输出信息。
备注 bean shell提供了一个内置变量Parameters来保存参数的集合 log.info(Parameters);Parameters #输入${name1}${name2}
#脚本
//打印
log.info(传递的参数列表Parameters);
log.info(name1:bsh.args[0]);log.info(name2:bsh.args[1]);
log.info(name3:bsh.args[2]);
log.info(name3:bsh.args[3]);
//获取参数传递过来的值存在变量里
vars.put(v1,bsh.args[1]);
vars.put(v2,bsh_args[2]);
vars.put(v3,bsh_args[3]);log.info(v1:);
log.info(v2:);
log.info(v3:);2.4.3 props
介绍
设置 jmeter 全局的静态变量
使用方法 获取属性变量 props.get ymd props.get(START.YMD);
#获取属性 START.YMD 的值脚本启动日期
#其中的 key 和 value 均是字符串形式存入全局属性 props.put props.put(token,12ddb123)判断某属性是否存在 返回布尔值
props.containsKey(PROPERTY_NAME) 判断某项值是否存在返回布尔值
props.contains(PROPERTY_VALUE)删除某个值
props.remove(PROPERTY_NAME)所有属性以字符串形式表示
props.toString()备注
操作jmeter属性该变量引用了JMeter的配置信息可以获取Jmeter的属性它的使用方法与vars类似但是只能put进去String类型的值而不能是一个对象变量只对当前线程组有效属性props是全局的变量和属性的值只能是字符串
2.4.4 ctx/prev
介绍
ctx当前线程的上下文信息prev等同于ctx.getPreviousResult通过prev可以直接获取前一个取样器返回的信息
使用方法
参考ctx:http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html
参考prev:http://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html
prev.getResponseDataAsString()获取响应信息prev.getResponseCode() 获取响应code
String response_data prev.getResponseDataAsString();
log.info(res:response_data);
String response_code prev.getResponseCode();
log.info(res_code:response_code);2.4.5 其它
使用方法
参考http://jmeter.apache.org/api/org/apache/jmeter/samplers/Sampler.html其它 ResponseCode响应码 代码 ResponseCode 500结果 ResponseMessage响应结果 代码 ResponseMessage自定义返回结果结果 SampleResult 代码 SampleResult.setResponseData(Hello world);与ResponseMessage功能类似 IsSuccess设置返回是否成功 代码 IsSuccessfalse结果 Label取样器的名称 log.info(Label);Sample 通过sampler来访问当前取样器 使用方法参考http://jmeter.apache.org/api/org/apache/jmeter/samplers/Sampler.html
2.4.6 Beanshell线程共享变量
分析 变量只对当前线程组有效属性是全局的 使用beanshell把变量设置为全局变量
线程共享变量 Beanshell取样器设置全局属性 使用函数助手 ${__setProperty(authorizations,${token},)}使用props props.put(authorizations,${token})其它线程组通过JWT ${__property(authorizations,,)} HTTP响应信息头更新 JWT ${__property(authorizations,)} JMeter中线程间共享变量可以通过定义属性值来完成JMeter启动时会读取一些属性文件比如jmeter.properties、user.properties这些属性
值是可以增加的也可以修改的通过BeanShell可以对其进行更改。
以BeanShell Sampler为例在其中通过props.put()来增加属性props.get()来获取属性。
在其它Sampler中比如Java Sampler中通过 ${__property(【属性名称】,)}来获取。
2.5 Beanshell
通过Beanshell Sampler测试人员可以编写一些特定逻辑生成的数据并且通过vars.get、vars.put 或者props.get、props.put 把相应的变量传递到Jmeter脚本当中
vars.get(String,String) 可以获取Jmeter中已经生成的变量
vars.put(String,String) 可以创建和更新Jmeter变量
props.get(String,String) 可以获取Jmeter中已经生成的属性
props.put(String,String) 可以创建和更新Jmeter属性
vars和props的区别是前者是变量只能在同一线程组内传递后者是属性可以在整个测试计划中跨线程组传递。
beanshell参数详解 勾选每次调用前重置里面定义的变量就会被重置。 脚本文件可以导入beanshell脚本
调用java文件
java源文件
public class Myclass
{public int add(int a, int b){return a b;}
}步骤
在bean shel中通过source(“代码路径”)方法引入java然后调用方法和java一样new一个class,再调用里面的add 方法
//引入java文件 source将一个bsh脚本读到解释器或运行在另一个解释器
source(/TEST/Test.java);//绝对路径
//调用方法语法和java一样
int res new Test().add(1,2);
//保存变量
vars.put(add,res.toString());引入外部class文件 直接把上例中的java文件编译成class文件 用addClassPath(“D:\”)方法引入 class文件在用import导入包及类然后就可以像java一样调用了
//引入class文件
addClassPath(/Users/wuyanhong/Desktop/提升小课/接口测试零基础入门/代码/);
//导入类名
import MyClass;
//调用
int res new MyClass().add(1,2);
//保存变量
vars.put(add,res.toString());
//打印变量
log.info(vars.get(add));案例1获取当前时间格式为yyyy-MM-dd HH:mm:ss
下面举例写展示当前日期开发给个接口需要传递当前时间格式为yyyy-MM-dd HH:mm:ss
import java.util.*;import java.text.*;Date d new Date();DateFormat df new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);String dateStr df.format(d);vars.put(current_date,dateStr); //给jmeter添加一个变量,内置变量2.6 Beanshell断言
BeanShell断言可以使用beanshell脚本来执行断言检查可以用于更复杂的个性化需求使用更灵活功能更强大但是要能够熟练使用beanshell脚本。
在这里除了可以使用beanshell的内置变量外主要通过Failure和FailureMessage来设置断言结果。
Failure false;-----表示断言成功Failure true;-----表示断言失败FailureMessage “……”;-----自定义的失败信息。
实现步骤 在保存订单接口下添加beanshell断言 编写断言代码 //数据库的取值与接口正则取值比对
if(${db_order_id_1}.equals(${order_id}_1)) {Failurefalse;System.out.println(OK);
}
else
{ Failuretrue;FailureMessage不一致;
}参数详解
bsh.args[0]bsh.args是一个数组里面保存的是beanshell【参数】输入框中保存的变量参数可以将其他元件中已经定义的变量作为参数传给beanshell脚本传入的参数被存在bsh.args数组中脚本文件可以从文件导入脚本而不是直接写。脚本直接编写beanshell代码
2.7 BeanShell PreProcessor
测试中接口请求参数大部分需要加密后请求处理需要加密的参数就需要用到jmeter中的前置处理器BeanShell PreProcessor
案例实现登录密码加密并请求登录接口 在eclipse写好md5加密的代码然后打成jar包选中该类点击右键-Export-jar file) import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MD5 {public static String getMD5(String sourceStr) {try {MessageDigest md MessageDigest.getInstance(MD5);//获取MD5实例md.update(sourceStr.getBytes());//此处传入要加密的byte类型值byte[] digest md.digest();//此处得到的是md5加密后的byte类型值int i;StringBuilder sb new StringBuilder();for (int offset 0; offset digest.length; offset) {i digest[offset];if (i 0)i 256;if (i 16)sb.append(0);sb.append(Integer.toHexString(i));//通过Integer.toHexString方法把值变为16进制}return sb.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}public static void main(String []args){String res MD5.getMD5(123456);System.out.println(res);}} 把打好的jar包放到jmeter目录下的apache-jmeter目录的lib\ext下 添加前置处理器-BeanShell PreProcessor 编写代码 import boxuegu.MD5;
String res new MD5().getMD5(123456);
System.out.println(res);
vars.put(md5_pwd,res.toString());//把加密后的密码存到jmeter变量中然后在http sampler中就可通过${}使用 执行测试
2.8 BeanShell PostProcessor
获取响应结果关联操作
下载解析jar包https://mvnrepository.com/artifact/com.alibaba/fastjson/1.2.62
步骤
获取响应把响应结果转为json对象获取响应参数并打印断言结果设置变量
代码
//1.获取响应把响应结果转为json对象
String response_data prev.getResponseDataAsString();
JSONObject data_obj new JSONObject(response_data);
log.info(res:response_data);
//2.获取响应参数打印断言结果
String namedata_obj.get(username).toString();
log.info(name:name);
vars.put(username,name);
//3.判断结果
if(name.equals(python)){log.info(成功)
}
else
{ log.info(失败)
}总结
拓展
beanshell中参数传递一般指的是先获取到参数再传递参数。在beanshell中传递参数一般使用vars.put(key,value)方法。
注意
1.vars.get()不能接收int参数
2.vars.put(key,value)中key要用双引号括起来
3. 并发测试
”并发测试”理解为性能测试但接口测试中并发测试仅关注于并发测试系统的返回结果是否正确并不关心相关的性能指标例如系统资料、服务器响应时间等等为了实现并发我们可以在需要压力的地方设置集合点每到输入用户名和密码登录时所有的虚拟用户都相互之间等一等然后一起访问
3.1 集合点
jmeter里面的集合点通过添加定时器同步定时器
启动 点击线程组右键点击添加-定时器-同步定时器
用法 模拟用户组的数量集合多少人再执行请求也就是执行的线程数 注意等同于设置为线程数一定要确保设置的值不大于它所在线程组包含的用户数 超时时间以毫秒为单位:指定人数 多少秒没交集合到算超时设置延迟时间以毫秒为单位 注意如果设置timeout in milliseconds为0表示无超时时间会一直等下去。线程数量无法达到Number of Simultaneous Users to Group by中设置的值那么Test将无限等待除非手动终止。 如果希望定时器仅用于其中一个取样器则把该定时器作为子节点加入 如果是作用于多个放置请求之前