Jmeter

项目环境搭建

python3.5以上

搭建图书管理项目

运行

pip install -r requirements.txt -i https://pypi.douban.com/simple

运行 python run_server.py

API接口清单

一、查询
    1.1学院-查询所有
        请求方法:GET
        请求地址:http://127.0.0.1:8000/api/departments/
    1.2学院-查询指定
        请求方法:GET
        请求地址:http://127.0.0.1:8000/api/departments/T02/
        (注:T02为学院ID;)
    1.3根据指定参数进行学院-List-$dep_id_list的相关查询
        请求方法:GET
        请求地址:http://127.0.0.1:8000/api/departments/?$dep_id_list=T01,T02,T03 
        (注:$dep_id_list:为参数名称;T01,T02,T03为:学院ID;)

    1.4学院-List-$master_name_list查询
        请求方法:GET
        请求地址:http://127.0.0.1:8000/api/departments/?$master_name_list=Java-Master,Test-Master
        (注:$master_name_list:为参数名称;Java-Master,Test-Master为:院长名称;)
    1.5学院-模糊 
        请求方法:GET
        请求地址:http://127.0.0.1:8000/api/departments/?blur=1&dep_name=C
        (注:blur:为开启模糊查询参数1为开启;dep_name:为参数名称;C:学院名称包含字符;)
    1.6学院-组合
        请求方法:GET
        请求地址:http://127.0.0.1:8000/api/departments/?slogan=Here is Slogan&master_name=Test-Master&dep_name=Test学院
        (注:dep_name:学院名称;master_name:为院长名称;slogan:学院口号;三个条件可随意组合或单独使用)
二、新增
    2.1学院-新增
        1) 请求方法:POST
        2) 请求地址:http://127.0.0.1:8000/api/departments/
        3) 请求JOSN报文:
        4) 调用传入的json串如下(可新增多条,之间用,隔开):
            {
                "data": [
                        {
                            "dep_id":"T01",
                            "dep_name":"Test学院",
                            "master_name":"Test-Master",
                            "slogan":"Here is Slogan"
                        }
                  ]
            }
       5) 新增成功返回报文:
        {
          "already_exist": {
            "results": [],
            "count": 0
          },
          "create_success": {
            "results": [
              {
                "dep_id": "T02",
                "dep_name": "Java学院",
                "master_name": "Java-Master",
                "slogan": "java"
              }
            ],
            "count": 1
          }
        }
       6) 新增失败id已存在-返回报文:
        {
          "already_exist": {
            "results": [
              {
                "dep_id": "T01",
                "dep_name": "Test学院",
                "master_name": "Test-Master",
                "slogan": "Here is Slogan"
              }
            ],
            "count": 1
          },
          "create_success": {
            "results": [],
            "count": 0
          }
        }
    7) 新增失败json格式错误:
        {
        "status_code": 400,
        "detail": "请求体参数格式错误。"
        }
三、更新
    3.1学院-更新
    1). 请求方法:PUT
    2). 请求地址:http://127.0.0.1:8000/api/departments/T03/
        (注:1:为学院ID)
    3). 请求JOSN报文:
            {
                "data": [
                        {
                            "dep_id": "T03",
                            "dep_name": "C++/学院",
                            "master_name": "C++-Master",
                            "slogan": "Here is Slogan"
                        }
                  ]
            }
    4). 修改成功返回:
        {
            "dep_id": "T03",
            "dep_name": "C++/学院",
            "master_name": "C++-Master",
            "slogan": "Here is Slogan"
        }
四、删除
    4.1学院-删除单个
    请求方法:DELETE
    请求地址:http://127.0.0.1:8000/api/departments/T03/
    (注:10为学院ID)
    4.2学院-删除多个
    请求方法:DELETE
    请求地址:http://127.0.0.1:8000/api/departments/?$dep_id_list=8,9,11
    (注:$dep_id_list:为参数名称;8,9,11:为学院ID)

Jmeter基本使用

概述

JMeter最初是由Apache软件基金会的Stefano Mazzocchi编写和开发的, 所以Jmeter也称为“Apache JMeter”,它是一个开源的,100%基于Java的应用程序,带有图形界面。

主要功能

1. web自动化测试
2. 接口测试
3. 性能测试
4. 压力测试
5. 通过jdbc进行数据库测试
6. java测试

Jmeter下载与安装

http://jmeter.apache.org/download_jmeter.cgi

解压文件到任意目录,避免在一个有空格的路径安装Jmeter

启动JMeter

