1 添加断言
- 【例 1】检查注册是否成功
- 先根据“结果树”中的“HTML”中的“响应数据”,找到需要检查的网页中的文 本
- 复制上述内容,根据“结果树”中的“Text”中的“响应数据”,确定最终确定要 检查的文本(可能含有标记)
- 在线程组下找到需要检查的 url,右击“添加”→断言→响应断言
- 要测试的响应字段:响应文本
- 模式匹配规则:包括
- 要测试的模式:添加
- 预期结果如“Thankyou,<b>zhsan1”
- 注意
- 找不到会报错,找到无反应
2 事务
- 右击 step1→添加→逻辑控制器→事务控制器。
- 拖动事务位置,将 url 拖动到合适的事务中。
3 参数化
- 配置元件→CSVDataSetConfig
- Filename:参数文件名
- 可用相对或绝对路径,相对路径须在...jmeter 安装位置in 中;
- 当前目录下使用./;参数文件中不能使用列名。
- Fileencoding:文件编码格式
- 常用且建议 UTF-8
- VariableNames(comma-delimited)
- 以英文逗号间隔的列名,与数据的间隔符可以不一致
- Delimiter(use' 'fortab)
- 指定数据间隔符,Tab 用' '(不加引号),默认逗号
- Allowquotadata
- 表示数据中是否有分隔符
- Recycle on eof
- 参数不够用时,是否从头开始重新循环
- Filename:参数文件名
- 【例 1】注册 200 个账号,客户名使用用户名。
- 手动编辑参数文件,写入参数,但不要写列名
- 找到需要参数化的输入数据的 url
- 在前面的位置,右击“添加”→配置元件→CSVDataSetConfig
- 将参数的“值”改为“${参数名}”
- 使用参数时不加引号
- 负载测试
- 单击“ThreadGroup”,设置“线程数”为并发人数
- 一个线程对应一个模拟用户
- Ramp-UpPeriod(insecond)
- 线程启动开始运行的时间间隔,单位是秒,即所有线程在多长时间内开始 运行。
- 如设置线程数为 200,数据为 75 秒,相当于 15s 加载 40 个用户。
- 单击“ThreadGroup”,设置“线程数”为并发人数
4 关联
- 后置处理器→正则表达式提取器
- 引用名称
- 根据指定规则找到的字符串存放到此名表示的参数中。
- 正则表达式
- 一个用()表示一个模式;left(?)right:?表示遇到行中的第一个 right 就作为右 边界,然后不断向后寻找。
- 模板
- $1$指第一个模板(模式),$2$第二个...,此项必填;
- 允许 $1$$2$ 的写法。
- 匹配数字
- 找到的第某项,1 为第 1 项,-1 为所有项,0 是随机
- 参数名_matchNr(区分大小写)中存着找到几项,必写-1
- 参数名_gi 表示找到的第 i 项,i 从 1 开始,g0 表示包含左右边界在内 的整个字符串
- g 是关键字
- 有多个模板时,参数名_i_gj 表示找到的第 i 行第 j 列数据
- 找到的第某项,1 为第 1 项,-1 为所有项,0 是随机
- 引用名称
- 正则表达式案例
- 网页内容
<table>
<tr><td>hello</td><td>zhsan</td><td>123</td>
<tr><td>hello</td><td>lisi</td><td>5326</td>
</table>
-
- 正则表达式:<tr><td>hello</td><td>(.*)</td><td>(.*)</td>
- 【例 1】模板:$1$,匹配数字:1
test=zhsan,test_g=2,test_g0=<tr><td>hello</td><td>zhsan</td><td>123</td>
test_g1=zhsan
test_g2=123
-
- 【例 2】模板:$1$,匹配数字:2
test=lisi,test_g=2,test_g0=<tr><td>hello</td><td>lisi</td><td>5326</td>
test_g1=lisi
test_g2=5326
-
- 【例 3】模板:$2$,匹配数字:1
test=123,test_g=2,test_g0=<tr><td>hello</td><td>zhsan</td><td>123</td>
test_g1=zhsan
test_g2=123
-
- 【例 4】模板:$2$,匹配数字:2
test=5326,test_g=2,test_g0=<tr><td>hello</td><td>lisi</td><td>5326</td>
test_g1=lisi
test_g2=5326
-
- 【例 5】模板:$1$$2$,匹配数字:-1
test_1=zhsan123
test_1_g=2,test_1_g0=<tr><td>hello</td><td>zhsan</td><td>123</td>
test_1_g1=zhsan(第 1 行第 1 列)
test_1_g2=123
test_2=lisi5326
test_2_g=2,test_2_g0=<tr><td>hello</td><td>lisi</td><td>5326</td>
test_2_g1=lisi
test_2_g2=5326
test_matchNr=2
- 例 6】?的用法
- 正则表达式:<td>(.*)</td>与<td>(.*?)</td>
- 查看正则表达式的结果
- 在线程组中添加 DebugSampler,移到正则表达式提取器之后
- 在线程组中添加 BeanShellSampler,移到正则表达式提取器之后,写入下面的 代码之一
- ${参数名};或"字符串${参数名}";
- 结果出现在请求中,最后一个数据出现在响应中
- 如果省略分号,则数据都不出现在响应中,此外还会报错,但是数据 还会正常显示
- ResponseMessage="字符串${参数名}";
- 结果出现在响应中,最后一个数据出现在响应中
- log.error(数据);
- 向日志中写数据
- 点击“警告”图标可以清除日志
- log.info(数据);
- 向日志中写数据
- ${参数名};或"字符串${参数名}";
- 【例 7】录制订票的脚本,保证脚本正确实现业务。
- 找到查看结果树中出错的请求,在这个 url 的请求中查找会话值
- 在 step 下找到哪个 url 的发送数据中有会话值
- 在查看结果树的 Text/源代码界面中,倒着找那个 url 中的响应数据中有会话值
- 找到 sessionid 的左右边界
- 在响应的 url 处添加后置处理器→正则表达式提取器
- 在请求的 url 处,将 userSession 参数的值改为“${引用名称}”
- 不输入引号
5 自定义函数
- 编写 Java 类
- 编写自己需要的 static 函数,并加入 main 方法,先编译与运行正确
- 删除 main 方法后保存,右击项目→导出→Java→可运行的 JAR 文件
- 启动配置
- 选择测试的类名
- 导出目标
- 必须放在apache-jmeter-3.0libext 目录中,名字可与类名不同
- 忽略错误
- 找不到 mian 方法
- 启动配置
- 【例 1】编写一个输出字符串左边多个字符的函数。
- Jmeter 导入包
- 测试计划→Adddirectoryorjartoclasspath 处:浏览,找到包
- BeanShell 引用函数
- import 包名.类名
- vars.put("新参数名","常量值或参数名");
- 常量值或参数结果存入新参数中
- 无法在 BeanShell 的请求和响应中看到新参数值
- BeanShell 后面的 url 以及请求中可以使用该参数
- 可以在日志中看到参数值
- log.error(包名.类名.函数名(参数));
- 【例 2】输出航班号。
- importstr.StrMethod; //包名.类名
- log.error(str.StrMethod.split("${banci}","checked")[0]);
- vars.put("hb","常量值或参数名");
- 结果存入 hb 参数
6 循环控制器
- 右击 Step→添加→逻辑控制器→循环控制器
- 循环最好放在事务之外。
- CSVData 要放在循环之中。
- 添加计数器,查看循环次数
- 添加配置元件→计数器
- 计数器要放在循环内部
- 使用参数的方式
- 点击 Step1 中的参数化→Sharingmode:CurrentThread
- 不选择 CurrentThread,会导致有重复买票的情况
- 点击 Step1 中的参数化→Sharingmode:CurrentThread
- 【例】参数化化始发地和目的地,实现每人买 3 张票。
- 为方便看那个用户订的票,参数化 lastname,使用用户名即可
- 需要关联班次,注意班次使用了多次
7 用户自定义变量
- 根据业务流程制作成测试脚本,想要移植到其他测试环境时,由于数据发生了相应的变 化,例如 IP 地址、请求路径等,这时候可以将 IP 地址、请求路径等做成用户自定义变 量。
- ThreadGroup→配置元件→用户自定义变量
- 【例】将脚本中的 localhost 改为服务器 IP。
- HTTP 请求中的名称不需要改