接口测试基础05

Jmeter组件:断言(重点)

A、 是什么?

接口测试原理:
请求:是否正确,默认请求成功是200(GET),如果请求错误也能返回404、500等。
检查:返回数据的正确性与完整性
程序代替人工判断响应结果是否符合预期

B、 为什么?

安全、高效、功能强大。

C、怎么用?

断言的分类
 1) 响应断言
 2) Size Assertion(Size 断言)
 3) Duration Assertion (持续时间断言)

响应断言

Jmeter中一种断言组件,可断言响应(信息头内容、主体内容、响应代码) 
解决方案分析
1. 测试计划-线程组
2. 线程组-HTTP请求
3. HTTP请求->断言->响应断言
4. 测试计划->监听器->察看结果树
5. 测试计划->监听器->断言结果
技术难点分析
1.断言代码
2.断言数据(T02)
响应断言配置图-断言代码
1. 响应代码: 只有选择响应代码,Jmeter才去拿预期结果和响应代码去对比
2. 要测试的模式:这里填写我们的预期结果;如:200   
 响应断言配置图-断言数据
1. 响应文本:只有选择响应文本,Jmeter才去拿预期结果和响应数据去对比
2. 要测试的模式:这里填写我们的预期结果;如:T02 
断言结果
作用:断言运行成功默认不显示,如果断言失败,记录每次失败原因
响应断言-总结:
1. 断言概念
2. 断言响应代码
3. 断言响应数据
4. 断言结果作用
需求2
使用断言需求1所返回的主体数据大小是否小于100kb  
问题
1. 响应断言如何判断返回的数据大小小于100kb?

Size Assertion(Size 断言)

作用:主要判断返回数据的大小是否属于预期数据大小范围
(Response Header、Response Body、响应信息)
解决方案分析
1. 线程组->断言->Size Assertion(Size 断言)
技术难点分析
1. 断言响应主体数据大小
Size Assertion(Size 断言)配置图
1. Response Body:选择此项判断返回主体数据Body的大小
2. 字节大小:设置要判断数值 单位bytes/kb
3. <:小于符号,说明判断要返回Body主体数据大小小于100kb
4.Response Headers=响应代码+响应信息
Size Assertion(Size 断言)-总结:
1. 作用
2. 可断言哪些大小
需求3
1.断言需求1所返回的响应时间是否小于10毫秒
问题
1.基于响应断言、Size Assertion怎么去断言请求的响应时间是否小于10毫秒?

断言持续时间

作用:断言服务器响应请求的时间是否小于指定值; 
解决方案分析
1. 线程组->断言->断言持续时间
技术难点分析
1.时间设置
断言持续时间配置图
1. 持续时间(毫秒):这里的持续时间为毫秒,比如:10 毫秒。
2. 断言响应时间是否超过设置的值(10),如果超过则断言失败,反之成功
断言持续时间-总结
1. 作用
2. 单位
3. 断言成功标准

断言-总结:

作用:
1. 响应断言:断言响应代码/响应数据
2. Size Assertion:断言响应数据大小是否在指定范围
3. 断言持续时间:断言响应数据时间是否在指定时间范围
脚本-效果图:
问题
1. 树形标签栏里的层级结构是有什么意义?

Jmeter组件:集合点

A、是什么?

Jmeter 内置组件之一,可以启动多个用户,让多个用户在同一刻去访问服务器

B、为什么?

可以模拟高并发实现,测试服务器性能

C、怎么用?

需求
1. 学院查询-所有 http://127.0.0.1:8000/api/departments/
2. 学院查询-指定 http://127.0.0.1:8000/api/departments/T02/
需求对(学院查询-所有)这个接口进行20个用户【同时】请求访问操作。
问题
1. 设置线程组循环次数为:20,解决不了需求问题
2. 设置线程组线程数量为:20,同样解决不了问题
集合点
作用:集合点用以同步虚拟用户,以便恰好在同一时刻执行任务。
 解决方案分析
