1,自动化测试规范
1)可重复执行
- 可重复执行
每个用例的数据应该是独立的,测试前新增,测试后删除; - 可并行执行
每个用例数据的建立应该是独立的,即使其它数据在并发执行应该互不干扰。==》通过uuid或者用例号对数据进行区分。 - 如果用例执行错误,不会造成脏数据。
2)可移植性
- 不同环境都可以执行;
主要区别在于当前使用的数据是否在不同环境是一样的;
主要问题集中在id的引用。
3)可控性
- 用例不会无限执行下去;
重灾区是循环用例。 - 用例响应时间(用例偶尔执行失败)
主要针对2个方面:
1)连续2个请求,请求A入库,请求B查询A的结果。A的入库可能是异步的,也就是说A返回200时,B不一定能查询到数据。此时可能需要sleep一会再处理,这个sleep的时间是否会因为环境负载导致时间有极大的波动?
2)对于一些时间的操作,接口的自动化执行远远快于人工的点击,完全可能因为ms级别的误差导致用例偶尔执行失败。
举例:获取用例执行开始时当前时间stime;创建一条数据createTime;检索当前数据:在stime和当前检索时间之间。由于用例请求过快,导致stime和createTime都是s单位一致、ms不同,如果检索的时间精度是s,那么就会出现stime精度丢失从而导致createTime>stime的情况。导致用例偶尔执行失败。 - 对于复杂逻辑,统一处理
比如循环请求一个http接口,需要注意while条件。但是这个很容易出错,每个人的水平也不一样,不如编写一个轮询http插件进行处理,简化流程。
4)可校验
- 所有的操作应该都是可校验的。
我看有一下接口只请求了连200校验都没有。
2,自动化测试场景
- 测试时间长,但主要是机械重复动作的测试;
- 需求变更频繁且每次变更影响面大;
- 测试需要大量回归测试;
除了使用自动化测试用例,也要标记一些重要用例进行人工测试。
3,常见语法使用
1)用例准备
1>函数助手
Ctrl+Shift+F1
常用函数:
说明 | 函数 |
---|---|
当前日期 | ${__timeShift(yyyyMMdd,,,,)} |
昨天日期 | ${__timeShift(yyyyMMdd,,-P1D,,)} |
2>用户自定义变量
- 定义一次,全局享用
- 通过函数获取值
名称 | 值 |
---|---|
time | ${__time(,)} |
- 通过提前声明控制变量类型
如果在beanShell里之间vars.put(),这个变量会是字符串。
名称 | 值 |
---|---|
times | 0 |
- 在beanShell中操作
注意对象在vars中是以String的形式存放的。
String str = vars.get("time")
vars.put("time", str)
- 自定义插件中vars的操作
JMeterContext context = JMeterContextService.getContext();
JMeterVariables vars = context.getVariables();
jmxPathStr = FileServer.getFileServer().getBaseDir();
sepStr = System.getProperty("file.separator");
vars.put("jmxPath", jmxPathStr);
vars.put("sep", sepStr);
context.setVariables(vars);
3>HTTP请求默认值
- 全局生效
- 主要用于定义统一的http请求协议、ip、端口、编码格式
- 如果定义了utf-8还乱码,可能是http对应的jar包有问题
替换\lib\ext\ApacheJMeter_http.jar
4>HTTP信息管理器
名称 | 值 | 说明 |
---|---|---|
Accept-Language | zh-CN,zh;q=0.9,en;q=0.8 | |
Content-Type | application/json;charset=UTF-8 | |
Accept-Encoding | gzip, deflate, br | |
User-Agent | Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 | 浏览器 |
accept | application/json | |
xxxx-Access-Token | ${token} | 访问token,登录成功后直接赋值,全局生效 |
5>JDBC连接设置
其中连接名称是mytest,jdbc取样器时需要使用。
6>HTTP Cookie管理器
直接添加 自动管理
1)事务
是一个简单的控制器,作为整体包裹我们需要关注的一组操作。
只有当事务控制器所有的取样器都成功时,事务控制器才成功。
2)循环
1>foreach控制器
2>while控制器
3)IF
jmeter-jexl3语法总结:
描述 | 语法 |
---|---|
数字等于 | ${__jexl3(${__Random(0,500,)}==0,)} |
数字不等于 | ${__jexl3(${__Random(0,500,)}!=0,)} |
字符串相等 |
${__jexl3("qwe".equals("qwe"),)} ${__jexl3("qwe" eq "qwe",)} ${__jexl3("qwe" == "qwe",)}
|
字符串不相等 |
${__jexl3(!"qwe".equals("q1we"),)} ${__jexl3("qwe" ne "qwe1",)} ${__jexl3("qwe" != "qwe",)}
|
字符串包含 | ${__jexl3("${host}".contains("pre"),)} |
字符串不包含 | ${__jexl3(!"${host}".contains("pre"),)} |
字符串长度比较 |
${__jexl3("qqq".size() < 3,)} length() 也可以 |
字符串为空 | ${__jexl3("".empty(),re)} |
组合条件 | 通过双竖杠连接 |
4)http取样器
注意:
-
文件上传类的接口:
-
url参数
可以直接在参数列表添加,也可以直接写url中。直接通过${}
引用变量。
5)JDBC Request
数据库请求取样器,使用前需要先配置JDBC Connection Configuration。
6)响应断言
相比起来json断言可能比响应文本断言更好用。
7)json断言
通过jsonPath语法进行取值。
8)BeanShell 取样器
程序员的天下了。
- 取变量通过
vars
变量才能获取,不能直接使用${}
- 没有泛型
- 可以使用方法
- 外部引用需要import包
- 调试方法:log、或者下载源码通过IDEA运行本地调试。
9)BeanShell 断言
- 在BeanShell 取样器的基础上,增加了断言返回值的重写。
- 断言之后可以直接
return;
,否则断言会继续往后走
//表示断言失败。
Failure = true;
//错误提示
FailureMessage = 数据库查询与返回结果不一致
10)前置后置执行顺序
- 配置元件(Config Element)
- 前置处理器(Pre Processors)
- 定时器(Timer)
- 取样器(Sampler)
- 后置处理器(Post Processors)
- 断言(Assertions)
- 监听器(Listener)
11)结果调试
1>结果集(查看结果树)
运行脚本之后生成JTL文件。红色表示失败。
2>日志
beanShell里可以通过log直接打印日志。
3>调试取样器
添加调试取样器可以查看到运行过程中的变量,变量是可以被覆盖的。文章来源:https://www.toymoban.com/news/detail-426556.html
4,常见插件编写
1)取样器重写:轮询http请求
循环请求某个接口,默认循环10次,每两次间隔500ms。通过jsonPath来判断是否需要立刻停止循环。文章来源地址https://www.toymoban.com/news/detail-426556.html
package com.luo.sampler.gui;
import com.luo.sampler.PollingHttpSampler;
import org.apache.jmeter.gui.GUIMenuSortOrder;
import org.apache.jmeter.gui.util.HorizontalPanel;
import org.apache.jmeter.gui.util.VerticalPanel;
import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
import javax.swing.*;
import java.awt.*;
import java.util.HashMap;
import java.util.Map;
@GUIMenuSortOrder(1)
public class PollingHttpSamplerGui extends AbstractSamplerGui {
/**
* 请求类型 GET
*/
private static final Map<String, Class<?>> TYPE_HTTP = new HashMap<>(1);
static {
TYPE_HTTP.put("GET", String.class);
}
protected JComboBox<String> typeBox = null;
/**
* 请求路径
*/
private JTextField urlPath = null;
/**
* 轮询次数
*/
private JTextField times = null;
/**
* 轮询结束字段(json path,如:$.data.percent)
*/
private JTextField endStateField = null;
private JTextField endStateValue = null;
public PollingHttpSamplerGui() {
super();
init();
}
private void init() {
createPanel();
}
private void createPanel() {
JPanel settingPanel = new VerticalPanel(5, 0);
settingPanel.add(getUrlPath());
settingPanel.add(getTimes());
settingPanel.add(getEndState());
JPanel dataPanel = new JPanel(new BorderLayout(5, 0));
到了这里,关于【java学习】jemeter与自动化测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!