进入bin目录
    双击 ApacheJMeter.jar文件(最常用);
    双击 Jmeter.bat文件(有黑窗口并且不能关闭,是服务端);
    linux 下启动Jmeter == meter.sh

Jmeter常用目录文件

Bin目录(存放可执行文件和配置文件)
    Jmeter.bat:windows系统中JMeter的启动文件
    ApacheJMeter.jar Java环境下的JMeter启动文件
    Jmeter.log:日志文件
    Jmeter.sh:linux系统中JMeter的启动文件
    Jmeter.properties:系统配置文件
    Jmeter-server.bat:windows分布式测试要用到的服务器配置
    Jmeter-server:linux分布式测试要用到的服务器配置

docs目录
    是JMeter的java Doc,可打开api\index.html页面来查看

printable_docs目录
    usermanual子目录下的内容是JMeter的用户手册文档,其中usermanual下component_reference.html是最常用到的核心元件帮助文档

lib文件夹
    一般放插件

Jmeter 基本使用

主界面布局

JMeter的主界面布局分为标题栏、菜单栏、工具栏、树形标签栏和内容栏

组件
    Jmeter中功能点称为组件

元件
    相同类似功能组件的集合称之为元件
    常用的八大元件
        逻辑控制器
         配置元件: 包含java默认值、http请求默认值、http表头管理器等等
        定时器(Timer): 包含同步定时器、泊松随时时间等
        前置(预)处理器: jdbc 预处理器、html链接解析器,用户参数等
        采样器(Sampler): 包含http请求、jdbc请求、邮件请求等
        后置处理器: 包含jdbc后处理器、xpath抽取器、正则表达式抽取器等
        断言
        监听器: 包含图表结果、查看结果树、汇总报告等

基本使用

以学院查询执行100次为例

1. 添加【测试计划】
    测试计划的名称栏目修改名字
2. 基于添加的测试计划添加【线程组】,循环次数设置为100次
3. 在【取样器】中基于线程组添加HTTP请求 
    名称    使用有意义的名称
    设置请求
        协议    http或者是https ,默认值为http
        服务器名称或ip
        端口    默认值为80
        HTTP请求  
        路径
        内容编码    默认值为iso8859;一般设置【UTF-8】
        [参数] 查询字符串
        [消息体数据]  可传递JSON报文
4. 在【监听器】基于线程组添加【察看结果树】 
5. 在【监听器】基于线程组添加【聚合报告】

Jmeter 八大元件

test plan和thread group不属于元件

控制器(Controllers)

取样器(Sampler)

常用的sampler

1) HTTP请求
2) JDBC Request 
3) Debug Sampler
    JMeter属性  True or False  全局变量
    JMeter变量 True or False
    系统属性 True or False
逻辑控制器
控制Sampler节点发送请求的逻辑顺序控制器
    If Controller
    Swith Controller
    Loop Controller
    Random Controller
    。。。
组织和控制Sampler节点
    Transaction Controller
    Throughput Controller
    。。。

监听器

监听器是对测试结果进行处理和可视化展示的一系列组件

常用的组件

1) 察看结果树
2) 聚合报告 
3) 断言结果

定(计)时器

设置操作之间的等待时间. 等待时间是性能测试中常用的控制客户端QPS的手段

常用的组件

1) Synchronizing Timer
2) 常数吞吐量定时器

配置元件(config Element)

设置相关请求的静态配置.不用每次都重复配置

常用的组件

1) CSV Data Set Config
2) HTTP请求默认值
3) HTTP信息头管理器
4) 计数器
CSV Data Set Config
设置CSV数据文件
    文件名        如:d:/a.txt
    文件编码    一般设置utf-8
    变量名称    读取参数后保存的变量名称,用西文逗号分隔
    忽略首行    比如csv文件又标题头可选为True
    分隔符        文件中使用的分隔符号(一般用逗号)
    是否允许带引号        默认false,选项选为“true”的时候对全角字符的处理出现乱码
    遇到文件结束符再次循环        
    遇到文件结束符停止线程        
    线程共享模式        参数文件的作用域

参数化引用格式:${参数名} 
{
                "data": [
                        {
                            "dep_id":"${dep_id}",
                            "dep_name":"${dep_name}",
                            "master_name":"${master_name}",
                            "slogan":"${slogan}"
                        }
                  ]
            }
HTTP信息头管理器

添加Content-Type:application/json;charset=utf-8的请求头,可在线程组前添加

HTTP请求默认值

为HTTP Sample 提供默认值

计数器
可放入While控制器中

参数
    Starting value
    递增
    Maximum value
    引用格式
    是够勾选与每用户独立的跟踪计数器

前置处理器(Per Processors)