1. 测试计划->线程组
2. 线程组->Sampler->HTTP请求(学院查询-所有)
3. 线程组->Sampler->HTTP请求(学院查询-指定)
4. HTTP请求(学院查询-所有)->定时器->Synchronizing Timer
5. 测试计划->监听器->察看结果树
场景:模拟 N 个用户在同一时刻查询学院信息操作 
C-1、搭建框架(测试计划、结果树、线程组、http请求)
	  线程组通过线程数模拟多个用户
C-2、添加集合点组件
	 定时器  -----> 同步定时器 
	 组件属性1: 一组用户数
	 组件属性2: 超时时间  
C-3、运行查看结果
	运行流程:
	1)、启动线程 ----> 右上角
	2)、所有线程启动完毕,再统一执行
C-4、注意
	超时时间可以设置为 0 : 无限等待
	建议 : 线程总数整除集合点的一组线程数,否则会挂起
集合点参数配置图
1. Number of Simulated Users to Group 
   by:集合多少用户后再执行请求(也就是执行的线程数)

扩展选项:
2. Timeout in milliseconds:超时时间(毫秒)
    1) 设置为0,无限等待,直到达到集合点设置的线程数。
    2) 设置指定时长,如果到达指定时长,集合点数量未到达,集合多少用户释放多少用户数量。
查看结果添加聚合报告:

Jmeter组件:函数

A、是什么? 

是程序中的封装单元(最小的),封装一些功能实现

B、为什么?(了解)

1. 使用函数我们可以1次【批量】的对学院资源进行新增
2. 使用函数我们可以利用函数读取外部数据进行参数化
3. 使用函数我们可以设置指定动态数据的数据为全局变量

C、怎么用?

流程:
1)、打开Jmeter 内置的函数功能模块
2)、选择要调用的函数,传参数,生成调用格式
3)、哪里需要粘哪里

D、函数分类:

Jmeter常用函数
1. __CSVRead
2. __counter 
3. __Random
4. __time
5. __setProperty
6. __property

以上为我们使用Jmeter测试项目时常用的函数,接下来我们将逐个学习;
在学习这些函数之前我们先介绍下:
1) Jmeter函数格式
2) 函数助手对话框
Jmeter函数的格式
1. ${__functionName(var1,var2,var3)} 
     1) ${} 函数引用固定格式和参数化相同
     2) __functionName匹配被调用的函数名称;
     3) 用圆括号包含函数的形参,例如${__time(YMD)},不同函数要求的参数也不同;
     4) 有些JMeter函数不要求参数,则可以不使用圆括号,例如${__threadNum};
函数助手对话框
作用:对Jmeter中自带函数的参数设置和生成使用
启动方式:
    1) 菜单(选项)-->函数助手对话框
    2) Ctrl+Shift+F1
    3) 工具栏倒数第二个 图标"记事本"  
作用:对Jmeter中自带函数的参数设置和生成使用
启动方式:
    1) 菜单(选项)-->函数助手对话框
    2) Ctrl+Shift+F1
    3) 工具栏倒数第二个 图标"记事本"  

__CSVRead 函数

作用:csvRead函数是从外部读取参数,csvRead函数可以从一个文件中读取多个参数
案例1
通过CSVRead函数读取csv.txt内容,作为请求时接口所需参数的值使用

http://127.0.0.1:8000/api/departments/?$dep_id_list=${__CSVRead(E:jmeterScript参数csv.txt,0)}
,${__CSVRead(E:jmeterScript参数csv.txt,1)}

csv.txt内容
    T01,T02
    T03,T04
    T05,T06
操作分析
1. 测试计划->线程组
2. 线程组->HTTP请求
3. 函数助手对话框->__CSVRead
4. 测试计划->监听器->察看结果树
技术难点
1. __CSVRead 参数设置
2. 线程组 (线程数)
__CSVRead 参数配置图
1. 选择一个功能:选择__CSVRead
2. CSV file to get values from | *alias:要读取的文件路径-(绝对路径)
3. CSV文件列号| next| *alias:从第几列开始读取,注意第一列是0
4. 点击生成函数引用格式
5. 全选复制
__CSVRead-总结:
1. 绝对路径
2. 列的开始索引
3. 多行参数使用线程数,通过线程数来迭代数据 	
注意:CSV Data Set Config 执行多次是使用的循环次数,而 CSVRead 执行多次使用的是线程数

