jmeter-5-从入门到放弃【基础篇】

一、Jmeter简介:

1、简介

Jmeter 是一款基于Java程序开发的可视化客户端 (类似postman客户端)、具有开源、高可扩展性、高移植性、多线程框架等特点。

简单来说它就是:界面友好,能够快速上手,在任何操作系统java环境便可运行,基于java程序开发可自定义编写插件。

Jmeter业界使用最多的场景:

  1. 服务端的性能测试 (压力测试、并发测试)
  2. 接口测试、接口自动化测试 (Http、FTP、RPC、WebSocket等协议)

2、jmeter 安装

①由于是一个java程序,所以必备JDK,jdk1.8以上。jdk安装教程详细参考:

  • win:https://www.cnblogs.com/gsxl/p/11674981.html
  • linux:https://www.cnblogs.com/gsxl/p/12128768.html

②验证,cmd命令输入:java --version   及 javac

jmeter-5-从入门到放弃【基础篇】_第1张图片

③jmeter下载,所有版本:https://archive.apache.org/dist/jmeter/binaries/  

注意Windows后缀为.zip,如下载:apache-jmeter-5.3.zip,下载链接:https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.3.zip

下载后直接解压。

运行:打开bin目录下的jar包,如我的解压路径(可创建快捷方式/超链接到桌面):G:\apache-jmeter-5.3\bin\ApacheJMeter.jar

jmeter-5-从入门到放弃【基础篇】_第2张图片

可视化主界面:非常友好

jmeter-5-从入门到放弃【基础篇】_第3张图片

二、Jmeter常用元器件

  • 前置处理器           (比如:JDBC/Beam Shell预处理程序,用于数据准备,输入)
  • 取样器                (比如:Http请求信息)
  • 后置 处理器          (比如 正则、json提取、JDBC/Beam Shell后置处理器)
  • 配置元件              (用户自定义变量、CSV参数化、请求头管理器、请求默认值)
  • 监听器                  (查看请求的信息与结果,比如:查看结果树、聚合报告、汇总报告)

在Jmeter中元器件作用域是遵循上面的顺序,还有从上到下执行,如果多个层级存在同样的变量时,优先使用同级的(先找同层级,没有找到,再往上层找)

举例:

jmeter-5-从入门到放弃【基础篇】_第4张图片

三、编写接口脚本

1、接口测试这里分为两种场景:

  1. 接口测试                          既功能未提测前,基于接口文档编写脚本,进行的接口测试,同时考虑接口安全性的测试。
  2. 接口自动化回归测试       既对我们主要流程的冒烟测试,亦可细化覆盖场景(但成本比较高)

2、编写前我们需要认识 http 请求与响应的基本结构

①、接口请求关键参数:

  1. method             请求类型:常用 GET、POST
  2. url                     接口的地址 
  3. headers             请求头
  4. body                 请求参数

②、接口响应,通常关注:响应code、响应body、耗时。

3、我们可以参考 开发人员的接口文档 进行编写

①接口来源:

  1. 接口文档
  2. 抓包 抓取接口的请求来进行编写脚本,最好还是两者结合。(有可能会存在不一致)

4、获取接口请求与响应信息

①打开接口文档,

②抓包(web F12、抓包工具fiddler/Charles):

例子:域名,www.cnblogs.com

  1. 博客园首页,获取任意一篇文章的id,api:/gsxl
  2. 获取拿到的文章id进入详情,api:/gsxl/p/${id}.html

5、编写脚本例子

①添加-线程组

jmeter-5-从入门到放弃【基础篇】_第5张图片

线程属性:接口测试以下属性,通常为1即可

  1. 线程数                                一个线程相当于一个虚拟用户
  2. Ramp-Up时间(秒)         多少时间启动完成所有线程数,比如线程数10,Ramp-Up时间为20,则20秒内启动完10线程,平均就是2s启动1个线程。
  3. 循环次数                            执行测试用例的次数

②添加-取样器-http,接口信息写上,博客园首页接口信息

jmeter-5-从入门到放弃【基础篇】_第6张图片

③添加-后置处理器,提取token   (常用:①正则 ②Json提取)

jmeter-5-从入门到放弃【基础篇】_第7张图片

④添加-响应断言

可以响应断言code、文本包含、完全匹配。常用响应断言、json提取断言。

支持正则匹配:响应文本。包含或匹配模式        (字符串模式是不支持正则)

添加查看结果树,试跑正常:

jmeter-5-从入门到放弃【基础篇】_第8张图片

⑤添加-获取文章详情,取样器

接口地址:/gsxl/p/${id}.html