在实际请求发出前对即将的请求进行特殊处理

常用的组件

1) 用户参数
2) HTTP URL重写修饰符

后置处理器(Post Processors)

对sampler发出请求后得到服务器响应进行处理.一般用来提取响应的特定数据

常用的组件

1) 正则表达式提取器 
2) XPath Extractor
3) JSON提取器

断言(Assertions)

用于检查测试中得到的响应数据是否符合预期, 一般用来设置检查点,用以保证性能测试过程中的数据交互与预期一致

常用的组件

1) 响应断言
2) JSON断言
3) 大小断言

元件作用域及执行顺序

在jmeter中,元件的作用域是靠test plan的树形结构中元件的父子关系来确定

1)sampler不与其他元件相互作用,因此不存在作用域问题

2)Logic Controller只对其子节点中的sampler和Logic Controller作用

3)除sampler和Logic Controller外的其他元件,如果是某个sampler的子节点,则该元件仅对其父节点作用

4)除sampler和Logic Controller外的其他元件,如果其父节点不是sampler,则其作用域是该元件父节点下的其他所有后带节点(包括子节点,子节点的子节点等)
在同一个作用域范围内,测试计划中的元件按照一下顺序执行:
1.配置元件
2.前置处理器
3.定时器
4.取样器
5.后置处理器
6.断言
7.监听器

Pre-porcessors、Post-porcessors和Assirtions等元件仅对Sampler作用,如在它们作用域内没有任何Sampler,则不会被执行

jmeter核心

参数化

参数化就是动态的获取或设置数据

CSV Data Set Config

设置CSV数据文件
    文件名        如:d:/a.txt
    文件编码    一般设置utf-8
    变量名称    读取参数后保存的变量名称,用西文逗号分隔
    忽略首行    比如csv文件又标题头可选为True
    分隔符        文件中使用的分隔符号(一般用逗号)
    是否允许带引号        默认false,选项选为“true”的时候对全角字符的处理出现乱码
    遇到文件结束符再次循环        
    遇到文件结束符停止线程        
    线程共享模式        参数文件的作用域
        所有线程    所有线程共享文件读取位置指针
        当前线程组    当前线程组共享文件读取位置指针
        当前线程    每个线程会从文件开头读取
参数化引用格式:${参数名} 
{
                "data": [
                        {
                            "dep_id":"${dep_id}",
                            "dep_name":"${dep_name}",
                            "master_name":"${master_name}",
                            "slogan":"${slogan}"
                        }
                  ]
            }

用户定义变量(User Defined Variables)

可根据需求自定义相应的变量,一般做全局变量使用

配置元件->用户定义的变量
参数化引用格式:${参数名}

用户参数(User Parameters)

参数设置方式,用户可设置参数名称以及参数值

前置处理器-->用户参数
    添加变量
    添加用户:每个线程为每一个用户,即线程组的线程数
参数化引用格式:${参数名}

用户参数和CSV Data Set Config(所有线程)的区别

用户参数是每个线程为每一个用户,即线程组的线程数,跟线程的循环次数没关系。

CSV Data Set Config(所有线程)只跟所有线程的循环次数有关系。

当线程组有n个线程,且循环次数为1的时候可以相互转换

函数

函数是完成某个指定功能代码的封装

函数助手对话框
    菜单-工具->函数助手对话框

数据库

添加数据库jar包, 添加数据库驱动

测试计划-添加jar包到ClassPath,选中数据库驱动jar包

配置连接信息

JDBC Connection Configuration
    Variable Name 数据库池名称-DBC请求时引用

    Connection Pool Configuration    连接池配置
        Max Number of Connections 最大连接数
          Max Wait 最大等待时间毫秒
        Auto Commit 自动提交
        。。。

    Database Connection Configuration 数据库连接配置
        Database URL jdbc:sqlite:数据库db文件路径
        JDBC Driver class org.sqlite.JDBC(sqlite驱动包内sqlite驱动的路径位置)
        Username 连接数据库用户名
        Password 数据库密码

发送sql语句请求

添加JDBC Request
    Variable Name of Pool declared in JDBC Connection COnfiguration 添加配置的连接配置变量名
    SQL Query 选择查询的类型
        Select Statement
        Update Statement
        Callable Statement
        。。。
    Variable names 保存sql语句返回结果的变量名,可写多个变量名,西文逗号隔开
        变量名_#  变量名获取的个数,即记录数
        变量名_n  第几个变量,也就是返回第几条记录
        如:
        select count(*) from departments
        Variable names 为 count
        引用为num=${count_1}