__counter函数

作用:这个函数是一个计数器,用于统计函数的使用次数  
案例2
使用counter计次函数,请求(查询学院-所有)10次,为每次请求做计次标识  
http://127.0.0.1:8000/api/departments/?num=${__counter(FALSE,)}
操作分析
1. 测试计划->线程组
2. 线程组->HTTP请求
3. 函数助手对话框->__counter
4. 测试计划->监听器->察看结果树
技术难点
1. __counter函数参数设置
2. 设置计数参数名
__counter函数配置图
1. TRUE,每个用户有自己的计数器;FALSE,使用全局计数器:
    1) TRUE:  每个用户有自己的计数器,可以用于统计每个线程各执行了多少次
    2) FALSE: 使用全局计数器,可以统计出这次测试共运行了多少次用
__counter函数-总结
1. __counter函数作用
2. __counter函数与指定值配合使用 num=${__counter(FALSE,)}

__Random函数

作用:随机生成一个指定范围内的数值   
 案例3
使用__Random函数对请求(查询学院-指定)进行随机查询
http://127.0.0.1:8000/api/departments/T0${__Random(1,6,)}/
操作分析
1. 测试计划->线程组
2. 线程组->HTTP请求
3. 函数助手对话框->__Random
4. 测试计划->监听器->察看结果树
__Random函数配置图
1. 一个范围内的最小值:随机数生成时开始数,也是最小数
2. 一个范围内允许的最大值:随机生成结束数,也是最大数
 __Random-总结 
1. __Random作用
2. __Random设置

__time函数

作用:获取当前电脑日期时间 比如:MMddhhmmss 月/日/时分秒
案例4
使用__time函数解决迭代(学院-新增)dep_id重复问题

JSON报文:
        {
            "data": [
                        {
                            "dep_id":"time${__time(MMddhhmmss,)}",
                            "dep_name":"Test学院",
                            "master_name":"Test-Master",
                            "slogan":"Here is Slogan"
                        }
                      ]
        }
操作分析
1. 测试计划->HTTP信息头管理器
2. 测试计划->线程组
3. 线程组->HTTP请求
4. 函数助手对话框->__time函数
5. 测试计划->监听器->察看结果树   
技术难点分析
1. HTTP信息头管理器设置
2. HTTP新增请求方法
3. __time函数参数
__time函数参数配置图
1. Format string for SimpleDateFormat (optional):
    1) 为空:返回毫秒
    2) 设置格式:MMddhhmmss 月/日/时/分/秒   
__time函数-总结
1. __time作用
2. __time参数设置

__setProperty函数

作用:用于把指定数据设定成Jmeter属性,可以理解为是把指定数据设置成全局变量  
 案例5
1. 通过__setProperty函数把新增的学院ID,设置成全局变量
操作分析
1. 测试计划-HTTP信息头管理器
2. 测试计划->JDBC Connection Configuration
3. 测试计划->线程组(学院-新增)
4. 线程组->HTTP请求(HTTP请求-学院新增)
5. 线程组->JDBC Request
6. 函数助手对话框->__setProperty函数
7. 线程组->BeanShell Sampler
8. 线程组->Debug Sampler
9. 测试计划->察看结果树
10. 工作台->Property Display
技术难点分析
1. __setProperty函数参数设置
2. BeanShell Sampler作用 
3. JDBC Request SQL语句
4. 如何知道设置的属性(全局变量)成功了
__setProperty函数参数配置图
1. 属性名称:要设置的属性名称也就是全局变量名
2. Value of property:属性的值(全局变量的值)  
BeanShell Sampler 组件配置图
作用:可执行JavaScript的一种容器
需求:
 需求:http 请求1 访问百度,将请求1响应的 title 值传递给请求2,但是两个请求不属于同一个线程组
      http 请求2 访问 google  /?wd=百度一下你就知道
 实现思想 :

	  将线程组内部的数据导出去,存储在共享空间中,其他线程组要使用数据,就从共享空间获取
实现流程:
	 1)、将数据从当前线程组导出 __setProperty
		 变量名
		 变量值  ${变量名}		
		 使用 BeanShell Sampler 调用函数
	 2)、另外一个线程组将导出到共享空间的数据引入 __property
		根据变量名获取 
        注意:
        查看共享数据,工作台 ----> 添加 -----> 非测试元件 ----> property display

