接口测试

1、接口测试:接口(重点)

A、是什么?

数据交互的入口和出口,是一套规范一套标准
分类:
硬件 ----- USB 接口, 电源接口,网线接口.....
软件 ----- 就是前后端共同遵守的一套数据交互的规范(架构师制定接口)

B、为什么?

高效、灵活(灵活的意思就是:_ 扩展性强 _提高内聚性降低了耦合性)(记住)
不使用接口的缺点:

1. 研发标准不统一,团队磨合难度高
2. 研发周期长
3. 可扩展性差

使用接口的优点:

1. 统一设计标准;
2. 前后端开发相对独立;
3. 扩展性灵活;
4. 前后端都可以使用自己熟悉的技术;
C、怎么用?

C-1、接口规范是架构师制定的
C-2、前端和后端开发时共同参考的依据

2、接口测试:接口测试(重点)

A、是什么?

测试后端实现是否符合接口规范(不是测试接口本身,接口本身就是个文档)

B、为什么?

为了程序更安全、效率(性能方面的,包括响应时间的问题)

C、怎么用?(实现流程)

模拟客户向服务器发送数据,然后查看响应
要素1: 定位服务器资源(通过 URL 实现: http://www.baidu.com | http://127.0.0.1:8000/资源路径)
要素2: 模拟用户提交数据
要素3:查看响应的结果是否符合预期

D、接口测试分类(记住)

类型1:web接口测试 (BS 架构)
​ | ----- 服务器接口测试:测试自己公司实现的接口
​ | ----- 第三方接口测试:测试别的公司实现的接口
类型2:模块接口测试 (CS 架构)

3、接口测试:环境搭建

A、是什么?

搭建接口测试的测试环境,运行程序

B、为什么?

必须的

C、怎么用?

1)、运维或开发实现程序部署,正常运行
2)、没有运维时,我们自己搭建
  2-1、安装 python(因为项目程序是用python写的)
  2-2、安装依赖 (这个项目要运行还需要网上的一些组件):pip install -r requirements.txt -i https://pypi.douban.com/simple,若安装速度慢,指定国内源,需再加上: -i https://pypi.douban.com/simple
  2-3、在文件目录下cmd,启动项目 : python run_server.py
  2-4、测试,浏览器中输入: http://127.0.0.1:8000/api/departments 如果正常响应数据了,那么程序安装并启动正常
3)、学生管理系统简介
  核心(无论做什么项目,核心就是数据,数据都存在数据库里): 学生表 班级表 学院表
  操作: 3张表的增删改查

4、接口测试:插件

A、是什么?

是测试接口的测试工具,可以安装到浏览器中,不同的浏览器安装不同的测试工具
火狐 ------ RESTClient
谷歌 ------ POSTman
Java实现的测试工具: Jmeter(用Java写的)(重点)

B、为什么?

测试工具功能强大一些,使测试更快捷方便

C、怎么用?

注意:二者安装时,都要注意版本,不然会有兼容性问题
Google 插件资源下载被屏蔽了,安装提前下载完毕的


fireFox安装RESTClient.png
fireFox安装RESTClient2.png
fireFox安装RESTClient3.png

5、接口测试:RESTful 风格(重点)

A、是什么?

RESTful 风格: 开发测试时,大家都会遵守一些默认的规范,这些是约定成俗的,大家的习惯做法,非强制性的 RESTful 风格就是这些习惯中的一种
RESTful 风格中规范了,URL 的实现方式,提交的数据的实现方式,响应的数据的实现方式 ......

B、为什么?

为了程序的易读性和易维护性

C、怎么用?(记住)

RESTful 风格是约束接口操作的四种操作(增删改查)以及三个要素(URL,数据提交,数据响应)
增:
 要素1: URL + POST
 要素2: 多个数据
  方式1: URL?键=值&键=值(GET);在报文里:键=值&键=值(POST)
  方式2: JSON 格式
 要素3: 200 或 201(更规范) + 添加的记录

删:
 要素1: URL + GET|DELETE(更合适)
 要素2: 方式1: 键=值&键=值
 要素3: 200|204(更规范) + 无

改:
 要素1:URL + POST|PUT(更合适)
 要素2:
  方式1: 键=值&键=值
  方式2: JSON 格式
 要素3:200 | 201(更规范) + 修改后那条记录

查:
 要素1: URL + GET(不涉及安全,而且数据量不大一般用GET)
 要素2:常用方式1 URL?键=值&键=值....
 要素3:200 + 一条或多条记录

状态码:
404 ------ 资源路径有误
505 ------ 服务器异常

请求方法GET 和 POST 区别 :
1、POST 安全性高
2、POST 提交的数据量没有大小限制
3、GET效率高
4、GET数据会在地址栏显示,POST不会,在报文中显示

6、接口测试:JSON

A、是什么?

A-1、JSON 是一种数据载体
A-2、互联网本质就是数据传输,数据传输需要数据载体,比如:页面信息就是存储在 html 这种数据载体中的
A-3、
HTML 格式(标签语言):
   <html>
   <head>
   <title>hello</title>
   </head>
   <body>
    <font color='red'> hello world </font>
   </body>
  </html>
xml 格式:
  <person>
   <name>huluwa</name>
   <age>8</age>
  </person>
缺点:标签标记语言,有效数据占有率低
A-4、 JSON 优化数据传输
​ {"title":"hello","font":"hello world"}
​ {"name":"huluwa","age":"8"}