通过察看结果树查看执行sql语句响应数据

通过Debug Sampler获取执行sql语句后的数据

sqlite

sqlite-jdbc-3.21.0.jar

Database URL jdbc:sqlite:数据库db文件路径

JDBC Driver class org.sqlite.JDBC

mysql

mysql-connector-java-5.1.35-bin.jar

Database URL jdbc:mysql://192.168.40.10:3306/mysql

JDBC Driver class com.mysql.jdbc.Driver

MySQL 报错: “Host ‘xxx‘ is not allowed to connect to this MySQL server"解决

use mysql;

select host, user from user;

update user set host = '%' where user = 'your_username';

flush privileges;

oracle(待测试)

ojdbc14.jar

Database URL jdbc:oracle:thin:@192.168.40.10:1521/orcl

JDBC Driver class oracle.jdbc.OracleDriver

oracle docker部署

docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

docker run -d -it -p 1521:1521 --name oracle11g --restart=always registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g

关联

一个请求响应的结果要作为另一个请求提交的数据(关联是后置处理器的一部分)

选中取样器-右键添加后置处理器中的一种

正则表达式提取器

Apply to
    Main Sample only 之作用与范围的sample

要检查的相应字段
    主体
    Body(unescaped)
    Body as a Document
    信息头
    Request Headers
    URL
    响应URL
    响应信息

引用名称
    要引用的参数名称,如填写title,则可用${title}引用它

正则表达式
    制定规则的公式 ():括起来的部分就是要提取的数据。 
        1) .:匹配任何字符串。
        2) +:一次或多次。 
        3) ?:在找到第一个匹配项后停止。
        4) *:匹配规则内所有字符串

模板
    $$格式;$1$表示解析到的第1个值;如果匹配有2个值,第二个值$2$,以此例推

匹配数字
    -1代表全部取值,0代表随机取值, 1代表取第一个值

缺省值
    没找到的时候的缺省值

XPath Extractor

适合于需要提取的文本

Apply to
    Main Sample only 之作用与范围的sample

XML Parsing Options
    Use Tidy
        当需要处理的页面是HTML格式时,必须选中该选项。

引用名称
    要引用的参数名称,如填写title,则可用${title}引用它

XPath query
    制定规则的公式 ():括起来的部分就是要提取的数据。 
        1) .:匹配任何字符串。
        2) +:一次或多次。 
        3) ?:在找到第一个匹配项后停止。
        4) *:匹配规则内所有字符串

匹配数字
    0代表随机取值,1代表取第一个值,-1代表取全部值

缺省值
    没找到的时候的缺省值

JSON提取器

适合返回json的处理

Apply to
    Main Sample only 之作用与范围的sample

Names of created variables 
    定义引用提取值的变量名,后面接口中使用${变量名}引用

Json Path expressions
    填写JSON Path表达式,用来提取某个值
    JSONPath表达式类似于XPath表达式。它们以美元符号($)开头,表示JSON文档的根
    基本的JSONPath表达式: 
        $ 
        $.store.book[*] 
        $.store.book[0].title 
        $.store.book[*].title 
        $.store.* 
Match No.(0 for Random)
    表示取值是第几个匹配结果,因为有可能XPath表达式会匹配到多个值。0表示随机,-1表示全部,1代表第一个,2代表第二个

Compute concatenation var(suffix_All)
    勾选此项后,如果匹配到多个结果,JMeter会使用,将他们连接起来,存储在的变量中,会自动命名为_ALL

缺省值
    没找到的时候的缺省值

断言

断言就是判断程序响应数据是否达到预期结果

选中取样器-右键添加断言中的一种

响应断言

Apply to
    Main Sample only 之作用与范围的sample

测试字段 
    响应文本 *
    响应代码 *
    响应消息
    响应头
    。。。

模式匹配规则
    包括
    匹配
    相等
    字符串 *
    否
    或者

测试模式
    添加测试模式

JSON断言

Assert JSON PATH exists
    用于断言的JSON元素的路径(JSONPath)

Additionally assert value
    是否额外验证根据JSONPath提取的
    不勾选,验证JSONPath能否在JSON文档中找到路径
    勾选,验证根据JSONPath提取值是否预期

Match as regular expression
    不勾选,预期值不能使用正则表达式表示
    勾选,预期值可以使用正则表达式表示

Expected Value
    预期值 支持脚本语言写法

Expect null
    还需要勾选“Additionally assert value”
    勾选,验证提取的值为null

Invert assertion
    若勾选,表示对断言结果取反
如 检测返回得code字段是否为200:
Assert JSON PATH exists
    $.code