jmeter-5-从入门到放弃【基础篇】_第9张图片

⑥添加-获取门店列表下的请求头、断言。

引用变量:${变量名}

⑦监听器-添加,查看结果树

jmeter-5-从入门到放弃【基础篇】_第10张图片

6、脚本优化:如全局变量、提搞可阅读性等

jmeter-5-从入门到放弃【基础篇】_第11张图片

 

jmeter-5-从入门到放弃【基础篇】_第12张图片

四、个人心得分享

1、jmeter接口测试经验分享:

  • 编写规范分模块功能备注,适当多使用参数化/动态引用变量,如全局的域名、动态参数化关联断言。断言,多结合接口响应以及数据库主要字段校验 (实时落库)。
  • 前置处理器:测试数据准备,如文章id,我们可以通过SQL增删改查到此文章的详细信息,拿此文章id传入-获取文章详情接口进行查询,拿前置的信息与接口响应的主要字段进行断言。
  • 后置处理器:对前面新增的测试数据进行 还原或删除。
  • 数据初始化:比如需要用到的账号数据,有一套专属进行初始化的脚本,这样方便多环境切换时快速创建所需要的数据。
  • 接口自动化测试:快速带来的效益,适用于场景化关联性,如业务主流程的冒烟测试及回归测试。

2、请求头必填项 (在不知道的情况下)

可利用抓包工具,去除某些请求头参数,发现body与原来正常不一致时则为必填。

jmeter-5-从入门到放弃【基础篇】_第13张图片

3、数据库连接及跨线程demo

①MySQL数据库连接,得先找到连接驱动,放在jmeter的lib/etx目录下 (其它Oracle、MongoDB也是一样)

如MySQL:mysql-connector-java-5.1.31.jar

jmeter操作,配置元件-添加 JDBC Connection Configuration  用于连接到对应数据库

取样区-添加 JDBC Request      用于SQL语句执行,如下图

  • Variable Name:               自定义参数,在JDBC Request中会用到;
  • Database URL:                jdbc:mysql:// 数据库IP地址:数据库端口/数据库名称;
  • JDBC Driver Class:          com.mysql.jdbc.Driver,连接时需要的驱动;
  • Username:                       数据库用户名;
  • Password:                        数据库密码;

jmeter-5-从入门到放弃【基础篇】_第14张图片

 

jmeter-5-从入门到放弃【基础篇】_第15张图片

 

jmeter-5-从入门到放弃【基础篇】_第16张图片

②跨线程变量引用:

使用 BeanShell 将变量跨线程

jmeter-5-从入门到放弃【基础篇】_第17张图片

 

jmeter-5-从入门到放弃【基础篇】_第18张图片

4、常用函数

  • __Random:随机数        ${__Random(1,10,)}
  • __time:      当前时间     ${__time(yyyy-MM-dd HH:mm:ss,)}
  • 等等...根据实际需求使用

5、CSV参数化

可以用例ddt数据驱动接口测试,将测试接口等数据填写子文件里面,让CSV读取后参数化引用变量进行循环请求。

jmeter-5-从入门到放弃【基础篇】_第19张图片

 

jmeter-5-从入门到放弃【基础篇】_第20张图片

 

jmeter-5-从入门到放弃【基础篇】_第21张图片

6、Jmeter自定义插件-请求参数加签加密

  1. 如果公司后端是java很好办,找开发的代码把代码复制过来。
  2. 如果公司后端不是java,那就要了解它的加密规则,自己写一个java程序。
  3. 拿到代码在自己本地调试,最终打包成jar包,放置lib/ext目录下即可,BeanShell引用,如下列子。

①拿到代码,创建maven项目,粘贴到你的class类,pom导入依赖,调试成功后打jar包,放置lib/ext目录下即可

jmeter-5-从入门到放弃【基础篇】_第22张图片

jmeter-5-从入门到放弃【基础篇】_第23张图片

 

jmeter-5-从入门到放弃【基础篇】_第24张图片

 

jmeter-5-从入门到放弃【基础篇】_第25张图片

 

jmeter-5-从入门到放弃【基础篇】_第26张图片

7、持续集成-流程图

jmeter-5-从入门到放弃【基础篇】_第27张图片

jenkins+jmeter+ant 详细可以参考博文:https://www.cnblogs.com/gsxl/p/13694071.html

欢迎来大家QQ交流群一起学习:482713805

附上上述所用到的jmx脚本:

CSV:

id,exp
14671963,啊这...2-get/post请求区别,来给你看看post请求url中传参
14993497,jmeter-5-从入门到放弃【基础篇】
13950531,python-51-MySQLdb查询返回dict格式