B、为什么?

JSON 传输数据效率更高,所以部分场景下使用 JSON 替换 html 和 XML_(ajax异步刷新,局部刷新页面时用的技术,例如注册时用户输入用户名后,浏览器就自动访问服务器的数据库,然后返回是否数据库中已存在这个用户名True | False,浏览器根据返回的True或False来显示用户名可用不可用)
但是 JSON 语法描述性不及 标签语言,所以部分场景还得使用 html 和 xml
如果传递的是少量数据的话,可能使用 JSON

C、怎么用?

语法:
格式1(JSON对象):{"键1":"值1","键2":"值2".....}
格式2(JSON数组):[值1,值2,值3.....]
格式复合: {"name":"huluwa","age":"8","aihao":["救爷爷",“吐火”,"吐水"]}
    [{"name":"huluwa","age":"8"},{"name":"aotuman","age":"10"}......]

7、接口测试:实战

目的:RESTful 风格练习
A、安装并运行学生管理系统
B、获取并读懂接口规范
  B-1、从前期API文档中提取接口清单 (了解此过程即可)
     API 文档: application programing Interface 应用程序编程接口(里面内容包括要实现的功能,要实现功能对应的接口,接口要适用的话要提交一些什么数据,功能要执行应该响应什么数据)——> 从API文档提取接口清单:href后面跟访问的资源地址,items后跟响应的数据内容
  B-2、接口清单读懂,关注以下三点:
     要素1: URL + 请求方法
     要素2: 提交的数据
     要素3: 响应的结果
C、逐一测试接口

总结:
新增或更新数据时,数据是 JSON 格式的,必须设置 浏览器的 http 请求头,不然服务器会当成普通文本解析处理
  Content-Type applicaton/json;charset=utf-8 (记住)
  Content-Type : 提交的内容类型
  application/json : 数据类型是 JSON 格式 | 大类型/小类型 img/jpg img/png .....
  charset=utf-8 : 设置编码集,utf-8 支持世界所有字符




1、Jmeter: 概述

A、是什么?

Jmeter 是 Apache 公司使用 Java 开发的一款测试工具

B 、为什么?

高效、功能强大
模拟一些高并发或多次循环等特殊测试场景

C、怎么用?

C-1、下载 Jmeter,解压缩
C-2、安装 Java 环境(Jmeter 和 Java 环境的关系,类似于mp3 文件和 播放器关系)
  注意:安装路径不能有中文字符、空格
  安装了 JDK + JRE
C-3、简单了解 Jmeter 的目录结构
  bin : 存储了 Jmeter 的可执行程序,比如启动程序,文件名后缀.bat是windows下的启动程序,.sh是linux下的启动程序(Jmeter允许用户自己用java写一些拓展应用)
  lib : 存储了 Jmeter 整合的功能(一些 .jar 文件的小程序)
C-4、启动 Jmeter
  启动方式1:bin/ApacheJmeter.jar 双击
  启动方式2:jmeter.bat windows 下的启动程序
       jmeter.sh linux 下的启动程序
C-5、编写一个 Jmeter 版本的测试案例
  1)、创建一个测试计划,改个名字,见名知意
  2)、ctrl+S保存一下,要自己能找得到
  3)、测试计划右键-添加-Threads-线程组,给线程组起个名字
  4)、线程组右键-添加-Sampler(取样器)-HTTP请求
  5)、HTTP请求改名字,填写IP,端口号,协议,请求方式,路径,content encoding=utf-8
  6)、查看响应,测试计划右键-添加-监听器-察看结果树
  7)、在察看结果树中,执行工具栏绿色箭头,看响应状态码,结果,可以把响应的数据换成JSON格式

D、Jmeter 的作用优点以及缺点(了解 )

作用:

1. 接口测试  
2. 性能测试  :测内在 ----- 测程序的算法,算法影响程序的执行效率,运行速度,
                          测功能模块的响应时间
3. 压力测试  :测外在 ----- 测外在负载,测用户数,达到多少个人不崩溃
4. Web自动化测试  
5. 数据库测试  : 测试数据库 
6. JAVA程序测试

优点:

1. 开源、免费 
2. 支持多协议 : http https ftp ftps(文件传输协议,例如网上下载文件) .....
3. 小巧
4. 功能强大

缺点:

1. 不支持 IP 欺骗(浏览器访问服务器的时候带过去的是假的IP)
2. 不支持前端测试(不能测试前端代码,前端有些动态效果用js实现)

2、Jmeter组件:线程组(重点)

A、是什么?(记住)

进程: 一个正在执行的程序就对应一个进程
线程: 进程中的执行线索 (一个进程有多个执行线索)
线程组:按照线程性质对线程进行分组

并发执行: 多个线程同时执行,特点: 执行结束的顺序和线程的启动顺序不一定一致(例如多个电影同时下载)
顺序执行: 按照线程的启动顺序挨个执行,特点:先启动先执行完,后启动后执行完(例如音乐先下载,后播放)

B 、为什么?

一个进程中有多个线程,分组了就方便管理

C、怎么用?(基本使用)

C-1、三者关系: 进程有多个线程组,线程组可以有多个线程
  进程 ---- 测试计划(创建一个测试计划,就是创建一个程序)
  线程组 ---- 线程组
  线程 ------- 线程组属性的线程数
