【java学习】jmeter与自动化测试

1,自动化测试规范

1)可重复执行

  1. 可重复执行
    每个用例的数据应该是独立的,测试前新增,测试后删除;
  2. 可并行执行
    每个用例数据的建立应该是独立的,即使其它数据在并发执行应该互不干扰。==》通过uuid或者用例号对数据进行区分。
  3. 如果用例执行错误,不会造成脏数据。

2)可移植性

  1. 不同环境都可以执行;
    主要区别在于当前使用的数据是否在不同环境是一样的;
    主要问题集中在id的引用。

3)可控性

  1. 用例不会无限执行下去;
    重灾区是循环用例。
  2. 用例响应时间(用例偶尔执行失败)
    主要针对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的情况。导致用例偶尔执行失败。
  3. 对于复杂逻辑,统一处理
    比如循环请求一个http接口,需要注意while条件。但是这个很容易出错,每个人的水平也不一样,不如编写一个轮询http插件进行处理,简化流程。

4)可校验

  1. 所有的操作应该都是可校验的。
    我看有一下接口只请求了连200校验都没有。

2,自动化测试场景

  1. 测试时间长,但主要是机械重复动作的测试;
  2. 需求变更频繁且每次变更影响面大;
  3. 测试需要大量回归测试;

除了使用自动化测试用例,也要标记一些重要用例进行人工测试。

3,常见语法使用

1)用例准备

1>函数助手

Ctrl+Shift+F1

常用函数:

说明 函数
当前日期 ${__timeShift(yyyyMMdd,,,,)}
昨天日期 ${__timeShift(yyyyMMdd,,-P1D,,)}

2>用户自定义变量

  1. 定义一次,全局享用
  2. 通过函数获取值
名称
time ${__time(,)}
  1. 通过提前声明控制变量类型
    如果在beanShell里之间vars.put(),这个变量会是字符串。
名称
times 0
  1. 在beanShell中操作
    注意对象在vars中是以String的形式存放的。
String str = vars.get("time")
vars.put("time", str)
  1. 自定义插件中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请求默认值

  1. 全局生效
  2. 主要用于定义统一的http请求协议、ip、端口、编码格式
    在这里插入图片描述
  3. 如果定义了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取样器

在这里插入图片描述注意:

  1. 文件上传类的接口:
    在这里插入图片描述

  2. url参数
    可以直接在参数列表添加,也可以直接写url中。直接通过${}引用变量。

5)JDBC Request

数据库请求取样器,使用前需要先配置JDBC Connection Configuration。
在这里插入图片描述

6)响应断言

在这里插入图片描述相比起来json断言可能比响应文本断言更好用。

7)json断言

通过jsonPath语法进行取值。
在这里插入图片描述
在这里插入图片描述

8)BeanShell 取样器

程序员的天下了。

  1. 取变量通过vars变量才能获取,不能直接使用${}
  2. 没有泛型
  3. 可以使用方法
  4. 外部引用需要import包
  5. 调试方法:log、或者下载源码通过IDEA运行本地调试。

9)BeanShell 断言

  1. 在BeanShell 取样器的基础上,增加了断言返回值的重写。
  2. 断言之后可以直接return;,否则断言会继续往后走
	//表示断言失败。
	Failure = true;
	//错误提示
	FailureMessage = 数据库查询与返回结果不一致

10)前置后置执行顺序

  1. 配置元件(Config Element)
  2. 前置处理器(Pre Processors)
  3. 定时器(Timer)
  4. 取样器(Sampler)
  5. 后置处理器(Post Processors)
  6. 断言(Assertions)
  7. 监听器(Listener)

11)结果调试

在这里插入图片描述

1>结果集(查看结果树)

运行脚本之后生成JTL文件。红色表示失败。
在这里插入图片描述

2>日志

在这里插入图片描述
beanShell里可以通过log直接打印日志。

3>调试取样器

添加调试取样器可以查看到运行过程中的变量,变量是可以被覆盖的。

4,常见插件编写

1)取样器重写:轮询http请求

循环请求某个接口,默认循环10次,每两次间隔500ms。通过jsonPath来判断是否需要立刻停止循环。

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));
      
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值