jmx:



  
    
      
      false
      true
      true
      
        
      
      C:\Users\PPL\Desktop\ppl.jar
    
    
      
        
          
            id
            13694071
            全局文章id
            =
          
          
            http
            https
            环境协议
            =
          
          
            url
            www.cnblogs.com
            =
            环境域名
          
        
      
      
      
        
          
        
        ${url}
        
        ${http}
        
        
        6
        
        
      
      
      
        continue
        
          false
          1
        
        1
        1
        false
        
        
        true
      
      
        
        
          
            
              
            
            
            
            
            
            /gsxl
            GET
            true
            false
            true
            false
            
            
            
          
          
            
              
                广深-小龙
              
              
              Assertion.response_data
              false
              2
            
            
            
              false
              id_1
              p/(.+?).html
              $1$
              id_1 Error
              1
            
            
            
              
              
              false
              String id = vars.get("id_1");
props.put("id_1", id);
            
            
          
        
        
        
          
            
              
            
            
            
            
            
            /gsxl/p/${id_1}.html
            GET
            true
            false
            true
            false
            
            
            
          
          
            
              
                啊这...2-get/post请求区别,来给你看看post请求url中传参 - 广深-小龙 - 博客园
                
              
              
              Assertion.response_data
              false
              2
            
            
          
          
            
              
            
            
            
            
            
            /gsxl/p/${id}.html
            GET
            true
            false
            true
            false
            
            
            
          
          
            
              
                title: 'jmeter-4-linux下环境搭建 jmeter+ant+docker-jenkins,持续集成测试完成
              
              
              Assertion.response_data
              false
              2
            
            
          
        
      
      
        continue
        
          false
          1
        
        1
        1
        false
        
        
        true
      
      
        
        
          
            
              
            
            
            
            
            
            /gsxl/p/${id}.html
            GET
            true
            false
            true
            false
            
            
            
          
          
            
              
                title: 'jmeter-4-linux下环境搭建 jmeter+ant+docker-jenkins,持续集成测试完成
              
              
              Assertion.response_data
              false
              2
            
            
          
          
            
              
            
            
            
            
            
            /gsxl/p/${id_1}.html
            GET
            true
            false
            true
            false
            
            
            
          
          
            
              
                啊这...2-get/post请求区别,来给你看看post请求url中传参 - 广深-小龙 - 博客园
              
              
              Assertion.response_data
              false
              2
            
            
          
          
            
              
            
            
            
            
            
            /gsxl/p/${id_1}.html
            GET
            true
            false
            true
            false
            
            
            
          
          
            
              
                啊这...2-get/post请求区别,来给你看看post请求url中传参 - 广深-小龙 - 博客园
              
              
              Assertion.response_data
              false
              2
            
            
            
              
              
              false
              String id_ = props.get("id_1");
log.info("==============="+id_);
vars.put("id_1",id_)
            
            
          
        
      
      
        continue
        
          false
          3
        
        1
        1
        false
        
        
        true
      
      
        
          C:/Users/PPL/Desktop/jmeter_demo/id.txt
          UTF-8
          id,exp
          true
          ,
          false
          true
          false
          shareMode.all
        
        
        
          
            
          
          
          
          
          
          /gsxl/p/${id}.html
          GET
          true
          false
          true
          false
          
          
          
        
        
          
            
              ${exp}
            
            
            Assertion.response_data
            false
            2
          
          
        
      
      
        continue
        
          false
          1
        
        1
        1
        false
        
        
        true
      
      
        
          false
          
          
          import com.ppl.decode.Jwt;
Jwt j = new Jwt("PPLLLLLLLLLLL", "454654564PPLLPLPLPLPLPL");
String _b_shell = j.genToken();
vars.put("b_shell",_b_shell);
        
        
        
          
            
          
          
          
          
          
          /gsxl/${b_shell}
          GET
          true
          false
          true
          false
          
          
          
        
        
          
            
              广深-小龙
            
            
            Assertion.response_data
            false
            2
          
          
          
            false
            id_1
            p/(.+?).html
            $1$
            id_1 Error
            1
          
          
          
            
            
            false
            String id = vars.get("id_1");
props.put("id_1", id);
          
          
        
        
          false
          true
          false
        
        
      
      
        false
        
          saveConfig
          
            
            true
            true
            true
            
            true
            true
            true
            true
            true
            true
            true
            true
            true
            false
            true
            true
            true
            true
            true
            0
            true
            true
            true
            true
            true
            true
            true
            true
            true
          
        
        
      
      
    
  

你可能感兴趣的:(jmeter,数据库,java,jmeter,python,软件测试)