C-2、默认情况下,线程组中的线程是并发执行的
  每一个线程都要执行组内的 http 请求(例如线程组01内设置了线程数2,那么http请求就会被执行2次)
C-3、怎么设置线程组顺序执行
  勾选测试计划的第一个复选框( 独立运行每个线程组)
C-4、线程组练习 学院增删 改查
  1)测试计划-线程组-http请求_查增|删|改
  2)测试计划-右键添加-配置元件-HTTP信息头管理器-添加JSON数据对应的信息头(名称content-Type,值applicaton/json;charset=utf-8)
  3)在http请求中的body data添加JSON报文信息
  学生管理系统增删改查优化
  可以使用 http 请求默认值抽取共同的 ip 端口号 协议 编码集 等信息
  测试计划 ----> 右击 -----> 添加 ----->配置元件 ------> http 请求默认值
  作用: 通过复用属性简化实现,提高测试效率

D、线程组高级(初始化与销毁线程组)

D-1、线程组属性
  属性1:线程数 ----- 模拟用户数
  属性2:时间值(Ramp-up Period(in seconds)) ----- 在指定时间内启动所有线程
  属性3:循环数 ---- 单个用户访问的次数,高并发或循环访问的时候可能由于服务器硬件性能的原因,会出现一些的错误率
D-2、调度器(就是个计时器,隔某个时间间隔就执行某次操作)
  1)、循环次数设置为 永远
  2)、设置启动延迟 x和持续时间y
    在 x 秒后访问服务器,并且持续 y 秒
  3)、设置启动时间 M,和 结束时间 N
    在 M 时开始访问,在 N 时结束
  注意:2 和 3 实现不能同时使用,否则矛盾了

3、Jmeter组件:参数化概述(了解)

A、是什么?

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

B 、为什么?

比如执行批量操作时,批量插入或批量删除,之前数据都是手写的,每执行完都需要修改一次,效率太低
参数化就是可以以程序代替人工获取并设置数据: 安全 + 高效

4、Jmeter组件:参数化实现之CSV Data Set Config(重点中重点)

A、是什么?

Jmeter 参数化实现组件之一

B 、为什么?

通过这个组件可以动态获取并设置数据,实现类似批量添加操作(执行一次,将多条数据插入到数据库)

C、怎么用?

C-1、实现思想


CSV实现思想.png

C-2、实现流程


CSV实现流程.png

添加CSV Data Set Config的流程:线程组-右键添加-配置元件-CSV Data Set Config
如果是用文本文档编辑的txt文件,要用gbk编码集,用Notepad++编辑的txt文件,可用utf-8编码集
D、其他

CSV Data Set Config ----- CSV 数据配置
CSV -----> 逗号分隔值文件格式

5、Jmeter 组件:线程组实现高级

测试计划-右键添加-Threads-setUp Threads Group|tearDown Threads Group
setUp 线程组 : 最先执行的线程组
        加载程序主体执行所需的资源
tearDown 线程组 : 最后执行的线程组
       程序正式关闭之前,可以将数据保存进内存




0、Jmeter组件:参数化

A、是什么?

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

B 、为什么?

参数化就是可以以程序代替人工获取并设置数据: 安全 + 高效

C、Jmeter参数化组件

CSV Data Set Config ----- CSV 数据设置组件
用户参数
用户定义的变量
函数

1、Jmeter组件:参数化之用户参数

A、需求(为什么)

向学生管理系统的学院表批量插入数据

B、实现(怎么用)

  B-1、实现思想(和 CSV 类似)
    将数据设置进第三方,然后循环读取数据,和 CSV 的区别:
    CSV 是将数据设置进外部的文本文档,而用户参数是将数据设置进 Jmeter 内置组件
  B-2、实现流程
    1)、搭框架(测试计划,设置HTTP请求默认值,设置HTTP信息头管理器,线程组,http请求_JSON,数据先不设置)
    重点:执行次数是 3 次(不是设置循环次数,而是设置线程数)
    2)、使用 Jmeter 内置组件存储要插入的数据:测试计划右键添加-前置处理器(在http请求之前执行)-用户参数

用户参数.png

    3)、读取组件中的数据设置进 Http 请求的 JSON
    格式: ${变量名}

2、Jmeter组件:参数化之用户定义的变量

A、需求(为什么)

对学生管理系统执行增删改查相关操作时,资源路径不一定相同,单都是 /api/departments/ 开头,每次都编写此路径效率偏低,怎么优化?

B、实现(怎么用)

  1)、将共同数据 /api/departments/ 使用一个组件存储
  2)、编写路径时,直接调用组件存储的值
    测试计划右键添加-配置元件-用户定义的变量
    调用的时候,写入变量名在对应的位置:${变量名}
    注意: 一般存储全局使用的变量

3、Jmeter组件:参数化之函数

A、是什么?

函数是程序中最基本的封装单元,封装了一些常用功能,比如:计数器

B、需求(为什么)

循环10次查询学生管理系统的学院信息,结果树中,每次请求信息都是一样的,需要添加标号以示区分