Additionally assert value
    勾选
Match as regular expression
    不勾选
Expected Value
    200
Expect null
    不勾选
Invert assertion
    不勾选

大小断言

判断返回内容的大小, 包含: 全部响应、响应头部、响应主体、响应报文等等

Apply to
    Main Sample only 之作用与范围的sample

响应字段大小
    完整响应 *
    响应头
    响应的消息体
    响应代码
    响应消息

Size to Assert
    字节大小+比较类型(=,!=,>,<,<=,>=)

断言持续时间

Apply to
    Main Sample only 之作用与范围的sample

断言持续时间(毫秒)

集合点(同步定时器)

阻塞线程,直到指定的线程数量到达后,再一起释放,模拟并发

需求:对接口进行n个用户【同时】请求访问操作

选中取样器-右键添加定时器中的同步定时器
    模拟用户组的数量设置为n
    线程组线程数设置为n,循环次数设置为1

同步定时器
    模拟用户组的数量
        集合多少用户后再执行请求
    超时时间(毫秒)
        设置为0,无限等待,直到达到集合点设置的线程数
        设置指定时长,如果到达指定时长,集合点数量未到达,集合多少用户释放多少用户数量

注意:
    集合点只对一个请求起作用,如果针对指定请求起作用,放到该请求内
    集合点对多个请求起作用,放到与请求平级同一层次

每秒请求数设置(常数吞吐量定时器)

常数吞吐量定时器可以方便的控制给定的取样器发送请求的吞吐量

需求:对接口进行每秒n个用户【同时】请求持续t秒

线程组设置
    线程数 n
    循环次数 t

选中取样器-右键添加定时器中的常数吞吐量定时器
    2种方式(1比较稳定)
    1
        基于计算吞吐量-只有此线程
        目标吞吐量-60
    2
        基于计算吞吐量-所有活动线程
        目标吞吐量-n*60

如果需要无线循环,将线程组循环次数改为永远即可

参数介绍---        
常数吞吐量定时器
    目标吞吐量(每分钟样本量)
        根据基于计算吞吐量填入
    基于计算吞吐量
        只有此线程
            控制每个线程的吞吐量,选择这种模式时,总的吞吐量为设置的目标吞吐量乘以该线程的数量
        所有活动线程
            设置的目标吞吐量将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理的时间后再次运行。活跃线程指同一时刻同时运行的线程。
        所有活动线程(共享)
            与所有活动线程的选项基本相同。唯一区别是,每个活跃线程都会在所有活跃线程上一次运行结束后等待合理的时间后再次运行。
        当前线程组的所有活动线程
            设置的目标吞吐量将分配在当前线程组的每一个活跃线程上,当测试计划中只有一个线程组时,该选项和所有活动线程选项的效果完全相同。
        当前线程组的所有活动线程(共享)
            与当前线程组的所有活动线程基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间后再次运行。

每秒请求数设置(准确的吞吐量定时器)

准确的吞吐量定时器也可以方便的控制给定的取样器发送请求的吞吐量

需求:对接口进行每秒n个用户【同时】请求持续t秒

线程组设置
    线程数 n
    循环次数 t

选中取样器-右键添加定时器中的准确的吞吐量定时器
    目标吞吐量(每个吞吐期间的样本)
        n * t
    吞吐量周期(秒)
        t
    测试持续时间(秒)
        t
如果需要无线循环,将线程组循环次数改为永远即可

参数介绍---
准确的吞吐量定时器
    目标吞吐量(每个吞吐期间的样本)
        根据吞吐量周期要完成多少总并发填入
    吞吐量周期(秒)
    测试持续时间(秒)

函数

可以被认为是特殊值,可以填充测试树任何采集器或其他元素的字段

函数调用格式
    有参数 ${__functionName(var1,var2,var3)} 
    无参数 ${__functionName} 
    如果函数参数包含逗号,请确保使用“ \” 转义,否则JMeter会将其视为参数分隔符

函数助手对话框
    菜单-工具->函数助手对话框

常用的函数

_CSVRead函数 ${__CSVRead(path,0)}
    参数1 csv文件路径
    参数2 取第几列,从0开始
    特点
        不同的线程数才会影响取值变化,比较耗费资源
        即同一个线程多次循环使用的是同一个值

_counter函数 ${__counter(FALSE,)}
    参数1  TRUE,每个用户有自己的计数器;FALSE,使用全局计数器 

_Random函数 ${__Random(1,6,)}
    最大值和最小值整数

_time函数 ${__time(MM-dd hh:mm:ss,)}
     参数1 格式化字符 09-24 03:43:20