__property函数

作用:获取Jmeter中属性值
解决方案分析
1. 选中案例5中测试计划-独立运行每个线程组选项
2. 基于案例5中测试计划->线程组(线程组-读取depid属性)
3. 线程组(线程组-读取depid属性)->HTTP请求(HTTP请求-读取depid属性)
4. 函数助手对话框-__property函数  
__property函数配置图
1. Name of variable in which to store the result (optional):获取属性的名称

Jmeter:分布式

A、是什么

多台测试机协作(集群方式)完成测试任务

B、为什么

1. 我们单台电脑由于配置(CPU、内存)问题,最模拟500用户时,就出现卡死现象   
(当线程组)

C、怎么用

分布式原理
1. 一台电脑作为控制机(Controller),其它电脑做为执行机(Agent);
2. 执行时,控制机会把脚本发送到每台执行机上,执行机拿到脚本后就开始执行
3. 执行机执行时不需要启动Jmeter界面,可以理解它是通过命令行模式执行的
4. 执行完成后,执行机会把结果回传给控制机,控制机会收集所有执行机的信息并汇总
环境搭建
1) 、搭建伪分布式环境,一台设备模拟 3 台

2)、在同一台设备开启 3 个 Jmeter 即可
 	复制 3 个 Jmeter,因为要同时启动然后网络间进行数据交互,修改端口号
3)、伪分布式下配置端口号
	执行机 A,设置一个端口号: 6666
	执行机 B,设置一个端口号: 7777
	控制机要寻址执行机 ,配置: remote-hosts=执行机A IP:6666,执行机B IP:7777

C-3、分布式测试:
	1) 、需求:平均分配 1000 个用户分别给 执行机A 和 执行机B 执行
		控制机编写相关脚本
	2)、分配给执行机
解决方案分析
1. 1台电脑(控制机)分发执行任务
2. 2台电脑(执行机)执行任务
3. 在执行机上启动监听服务程序
4. 在控制机上启动运行
5. 测试计划->聚合报告
技术难点分析
1. 执行机-jmeter.properties设置
2. 控制机jmeter.properties设置
3. 执行机启动分布式监听服务程序
3. 2台执行机,用户数如何设置
执行机Jmeter.properties配置图
1. 打开bin目录下jmeter.properties配置文件
2. server_port=1099
    1) 1099:为执行机自定义端口号
3. 提示:
    1) 去除备注符号 # 
    2) 自定义端口号时,注意选择未被占用端口号
控制机Jmeter.properties配置图
1. remote_hosts=127.0.0.1:1099,127.0.0.1:1100
    1) remote_hosts:为执行机IP地址和端口号
2. 注意:
    1) 多个执行机之间使用逗号(,)隔开
执行机启动分布式监听程序效果图
1. 运行bin目录下jmeter-server.bat
2. 运行后勿关闭黑色窗口
控制机-线程数设置图:
1. 需求1000用户,两台执行机同时接受控制机脚本去执行然后反馈给控制机,所以线程数设置500
控制机-运行分布式执行机图
1. 菜单-运行->选择全部启动
2. 快捷键->Ctrl+Shift+R
聚合报告
这里先不做讲解,我们只看# Samples属性,查看统计取样数量
提示
1. 修改完端口要重启Jmeter.bat
2. 控制机和执行机分开(为了方便教学,这里采用控制机和代理机在1台机器上)
   1). 由于控制机需要发送信息给执行机并且会接受执行机回传的测试数据所以控制机自身会有消耗
3. 参数文件:如果使用csv进行参数化,那么需要把参数文件在每台执行机上拷一份且路径需要设置成一样的;
4. 每台机器上安装的Jmeter版本和插件最好都一致,否则会出一些意外的问题;
5. 执行机上Jmeter也许需要配置JDK环境变量;

分布式-总结

1. 分布式概念
2. 分布式原理
3. 执行机配置文件设置
4. 控制机配置文件设置
5. 控制机线程数设置
原文地址:https://www.cnblogs.com/st998/p/13785658.html