C、实现(怎么用)

  1)、打开Jmeter内置的函数组件
    方式1: 选项 - 函数助手对话框
    方式2: Ctrl + shift + F1
    方式3: 工具栏倒数第二个图标
  2)、选择要使用的函数, 给函数传参,用Jmeter生成调用格式
    __counter 函数的参数1: true 每个用户(用户数这里就是线程数来设置的)单独一个计数器, false 所有用户共用一个计数器
  3)、在需要调用函数的位置使用Jmeter生成的调用格式
    这里需要调用函数的位置是“路径:api/departments/?count=${__counter(TRUE, )}”
    调用格式: ${函数名(参数)}

4、Jmeter组件:四种参数化方案比较

1、CSV 和用户参数使用思想一致,流程上后者更简单,但是实际应用,使用 CSV 居多,因为数据量大时,CSV 更方便
2、 用户定义的变量一般用来存储全局变量,但是使用场景较少
3、函数实现更为灵活且 内置了好多实现
4、总结: 最常用的是 CSV + 函数

5、Jmeter组件:直连数据库

A、是什么?

让 Jmeter 直接和数据库交互

B、为什么?

通过直接操作数据库和接口操作比对
之前是通过接口操作数据库,可能出现的问题: 比如查询可能有漏查误查的情况,解决方案是人工比对,效率低且有安全隐患,解决方案:让程序代替人工

C、怎么用?

C-1、Jmeter 本身不具备直连数据库的功能,整合第三方实现
  不同的数据库对应不同的 jar 包实现
  测试计划中,点add directory or jar to classpath 浏览,导入所用数据库对应的连接jar包
C-2、配置数据库的一些连接信息
  测试计划右键添加-配置元件-JDBC Connection Configuration
  variable name: 给当前连接组件命名,请求需要使用,例如起一个“mySQLiteConfig”
  database url : 数据库路径
  数据库如不在本地,就涉及到网络上的数据传输,需要用到协议,jdbc:sqlite:...
  java中单斜杆\是转义字符,在表达路径的时候要使用“\\”
  Driver Class : 第三程序的启动入口
  username: 账号
  password: 密码

连接信息设置.png

C-3、创建取样器(JDBC Request)连接数据库
  线程组右键添加-Sampler-JDBC Request
  属性1 :调用的配置的变量名 ,“mySQLiteConfig”
  属性2 : SQL 语句的类型
     select Statement 查询
     update Statement 修改(增 删 改)
  属性3:写入需要执行的 SQL 语句
C-4、结果再处理
  就是要将 JDBC 操作的结果取出,并且传递给另外一个取样器
  怎么实现:
    1)、JDBC Request 中设置属性 variable names: 变量名
    2)、JDBC Requst 操作数据库时,会将查询的结果赋值给步骤1设置的变量
    赋值规则:由于结果可能有多个,第 N 个结果赋值给 变量名N
    变量名
# 对应结果个数
    上述规则是固定格式: 记住
    怎么查询赋值规则: 添加取样器 Debug(调试) Sampler,可以查看底层实现细节
    3)、其他取样器使用数据调用格式: ${变量名_N}

6、Jmeter组件:关联(重点)

A、是什么?

就是一个请求的结果是另一个请求提交的数据,二者不再是独立存在的

B、为什么?

为了实现多样的业务逻辑(可能由多个请求组合而成)

C、怎么用?

实现方案1:JDBC设置变量名
实现方案2: Xpath 提取器
     http请求右键添加-后置处理器(在请求完处理结果)-Xpath Extractor
     在另一个取样器里引用的时候,用上引用名称即可,例如:在另一个取样器里路径设置为/?wd=${myTitle}


Xpath 提取器设置.png

实现方案3: 正则表达式提取器
     http请求右键添加-后置处理器(在请求完处理结果)-正则表达式提取器
     在另一个取样器里引用的时候,用上引用名称即可

正则表达式提取器.png

如果从标签(html | XML)语言提取数据最好使用 Xpath 提取器,如果想要的数据是文本格式,正则表达式提取器更方便

7、Jmeter环境

A、什么是环境变量?path什么用?

系统设置之一,通过设置 PATH,可以让程序在 DOS 命令行直接启动

B、path怎么用?

如果想让一个程序可以在 DOS 直接启动,需要将该程序的目录配置进 PATH

C、PATH 和我们有什么关系?

要配置 JDK 的环境变量(开发必备的)
需求1:配置 JDK 的PATH环境变量,要求在任意目录下可以执行 javac 程序
需求2:配置Jmeter 的 PATH 环境变量
需求3:配置 Jmeter 的 lib 目录下的部分 jar 的环境变量
怎么配置?
  添加一个变量: xxxx_HOME=该程序的安装目录(一般是 bin 目录的父级)
  修改 PATH : %xxxx_HOME%\bin




1、Jmeter组件:断言(重点)

A、是什么?

程序代替人工判断响应结果是否符合预期

B、为什么?

安全、高效、功能强大

C、怎么用?

分类:
  C-1、断言响应的状态码
  C-2、断言响应的内容
  C-3、断言响应的内容的字节数
  C-4、断言响应的时间
  1)对一个请求的响应内容进行断言,所以在jmeter中是对一个http请求右键添加-断言-响应断言
  属性1:要测试的响应字段:响应代码(断言状态码)响应文本(断言响应的内容)
  属性2:模式匹配规则:默认选substring就行
  属性3:添加要测试的模式:如果是状态码,就写入状态码200,如果要包含些什么内容,就写入应该要包含的内容
  2)断言响应内容字节数,http请求右键添加-断言-size assertion
  属性1:response size field to test:如果是测试响应内容的长度,就应该选response body,(响应头response headers里面包括响应代码还有响应信息)
  属性2:size to assert:填写要断言的字节数
  3)断言响应时间,http请求右键添加-断言-断言持续时间
  属性1:断言持续时间,填写时间(毫秒),如填写10,就会判断响应时间是否会小于10毫秒,如果小于10毫秒就没问题,大于就有问题