_setProperty函数 ${__setProperty(depid,${depid},)}
    把指定数据(必须是参数引用或静态数据)设置成全局变量
    BeanShell执行${__setProperty(depid,${depid},)}

_property函数 ${__property(depid,,)}
    获取Jmeter属性值

BeanShell取样器
    支持java语法
    把指定数据设置成全局变量
        props.put("depid1", a);
    获取全局变量
        props.get("depid1");
    打印
        log.info();
        。。。

分布式

一台电脑作为控制机(Controller),其它电脑做为执行机(Agent),控制机会把脚本发送到每台执行机上,执行机拿到脚本后就开始执行,执行机会把结果回传给控制机,控制机会收集所有执行机的信息并汇总

控制节
    Jmeter.properties(bin目录)
        remote_hosts=127.0.0.1:1099,127.0.0.1:1100
        server.rmi.ssl.disable=true
    根据执行机数量配置脚本线程数
        并发1000,2个执行机,则线程数填500合适
    启动
        远程启动
        远程全部启动
        远程停止
        远程停止所有
        远程关闭
        远程关闭所有
        远程退出    将jmeter-server退出
        远程退出所有    将jmeter-server退出
执行机
    Jmeter.properties(bin目录)    
        server_Port=1099 默认1099
        server.rmi.ssl.disable=true
    启动分布式监听
        windows jmeter-server.bat
        linux ./jmeter-server -Djava.rmi.server.hostname=192.168.40.10


注意:
如果使用csv进行参数化,那么需要把参数文件在每台执行机上拷一份且路径需要设置成一样的
每台机器上安装的Jmeter版本和插件最好都一致,否则会出一些意外的问题
执行机上Jmeter也许需要配置JDK环境变量;

逻辑控制器

只对其子节点的sampler有效

控制类

如果(If)控制器
条件成真,则执行控制器下所有取样器
Expresson(must evalution to true or false)
    如 ${__jexl3("${web}"=="百度",)}
ForEach控制器
ForEach控制器一般和用户定义的变量一起使用,在用户自定义变量中读取一系列相关的变量
    用户定义的变量-变量格式如
        web_1    百度    
        web_2    淘宝    
        web_3    京东    
    参数
        输入变量前缀
        开始循环字段(不包含)
        结束循环字段(含)
        输出变量名称    用于循环中使用 ${变量名}
        是否勾选数字之间加上下划线
交替控制器
交替控制,该控制器包含的所有取样器,步骤交错执行在每个循环中
参数
    是否忽略子控制模块
    interleace across thraeds 
        不勾选 不同线程交替,Sample不会交替;同一线程不同循环,Sample会交替
        勾选    不同线程交替,Sample会交替;同一线程不同循环,Sample会交替(推荐)
循环控制器
指定循环控制器内取样器的执行次数
    循环次数
        n或者永远
仅一次控制器
该控制器下取样器只执行1次
主要是在循环中使用,保证取样器只执行一次
随机控制器
随机执行其下的所某个请求
    不同线程交替和同一线程不同循环都会随机,始终随机
随机顺序控制器
对控制器下所有采样器,随机产生1个执行顺序,进行执行
    不同线程交替和同一线程不同循环产生1个执行顺序,进行执行
    与随机控制器不同点
        随机控制器-随机执行其下的1个请求
        随机顺序控制器-随机执行其下的全部请求
While Controller 控制器
循环执行控制器内所有采样器,直到条件为假时,停止循环,可与计数器配合
    Condition(function or variable)
        如 ${__jexl3(${index}<${count})}    index为计数器引用变量
        当为LAST时和为空时-不探究
Switch Controller控制器
通过给该控制器中的value赋值,来指定运行哪个取样器
    Switch Value
        可为采样器名称;执行采样器名称相应的请求
        可为索引 整数值 第一个为0
        为空 默认为执行第一个
吞吐量控制器(了解)
吞吐量控制器(Throughput Controller)用来控制其下元件的执行次数,并无控制吞吐量的功能。

作用:控制其下的子节点的执行次数与负载比例分配

参数
  Total Executions:按照次数来执行
  percent Executions:按照百分比来执行
  Per User:线程数,当选Total Executions时,是线程数;当选percent Executions时,是线程数*循环次数

分组类

简单控制器
只做分组使用,犹如打隔断
事务控制器
生成一个额外的采样器来测量其下测试元素的总体时间
    这个时间包含该控制器范围内的所有处理时间,而不仅仅是采样器的
    可通过聚合报告查看结果
    可以添加多个sample,看他们事务的吞吐量等指标

图形监视器扩展插件

