1、如何定义和使用变量?
1)LR: 目前类C语法,以后可以使用Java
<1> C的变量:在代码中直接定义 (最开头)
int age = 23; char name[] = "Tom";
double salary = 6000.5;
使用时直接写变量名即可 age name salary
<2> LR的变量:
a. 参数化 参数池中配置 username password
b. 关联 在函数中声明变量名
web_reg_save_param("uid", "LB=", "RB=", LAST);
使用时 {变量名} 比如{username} {uid} ...
2)JMeter:
在测试计划中通过不同方式定义:
全局变量、参数化变量、关联时设置
username password pid
使用时 ${变量名} 比如${username} ${uid}
2、如何做关联? 比如Session Id、航班号等
1)LR:
<1> 录制成功,但回放失败,怀疑存在动态数据;
<2> 通过录制两份脚本,对比发现动态数据; WDiff工具
<3> 找到相应请求:引起第一次出现动态数据响应的请求
(录制时生成的日志)
拿静态数据到Generation Log第一行开始搜索,找到第一次出现该数据的响应,根据响应id找到对应的请求(先向下,再向上),根据请求的快照名确定脚本的相应请求。
<4> 相应请求之前写关联函数:
web_reg_save_param("uid", //参数名 LR变量
"LB=左边界", "RB=右边界", LAST);
<5> 将脚本中静态数据都替换成参数 {uid}
2)JMeter:
<1> 录制成功,但回放失败,怀疑存在动态数据;
<2> 通过录制两份脚本,对比发现动态数据; --需要关联
AptDiff_1.6.zip 文本比较工具
<3> 找到相应请求:引起第一次出现动态数据响应的请求
借助于监听器:查看结果树 分析请求和响应包的关系
(回放时的效果--值每次都在变)
使用取样器请求中的参数名,去查看结果树的响应文本中查找,使用Text视图,找到第一次出现响应的请求。
顺便拷贝含有左右边界的文本:
name=userSession value=121290.810773593zcDiiQzpAHQVzzzHDHtDDpDHztHf>
name=userSession value=XXX>
<4> 在相应请求节点下,增加节点:后置处理器
右击相应请求 -> 添加 后置处理器 -> 正则表达式提取器
正则表达式:规则表达式,通过特殊字符串表达某些规则
用于文本的查找、替换等操作。
1) 要检查的响应字段:主体
2) 引用名称:uid 参数/变量的名称
3) 正则表达式:name=userSession value=(.*)>
(.*) .表示任意字符 *表示任意多次
根据左右边界匹配中间任意文本,赋值给uid 动态数据
4) 模板:$1$ 要匹配到几个相关的值
5) 匹配数字:1 获取值中的第1项
<5> 将请求取样器中的静态数据都替换成参数 ${uid}
3、参数化数据文件格式?
1)LR: user.dat
username,password
jojo,bean
qq,123
|
2)JMeter: user.dat
jojo,bean
qq,123
|
4、如何进行参数化?
1)LR: 类型 + 数据 + 策略
<1> 类型:File、Unique Number、Date/Time、Random Number、Vuser Id...
<2> 数据:dat文件、规则产生
<3> 策略:
SE组合:顺序 + 每次迭代
UEA组合:唯一 + 每次迭代 + 放弃VU
版本1:File类型
版本2:Unique Number类型
RE组合:随机 + 每次迭代
2)JMeter:
常用配置元件:CSV Data Set Config 默认使用文件取数据
需求:对buy1脚本的登录进行参数化
数据文件:user.txt
jojo,bean
qq,123
|
配置:
file name文件路径: D:\JMeter\user.txt
文件字符集:默认不支持中文 需要可以写utf-8等
变量名:username,password 使用英文逗号分隔
对应文件的两列,也作为参数名
将取样器请求的参数替换成变量:
${username} ${password}
5、如何添加检查点? 确保自动化测试结果正确
1)LR:
<1> 边录制边添加:Insert text check
优点:方便、直观 确定:有可能添加的位置不对
默认函数:web_reg_find("Text=源代码文本", LAST);
reg字样 注册性函数 放在相应请求之前
<2> 录制后添加:
1) 找到相应请求
使用Tree视图,使用HTML视图查看请求和响应页面的对应关系。
2) 右击检查的文本 -> 添加检查点函数
2)JMeter: 需求:登录成功进行检查
<1> 找到相应请求:
使用监听器:查看结果树 HTML视图
找到请求和响应页面的对应关系
建议:恢复到1VU运行,请求的节点才有顺序。
找到请求和检查的文本:
页面文本:Welcome, jojo, to HTML视图
页面源代码:Welcome, <b>jojo</b>, to Text视图
<2> 针对相应请求添加子节点:断言 -> 响应断言
要测试的响应字段:响应文本
模式匹配规则:包括
要测试的模式: 就是要检查的文本
页面源代码:Welcome, <b>jojo</b>, to
也要参数化:Welcome, <b>${username}</b>, to
<3> 在测试计划下,添加监听器 -> 断言结果
响应断言 : Test failed: text expected to contain /Welcome, jojo, to/
原因:检查的是页面源代码文本!
6、如何表示等待时间?
目的:自动化测试中模拟用户的步骤间隔,更真实,控制压力
1)QTP: wait(秒数);
2)LR: lr_think_time(秒数);
Run-time Settings中设置策略
3)Java: Thread.sleep(毫秒数);
4)Linux shell: sleep 秒数
5)monkeyrunner: MonkeyRunner.sleep(秒数)
6)JMeter: 定时器
加在哪个节点下,就表示该请求之前等多久
加在公共区域,共享效果,所有请求都要等待
多个定时器,时间上是累加的效应
<1> 固定定时器:固定等待多少时间 毫秒
<2> 高斯随机定时器:在某范围内,以更高的概率等待
高斯定理(正态分布):随大流
7、如何进行并发测试? (重要面试题)
1)LR:
<1> Action脚本中添加事务:
a) 平均事务响应时间 b) TPS 每秒事务数
c) 并发的起点
lr_start_transaction("事务名");
...
lr_end_transaction("事务名", LR_AUTO);
<2> 事务开始之前添加集合点(并发点): (同步机制)
lr_rendezvous("集合点名"); (等待、延迟)
<3> 场景中设置并发策略(集合点策略):
比如:当所有VU的n%到达集合点时一起释放 (并发压力)
<4> 当负载不够时,考虑提高负载机的配置或使用联机测试;
<5> 服务器如果采用集群、负载均衡模块,需要使用IP欺骗技术让负载均衡模块生效。-- 更真实模拟客户端多用户效果,他们的IP一般不一样。
2)JMeter:
<1> 找到并发的起点:某个请求(取样器)
<2> 针对该请求添加定时器:
同步定时器 Synchronizing Timer
Java中同步关键字:synchronized 解决多线程安全问题
同步:A任务完成后,B才能开始 需要等待
异步:一边执行A,一边执行B 无需等待
集合点:等待所有VU到达时再一起释放 (同步机制、等待)