2、Jmeter组件:集合点

A、是什么?

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

B、为什么?

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

C、怎么用?

场景:模拟 N 个用户在同一时刻查询学院信息操作 (像以往的做法,只设置线程组里面的线程数是做不到“同一时刻”这个要求的,因为始终要设置ramp-up period,在这时间段内登入N个用户)
C-1、搭建框架(测试计划、结果树、线程组、http请求)
  线程组通过线程数模拟多个用户
C-2、添加集合点组件(来实现“同一时刻”)
  http请求右键添加-定时器-Synchronizing Timer
  组件属性1Number of Simulated Users to Group by: 填写一组的用户数
  组件属性2Timeout in milliseconds: 超时时间,超过这个时间启动的用户,就不再访问服务器,只允许在超时时间内启动的用户去访问
C-3、运行查看结果
  运行流程:
  1)、启动线程 ----> 右上角可以看到启动过程中线程数的变化
  2)、所有线程启动完毕,再统一执行请求,每执行一个右上角就减1,可以看到线程启动右上角数量增加得比数量减少要慢,因为它是模拟用户聚集过程比较慢,访问的时候同一时间都去访问
  查看结果添加聚合报告:测试计划-右键添加-监听器-聚合报告


聚合报告.png

C-4、注意
  超时时间可以设置为 0 : 无限等待
  无限等待时,如果线程总数小于集合点的一组线程数,那么会挂起
  无限等待时建议 : 线程总数整除集合点的一组线程数,否则会挂起

3、Jmeter组件:函数

A、是什么?

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

B、为什么?(了解)

优点1:易读 易维护
优点2:实现功能复用

C、怎么用?

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

函数分类:
数字类
__counter() : 计数器
__random(): 随机数函数 ,包含左右临界值
__time() : 获取时间的函数
时间格式: yyyy/MM/dd HH:mm:ss == 年/月/日 时:分:秒
数据读取
__CSVRead() :和 CSV Data Set Config 类似可以读取 CSV 文件数据

需求:使用 CSVRead 函数实现学院信息的批量插入(比如: 3条)
思想:
  1)、搭建框架(线程组设置线程数),JSON 格式数据只是模板,具体数据动态获取
  注意:执行次数设置与信息头设置
  CSV Data Set Config 执行多次是使用的循环次数,而 CSVRead 执行多次使用的是线程数
  ${__ReadCSV(E:\dataSource.txt,0)}——0表示第一次读取第一行第1列,第二次读取第二行第1列,第三次读取第三行第1列
  2)、将数据存储在外部的文本文档(CSV 格式)
  3)、使用 CSVRead 函数逐行获取并解析 CSV 文件,插入到提交的 JSON 数据中
  CSVRead 函数设置 CSV文件路径时,必须得使用绝对路径,不可以使用相对路径

__setProperty() : 属性设置
__property(): 属性获取

需求:http 请求1 访问百度,将请求1响应的 title 值传递给请求2,但是两个请求不属于同一个线程组
http 请求2 访问 google /?wd=百度一下你就知道

实现思想 :
  将线程组内部的数据导出去,存储在共享空间中,其他线程组要使用数据,就从共享空间获取

实现流程:
  1)、将数据从当前线程组导出 __setProperty
    变量名
    变量值 ${变量名}
    使用 BeanShell Sampler 调用函数,把__Property的生成格式放在beanshell sampler的script里面
  2)、另外一个线程组将导出到共享空间的数据引入 __property
    根据变量名获取
    注意:
    查看共享数据,工作台 ----> 添加 -----> 非测试元件 ----> property display

4、Jmeter:分布式

A、是什么?

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

B、为什么?

安全(数据可以多台机器备份,防止一台机器挂掉就丢失数据的情况)、高效、功能强大(自己一台机器创建1000个用户,一台机器的压力太大了)

C、怎么用?

C-1、基本架构:


分布式思想.png

C-2、环境搭建:
  1) 、搭建伪分布式环境,一台设备模拟 3 台
  2)、在同一台设备开启 3 个 Jmeter 即可
    复制 3 个 Jmeter到三个不同的文件夹下,因为要同时启动然后网络间进行数据交互,修改端口号(如果不是伪分布式,就不用改端口号了,不是伪分布了,设备都不一样了,无所谓端口号了,jmeter可以监听相同的端口号)
  3)、伪分布式下配置端口号
    jmeter-bin-jmeter.properties文件-点开搜索“port”,找到server_port,去掉#注释,修改成你设置的端口号在server_port后面
    端口号设置得大一点,一般大于1024,太小了有可能被其他程序占用了
    如果控制机不设置端口号的话,程序执行的时候回自动生成一个端口号
    执行机 A,设置一个端口号: 6666
    执行机 B,设置一个端口号: 7777
    控制机要寻址执行机 ,在控制机的jmeter.properties文件中配置: remote-hosts=执行机A的IP:6666,执行机B的IP:7777