在客户端Jmeter工具中查看服务器(CPU、内存、网络、磁盘)的使用信息

客户端(JMeter)
    下载插件
        https://jmeter-plugins.org/downloads/old/
    将ext目录下的文件粘贴到Jmeter的Lib目录下面的ext目录

服务端
    下载性能监控插件
        https://jmeter-plugins.org/wiki/PerfMonAgent/
        添加监听器-jp@gc - PerfMon Metrics Collector
            添加监控指标
                Host/IP
                Port
                Metric to collect
                    CPU
                    Memory
                    Disk I/O
                    ...
            所有数据写入一个文件 可指定文件
    解压到服务器任意目录
    启动
        Windows startAgent.bat
         Linux startAgent.sh
         默认4444(4444为启动服务器监听服务程序时的端口号)

API文档解析

href节点
    作用:href节:为资源的请求地址;
    (请求资源集合时的请求地址要与**href相符**)  

items节点
    作用:为服务器响应数据时返回的资源属性;
    (请求接口时,返回的资源属性要与items里的属性相符)  

Links节点
    作用:为在当下资源下能连接到的直属下一资源
    (比如:A资源直接包含或关联着B、C两个资源,如果访问到A资源时,Links应定为到B和C)   

templates节点
    作用:为新增和更新资源时所需要的属性
    (新增和更新资源时所需要的JSON报文属性)

queries节点
    作用:为资源支持的查询列表参数名和查询条件
    (资源支持哪些属性可以list查询;支持做查询条件的属性) 

error节点
    出现错误时,返回的报文格式和属性

功能脚本设计

每个接口为一个线程组,例如:(查询所有、查询指定、新增、更新、删除)

学生信息-功能脚本
    HTTP信息头管理器
    HTTP请求默认值
    学院-查询所有
    学院-查询指定
    学院查询-List-$dep_id_list
    学院查询-List-$dep_name_list
    学院查询-List-$master_name_list
    学院查询-List-$slogan_list
    学院查询-模糊
    学院查询-组合
    学院-新增
    学院-更新
    学院-删除单个
    学院-删除多个
    查看结果树

为独立运行每个线程组,需要勾选独立运行每个线程组,即一个线程组结束后才会运行下一个线程组

接口用例设计

用例设计原则
    覆盖所有的必选参数
    组合可选参数
    参数边界值
    如果参数的取值范围是枚举变量,需要覆盖所有枚举值    
    空数据
    包含特殊的字符
    越界的数据
    错误的数据

测试数据分类
    正向:(根据测试用例覆盖面设计正向测试数据)
    逆向: (根据测试用例覆盖面设计逆向测试数据)

正向方法
    传入所有可传属性,且格式正确
    传入必填属性,且格式正确

逆向方法    
    为空校验
    为空格校验
    前后含空格校验
    超长校验
    类型校验
    含特殊字符校验
    删除引用校验
    唯一不重复属性校验

自动化脚本设计

后台程序更新/发布新版之前需要验证下之前的功能是否能用

自动化脚本设计原则
    每个测试用例都是独立的
    测试用例都是可重复运行的
    测试数据与业务相分离(测试数据包括参数接口数据/ 测试执行所需要的系统数据)
    测试完成后,要删除不必要的测试数据。    

参考https://blog.csdn.net/NHB456789/article/details/140150024
    数据驱动ddt
        CSV数据驱动+HTTP取样器
        csv数据 如
            序号    用例标题    请求方式    接口地址    参数输入    期望返回
            都可以作为变量在jmeter中使用
            如参数输入需要用到jmeter的变量,csv中参数输入可以包含${变量}形式,jmeter使用${__eval(${参数输入})}
    测试结果校验
        响应断言+CSV数据驱动(期望返回)
    接口依赖处理
        将需要依赖的接口作为前置操作
        如果csv数据上传参数需要依赖的接口返回值,可使用${__eval(${参数输入})}
    公共数据管理
        自定义变量或者默认HTTP请求默认值以及HTTP信息管理器
    多接口批量执行
        一个接口一个测试片段,通过模块控制器运行

性能脚本设计

新增、更新、删除:使用固定数值,比如新增100条,更新100条,删除100条
查询:采用虚拟用户数和持续时间配合(比如,100用户,持续查询600秒)

参数化
    参数化尽量避免采用从外部读取参数,使用固定参数+函数形式( 如:${__counter(TRUE,)})
察看结果树
    必须清除单个接口内察看结果树
     (如不去掉,非常占用测试机自身性能)
报告
    性能报告可根据实际需求选择,建议保留添加聚合报告  