C-3、分布式测试:
  1)、执行机得启动
    双击bin\Jmeter-server.bat以无GUI的方式启动Jmeter服务
  2) 、需求:平均分配 1000 个用户分别给 执行机A 和 执行机B 执行
    控制机编写相关脚本,测试计划-线程组-线程数设置成50(或比较大的数)-创建http请求-聚合报告查看汇总结果
  3)、分配给执行机——>远程全部启动
    重启控制机的jmeter菜单栏有运行-远程启动-启动执行机A或执行机B或者远程全部启动(同时启动执行机A和B)
    这时候执行机A和执行机B都会同时执行http请求各50次




1、Jmeter组件:逻辑控制器(重点)

A、是什么?

逻辑控制器可以控制取样器的实现顺序(分支+循环)的一种组件
类似于计算机语言的流程控制语句,流程控制就是控制代码的执行顺序(分支+循环)

B、为什么?

实现多样的业务逻辑

C、怎么用?

C-1、分类
  类别1:分支控制器 ----- if控制器:符合条件就执行
  类别2:往复控制器 ----- forEach控制器 + 循环控制器:循环执行
C-2、实现

需求1:

  测试计划中三个 http 请求,分别访问百度、淘宝和京东,不是无差异的都执行,而是有选择性的执行,定义一个用户定义的变量,如果值是 百度,就访问百度,是淘宝就访问淘宝......
实现:
  1)、搭框架(测试计划,线程组,http请求,结果树)
    用户定义的变量存储变量值(百度、淘宝或京东)
    测试计划右键添加-配置元件-用户定义的变量-填写变量名和变量值,例如name,百度
  2)、添加一个分支组件,有选择性的执行 http 请求
    if 控制器: 编写条件 “${变量名}” == "指定值"
    线程组右键添加-逻辑控制器-如果(if)控制器
    然后再在这个if控制器去添加http请求
  3)、查看结果
    符合条件的执行,不符合条件不执行

需求2:

有一组关键字 [hello,python,测试] 要依次取出,并在百度搜索
实现:
  1)、搭框架(测试计划,线程组,http请求,结果树)
  2)、使用用户定义的变量存储一组数据
    这里有3个关键字,就是创建3个变量
    规则:同一变量前缀_编号
  3)、在线程组中添加一个 forEach 控制器,遍历步骤2中的数据,将数据设置进 http 请求
    forEach控制器中要设置“输入变量前缀”,索引区间,“输出变量名”
    注意索引: 左闭右开的
    在http请求中,在需要的位置添加刚才的输出变量名,例如/?wd=${变量名}
  4)、查看结果

需求3:

循环查询所有学院信息10次
  线程组右键添加-逻辑控制器-循环控制器
  然后添加循环次数,再去添加http请求就可以了
思考: 线程组属性可以控制循环次数,那么循环控制器有什么用?
  循环控制器更灵活,线程组循环是组内所有请求都循环执行,循环控制器可以只是让组内指定的请求循环

2、Jmeter组件:QPS

A、是什么?

QPS: Query Per Second ---- 每秒查询率,每秒访问服务器资源多少次
20QPS == 每秒访问20次

B、为什么?

一个用户以 20QPS 的频率访问服务器,持续10秒,查看服务器的平均响应时间?
一个用户每秒访问20次服务器,持续10秒,查看服务器的平均响应时间和错误率?

C、怎么用?

使用新的组件实现:http请求右键添加-定时器-常量吞吐定时器 Timer ----> Constant Throughput Timer(对请求设置就请求右键添加,对线程组设置就线程组右键添加)

实现流程:
  1)、搭框架(测试计划,线程组,http请求,聚合报告)
    线程组的循环次数设置: 频率乘以持续时间
  2)、添加常量吞吐定时器
    将 QPS(每秒查询数) 换算成每分钟查询数
  3)、查看聚合报告:有响应时间和错误率等数据
    throughput 显示的是每秒查询数,参考步骤2设置的值,实际执行一般围绕步骤2的值上下波动

3、Jmeter组件综合:作用域(记住)

A、是什么?

Jmeter 组件的作用范围(可以影响到哪些组件)

B、分类

第一类:以聚合报告为例,只对树形结构上自己的直接父级以及兄弟级以及子级...有效
  基本所有组件都属于第一类
第二类:逻辑控制器,只对子级有效
第三类:取样器可以不依赖任何组件存在,可以不对其他组件产生任何影响,
  取样器无作用域概念

4、Jmeter组件综合:执行顺序(记住)

A、是什么?

组件: Jmeter的内置功能,每一个功能都是一个组件
元件:元件中存储的都是性质相似的组件(就是对组件的分类管理)

B、排序
1.各元件之间的执行顺序
  1) 配置元件(config elements)      : 存储了一些程序的全局性数据
  2) 前置处理程序(Per-processors)    :取样器执行之前执行的组件,可以存储批量执行的数据
  3) 定时器(timers)                :在请求执行集合用户
  4) 取样器(Sampler)               :访问服务器
  5) 后置处理程序(Post-processors)   :处理响应的结果
  6) 断言(Assertions)              :断言结果
  7) 监听器(Listeners)             :最后执行

5、Jmeter扩展组件:图形监视器

A、是什么?

扩展组件:不是Jmeter 官方提供的,而是自己开发的组件,就是扩展组件
图形监视器:是监视服务器的如,内存、CPU、磁盘、网络等运行状态的组件实现

B、为什么?

模拟生产环境下,服务器运行状态的测试
在压力测试、性能测试、负载测试...使用该组件

C、怎么用?

C-1、实现思想
  1)、明确应用场景:
    学习期间:服务器和测试程序在个人 PC 机,工作时,测试程序可能需要远程访问服务器
    我们要测试的是服务器的运行状态
  2)、图解流程

图形监视器.png

C-2、实现流程
  1)、Jmeter本身不具备该功能,下载安装第三方实现
  2)、在服务器端安装窃听程序,在测试机端安装(整合进 Jmeter )接收程序
    窃听程序: Server_Agent,启动:双击 serverAgent.bat 使用端口号 4444
    接收程序: 复制Jmeter_Plugins_Standard 目录下的 jar包,到Jmeter\lib\ext
  3)、编写测试脚本,启动并执行
    a)、脚本线程组的循环次数设置为无限
    b)、添加接收组件: 测试计划右键添加-监听器 ----> jp@gc permon Metrics Collector
    c)、执行脚本
图形监视器2.png

    

6、Jmeter组件:FTP(了解)

A、是什么?

FTP:文件上传和下载
上传:将文件从本地上传到服务器
下载:将服务器资源下载到本地

B、为什么?

程序中常见操作,程序中必须的环境

C、怎么用?

C-1、保证服务器程序具备文件上传和下载的功能,安装一个文件上传下载服务器(FTP服务器,记住默认端口号是21,就好像http协议端口号默认80)
  点击Quick Easy FTP Server.exe 运行FTP服务器,启动FTP服务器
C-2、Jmeter内置了 FTP请求,可以通过此请求实现文件传输测试
  线程组右键添加-sampler-FTP请求
  属性中:remote file是在服务器的文件名称
  local file是客户端的文件路径和名称
  get是下载,put是上传,use binary针对MP3,MP4文件


文件上传下载服务器安装过程.png

7、Jmeter其他组件(不重要)

A、控制台:非测试元件之 property diaplay

显示系统共享数据

B、控制台:非测试元件之 HTTP mirror server

内置服务器

C、TestFragment:测试片段

测试计划右键添加-Test Fragment-test fragment,里面可以封装一些请求
C-1、作用和函数类似,可以封装某些功能
C-2、执行也和函数类似,不调用不执行
C-3、调用方式1:线程组右键添加-逻辑控制器-模块控制器-选择你要的test fragment
   调用方式2: 线程组右键添加-逻辑控制器-include Controller-选择整个测试计划文件

8、Jmeter项目准备:接口清单提取与整理

A、接口清单组成

功能模块,每个功能又有三要素: URL + 提交的数据 + 响应的数据

B、API文档

Application Programming Interface 应用程序编程接口,此文档中声明了
程序的功能,以及该功能描述以及访问的资源路径和提交响应的数据,是开发和测试共同遵守的文档说明

C、接口清单就是从 API 文档提取整理的

因为 API 文档内容冗余,测试需要从中提取,测试需要的关键信息

D、怎么写 API 文档

API文档其实描述项目中的功能,现在建议遵守RESTful风格
1)、描述性文本尽量占到50%及以上
2)、格式清晰,规范,风格统一
3)、业务逻辑设计时,全面,合理

E、怎么提取接口清单?

围绕三要素提取功能实现
从API文档去找到功能,再找到功能对应的url,提交数据,响应数据




1、项目:功能测试(重点)

A、是什么?

测试系统中各个接口基本功能是否能够正常运行,提交的数据:正向 + 逆向(正常的数据+不正常的数据)

B、为什么?

要模拟用户的多样性操作,检测程序的响应是否合情合理(符合预期)

C、怎么用?

C-1、搭建功能测试框架(CSV 必须)
  测试计划-线程组,结果树,HTTP信息头,HTTP请求默认值都要设置
  1)、将数据存入外部文档文件
  2)、添加组件读取文档(CSV Data Set Config)
  3)、JSON 数据以固定格式引入步骤2读取的数据
C-2、设计测试用例(将用户的操作进行分类)
  分类原则:正向 + 逆向(重点)

1. 覆盖所有的必选参数(正向)
2. 组合可选参数(正向_覆盖率问题,不是越高越好,当可选字段太多,就可以随机取样,组合数据提交,考虑人力和时间成本)
3. 参数边界值(逆向_ 比如年龄边界)
4. 如果参数的取值范围是枚举变量,需要覆盖所有枚举值(测试所有可能的数据)    
5. 空数据(逆向_不录入数据)
6. 包含特殊的字符(空格,+-=/....)
7. 越界的数据(逆向_比如长度过长或过短)
8. 错误的数据(逆向_比如错误的手机号、身份证号、重复的id....)    

实现模板:

测试用例.png

C-3、参数化覆盖测试用例
  按照测试用例编写测试数据
参数化覆盖测试用例.png

总结:
测试用例是在设计测试时使用什么类型的数据,就是预设条件以及预期结果 ---- 大纲
参数化覆盖测试用例声明使用什么样的数据(具体的),按照测试用例实现的 ---- 细节

2、项目:自动化测试

A、是什么?

由程序生成测试数据且让程序代替人工判断响应结果,就是自动化测试(程序代替人工)

B、为什么?

安全、高效、功能强大

C、怎么用?