线程组
    增删改查每一个功能点,都需建立单独线程组,而避免在同一个线程组内添加
    多个HTTP请求完成增删改查(一便参数化对单个请求做压测和并发)
分布式
    如并发数量大,采用分布式测试

聚合报告参数

Label
Samples 用同一个请求取样器,发送请求的数量
Average 请求的平均响应时间
Median 中位数。50%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第50%的值。
90% Line 90%的样本都没有超过这个时间。这个值是指把所有数据按由小到大将其排列,就是排列在第90%的值。
Min 针对同一请求取样器,请求样本的最小响应时间
Max 针对同一请求取样器,请求样本的最大响应时间
Error % 出现错误的请求样本的百分比
Throughput 吞吐量
Received KB/sec 收到的千字节每秒的吞吐量测试。
Kb/sec - 发送的千字节每秒的吞吐量测试

术语

QPS

Query Per Second每秒查询率。是一台查询服务器每秒能够处理的查询次数。

可通过常数吞吐量定时器实现

响应时间(RT)

响应时间是指系统对请求作出响应的时间

吞吐量(Throughput)

单位时间内服务器处理的客户端请求数量

通常情况下,吞吐量用“请求数/秒”或者“页面数/秒”来衡量。
从业务角度来看,吞吐量也可以用“业务数/小时”、“业务数/天”、“访问人数/天”、“页面访问量/天”来衡量。
从网络角度来看,还可以用“字节数/小时”、“字节数/天”等来衡量网络的流量

并发用户数

多个用户同一时间操作同一业务

并发用户数的时候一般结合集合点(Synchronizing Timer)一起使用;

生成HTML报告

命令行生成
    生成结果文件
        jmeter -n -t 测试文件 -l 运行结果文件
            -n :以非GUI形式运行Jmeter
            -t :source.jmx 脚本路径
            -l :运行结果保存路径(.jtl)
     生成结果文件和HTML报告
        jmeter -n -t 测试文件 -l 运行结果文件 -e -o 报告目录
            -n :以非GUI形式运行Jmeter
            -t :source.jmx 脚本路径
            -l :运行结果保存路径(.jtl)
            -e :在测试结束后生成HTML报告
            -o :指定用于生成HTML报告的目标目录
    通过结果文件生成HTML报告    
        jmeter -g 运行结果文件 -o 报告目录
            -g :指定结果文件(.jtl)
            -o :指定用于生成HTML报告的目标目录

GUI生成(通过结果文件生成HTML报告)
    菜单-工具-Generate HTML report
        填写results file
        填写user.properties 在bin目录下
        填写ouput directory

报告解读

报告分为3个部分
    Dashboard:提供了整体的概览信息,显示了关于测试结果的总体摘要。
    Charts:提供了关于性能指标的图表,如吞吐量、响应时间、活跃用户数等。
    Custom Graphs:允许根据自己的需求创建和显示自定义的图表。

Jmeter其他功能点

Jmeter FTP

可以根据FTP服务器进行上传和下载文件(上传、下载需要权限)
线程组->取样器->FTP请求
    上传
        须填写
            服务器名称
            远程文件
            本地文件
            需勾选 put
    下载
        须填写
            服务器名称
            远程文件
            本地文件
        需勾选 get

Jmeter test fragment

测试片段元素是控制器上的一个种特殊的线程组,它在测试树上与线程组处于一个层级

把单独功能脚本封装起来,待需要使用的时候,直接引用;类似于python中的函数或模块

测试片段被引用执行两种方式
    模块控制器可以引用执行测试片段
        选中要运行的模块即可
    Include Controller控制器也可以引用和执行片段
        此处是填写jmx文件名(并不是将测试片段另存为jmx,而是将测试片段下的内容右键保存测试片段为jmx)

Jmeter非测试元件

HTTP镜像服务器

测试计划->非测试元件->HTTP镜像服务器
    在本地临时搭建一个HTTP服务器,该服务器把接收到的请求原样返,这样就可以看到发送出的请求的具体内容,以供调试

HTTP(S)测试脚本记录器(HTTP代理服务器)

不太好用

监听浏览器代理,记录基于代理浏览器所有的请求,并以Jmeter可执行的脚本格式保存

属性显示

测试计划->非测试元件->属性显示
    以GUI图形界面显示Jmeter配置属性或者系统属性

Jmeter ip欺骗

添加CSV Data Set Config(所有线程),获取csv中的ip到如ip变量(前提是本机配置了这些ip)
HTTP取样器中高级设置配置客户端实现,配置原地址为${ip}

results matching ""

    No results matching ""