C-1、自动化测试原则
  1)、测试程序的主要功能以及一些经常被复用的功能,并非所有功能
    自动化测试是对功能测试的补充,应用场景:程序升级时,拓展了一些功能,可能要测试之前的功能是否可用
  2)、自动化测试测试数据一般只考虑正向数据
    因为自动化测试是对功能测试的补充 + 程序生成多样的测试数据有困难
  3)、自动化测试完毕,数据库数据必须恢复成测试之前的状态,优点:重复使用,功能测试不具备这个优点
  4) 、线程组之间不要有关联,不要有业务逻辑,优点:可以单独测试某一个功能

C-2、实现流程
  1)、搭建框架(测试计划,线程组,结果树,抽取 http请求默认值、http信息头管理器、结果树)
  2)、setUp 和 tearDown 线程组
    setUp里负责新增数据的http请求,提交的数据可以是统一前缀counter计数器,然后加个响应断言
    tearDown里负责根据setUp传过来的id值把对应数据删除
    之后的修改数据和查询数据的请求就可以放在setUp和tearDown线程组外的线程组里面,对setUp里面新增的数据进行修改和查询,在别的线程组用property函数获取到这个数据
  3)、数据生成可以借助于 counter 函数,数据格式:自定义前缀_调用计数器函数
  4)、使用断言组件让程序代替人工判断响应结果,可以在每个请求后面都加一个响应断言
  5)、跨线程组传值
    思想:setUp 将数据导出到共享空间,tear down 再将数据引入
    流程: 1)、setUp 要使用 setProperty 导出数据
        怎么获取要导出的 id?使用正则表达式提取器
      2)、tearDown 使用 property 函数引入数据
  6)、普通线程组结合 setUp 和 teardown 使用时的执行顺序:
     多个普通线程组可能并发执行
  7)、直连数据库
    a、Jmeter本身不具备数据连接功能,整合第三方实现
    b、配置数据库连接信息
     变量名 + 数据库路径 + 第三方的启动入口 + 账号密码
    c、使用 JDBC Request 操作数据库数据
     SQL语句有类型: select statement | update statement
     variable names: 查询的结果赋值给的变量名
    d、将数据传递给 http 请求
     结果的赋值规则:变量名_# 结果个数 | 变量名_N 第N个结果
     可以通过 debug sampler 查看底层赋值规则

3、项目:性能压力测试

A、是什么?

模拟多种场景测试程序的响应时间,出错率,服务器运行状态....等实现

B、为什么?

测试程序的执行效率,执行效率直接关系到用体验

C、怎么用?

C-1、原则

1. 参数化:参数化尽量避免采用从外部读取参数,使用固定参数+函数形式
          ( 如:${__counter(TRUE,)}),这是出于性能考虑
2. 察看结果树:必须清除单个接口内察看结果树
             (如不去掉,非常占用测试机自身性能),在测试计划下添加一个察看结果树  
3. 报告:性能报告可根据实际需求选择,建议保留添加聚合报告  
4. 线程组:增删改查每一个功能点,都需建立单独线程组,而避免在同一个线程组内添加
           多个HTTP请求完成增删改查(以便参数化对单个请求做压测和并发)
5. 分布式:如并发数量大,采用分布式测试
6. 新增/删除:新增和删除接口建议不要采用时间模式(定时器:常量吞吐定时器(模拟高频次,
             一秒访问多次),集合点(模拟高并发,同一时刻很多用户访问))来压测,
             直接使用线程数和循环

C-2、模拟300秒内开启100个虚拟用户,每个用户循环访问服务器资源10次,要求平均响应时间在 30 ms内,且错误率为0
  区间时间300秒:使用线程组的ramp-up period 属性指定
  100个用户:使用线程数指定
  循环10次:循环次数
  结果查询:使用聚合报告
C-3、模拟 100 个用户同时访问服务器资源,要求平均响应时间在30ms内,且错误率为0
  100个用户:使用线程数指定
  同时访问:集合点
C-4、模拟100个用户都以20QPS的频率访问服务器资源,持续10s,要求平均响应时间在30ms内,且错误率为0
  100个用户:使用线程数指定
  循环次数:QPS*持续时间
  QPS设置:定时器的常量吞吐定时器

4、项目:生成 html 格式测试报告

A、是什么?

以html文档结合饼状图的方式显示测试结果

B、为什么?

因为性能相关测试取样结果比较庞大,那么使用html文档显示更友好更直观

C、怎么用?

格式1:DOS命令行下执行测试脚本生成html格式的测试报告
  Jmeter -n -t 脚本文件 -l 日志文件 -e -o 指定目录
    例如:在测试脚本的目录下运行cmd,
       输入“Jmeter -n -t 测试计划_性能测试.jmx -l test.txt -e -o ./outHtml”
    -n 无图形化界面执行
    -t 脚本文件
    -l 日志
    -e 生成
    -o 输出
  注意1:日志文件和输出目录不可以有内容
  注意2:日志文件后缀只能有三种情况:.jtl,.txt,无后缀

格式2:先使用Jmeter运行测试脚本生成日志文件,再将日志文件转换成html格式测试报告
  在聚合报告中,点浏览把数据写入一个txt文件中,如test.txt
  在test.txt文件所在目录下运行cmd,输入命令:
    “Jmeter -g 日志文件 -o 指定目录”
    -g 关联日志文件
    -o 输出

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343