httpRunner测试框架

目录

一、简述

1 、设计理念

2 、核心特性

二、安装部署

1、安装下载

2、配置

3、检查安装结果

三、项目实战

1、脚手架创建项目:

2、yaml文件:作为测试脚本文件

1)、yaml文件的语法特点

2)、yaml支持的数据结构

3、.env文件

4、变量 Variables

5、参数提取

6、自定义函数: debugtalk.py文件

7、参数化驱动

8、结果校验

9、运行接口测试

10、运行性能测试


前情提要:来自官方文档  https://httprunner.com/docs/introduction/

一、简述

HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型。简单易用,功能强大,具有丰富的插件化机制和高度的可扩展能力

1 、设计理念

  • 约定大于配置:测试用例是标准结构化的,格式统一,方便协作和维护
  • 标准开放:基于开放的标准,支持与 HAR/Postman/Swagger/Curl/JMeter 等工具对接,轻松实现用例生成和转换
  • 一次投入多维复用:一套脚本可同时支持接口自动化测试、性能测试、数字体验监测等多种 API 测试需求
  • 融入最佳工程实践:不仅仅是一款测试工具,在功能中融入最佳工程实践,实现面向网络协议的一站式测试解决方案

2 、核心特性

  • 网络协议:完整支持 HTTP(S)/1.1 和 HTTP/2,可扩展支持 WebSocket/TCP/RPC 等更多协议
  • 多格式可选:测试用例支持 YAML/JSON/go test/pytest 格式,并且支持格式互相转换
  • 双执行引擎:同时支持 golang/python 两个执行引擎,兼具 go 的高性能和 pytest 的丰富生态
  • 录制 & 生成:可使用 HAR/Postman/Swagger/curl 等生成测试用例;基于链式调用的方法提示也可快速编写测试用例
  • 复杂场景:基于 variables/extract/validate/hooks 机制可以方便地创建任意复杂的测试场景
  • 插件化机制:内置丰富的函数库,同时可以基于主流编程语言(go/python/java)编写自定义函数轻松实现更多能力
  • 性能测试:无需额外工作即可实现压力测试;单机可轻松支撑 1w+ VUM,结合分布式负载能力可实现海量发压
  • 网络性能采集:在场景化接口测试的基础上,可额外采集网络链路性能指标(DNS 解析、TCP 连接、SSL 握手、网络传输等)
  • 一键部署:采用二进制命令行工具分发,无需环境依赖,一条命令即可在 macOS/Linux/Windows 快速完成安装部署

二、安装部署

1、安装下载

Linux/macOS 系统,使用shell命令快速安装:

$ bash -c "$(curl -ksSL https://httprunner.com/script/install.sh)"

windows建议去官网下载:Releases · httprunner/httprunner · GitHub

下载后的tar.gz文件手动改为zip格式并解压

2、配置

  • 在 C 盘根目录下创建 HttpRunner 目录(自定义目录),将 hrp.exe 文件放在该目录下
  • 在「我的电脑=>属性=>高级系统设置=>环境变量」配置中,在 PATH 下新增系统变量,将 C:\\HttpRunner 写入 PATH

3、检查安装结果

安装成功后,你将获得一个 hrp 命令行工具,执行 hrp -h 即可查看到参数帮助说明


██╗  ██╗████████╗████████╗██████╗ ██████╗ ██╗   ██╗███╗   ██╗███╗   ██╗███████╗██████╗
██║  ██║╚══██╔══╝╚══██╔══╝██╔══██╗██╔══██╗██║   ██║████╗  ██║████╗  ██║██╔════╝██╔══██╗
███████║   ██║      ██║   ██████╔╝██████╔╝██║   ██║██╔██╗ ██║██╔██╗ ██║█████╗  ██████╔╝
██╔══██║   ██║      ██║   ██╔═══╝ ██╔══██╗██║   ██║██║╚██╗██║██║╚██╗██║██╔══╝  ██╔══██╗
██║  ██║   ██║      ██║   ██║     ██║  ██║╚██████╔╝██║ ╚████║██║ ╚████║███████╗██║  ██║
╚═╝  ╚═╝   ╚═╝      ╚═╝   ╚═╝     ╚═╝  ╚═╝ ╚═════╝ ╚═╝  ╚═══╝╚═╝  ╚═══╝╚══════╝╚═╝  ╚═╝

HttpRunner is an open source API testing tool that supports HTTP(S)/HTTP2/WebSocket/RPC
network protocols, covering API testing, performance testing and digital experience
monitoring (DEM) test types. Enjoy! ✨  ✨

License: Apache-2.0
Website: https://httprunner.com
Github: https://github.com/httprunner/httprunner
Copyright 2017 debugtalk

Usage:
  hrp [command]

Available Commands:
  boom         run load test with boomer
  build        build plugin for testing
  completion   generate the autocompletion script for the specified shell
  convert      convert to JSON/YAML/gotest/pytest testcases
  curl         run integrated curl command
  dns          DNS resolution for different source and record types
  help         Help about any command
  ping         run integrated ping command
  pytest       run API test with pytest
  run          run API test with go engine
  startproject create a scaffold project
  traceroute   run integrated traceroute command
  wiki         visit https://httprunner.com

Flags:
  -h, --help               help for hrp
      --log-json           set log to json format
  -l, --log-level string   set log level (default "INFO")
      --venv string        specify python3 venv path
  -v, --version            version for hrp

Use "hrp [command] --help" for more information about a command.

参数说明

  • hrp boom - 使用 boomer 运行负载测试
  • hrp build - 用于测试的构建插件
  • hrp convert - 转换为 JSON/YAML/gotest/pytest 测试用例
  • hrp curl - 运行集成的 curl 命令
  • hrp dns - 不同源和记录类型的 DNS 解析
  • hrp ping - 运行集成 ping 命令
  • hrp pytest - 使用 pytest 运行 API 测试
  • hrp run - 使用 go 引擎运行 API 测试
  • hrp startproject - 创建一个脚手架项目
  • hrp traceroute - 运行集成的 traceroute 命令
  • hrp wiki - 访问https://httprunner.com

三、项目实战

1、脚手架创建项目:

hrp startproject demo

创建项目成功后,默认生成如下目录:

httpRunner测试框架_第1张图片

 testcases 文件夹中包含了多个示例测试用例,以下为requests.yml示例文件:

httpRunner测试框架_第2张图片

  • config:测试用例的公共配置部分,包括用例名称、base_url、参数化数据源、是否开启 SSL 校验等
  • teststeps:有序步骤的集合;采用了 go interface 的设计理念,支持进行任意协议和测试类型的拓展(甚至包括 UI 自动化),每个 step 都是一个 HTTP 请求
  • 变量引用:约定通过 ${} 或 $ 的形式来引用变量,例如 $foo1 或 ${foo1}
  • 函数调用:约定通过 ${} 的形式来调用插件函数,例如 ${sum_two(1, 2)}

2、yaml文件:作为测试脚本文件

1)、yaml文件的语法特点

  • 大小写敏感
  • 使用缩进标识层级关系
  • 缩进不允许使用tab键,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左右对齐即可
  • # 表示注释

2)、yaml支持的数据结构

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)。使用冒号结构标识key: value,注意,冒号后面要加一个空格
# 写法1
key: value

# 写法2
key: {key1: value1,key2: value2}

# 写法3,使用缩进标识层级关系
key:
  key1: value1
  key2: value2

  • 数组:一组按次序排序的值,又称为(sequence) / 列表(list)。以- 开头的行表示构成一个数组
color:
  - red
  - blue
  - green

# 也可以采用行内表示法
color: [red,blue,green]
  • 纯量(scalars):单个的、不可再分的值
1 字符串 布尔值 整数 浮点数 Null
2 时间日期

数值直接以字面量的形式表示
number: 20.9

布尔值用true和false表示
isRight: true

null用 ~ 表示
variable: ~

YAML 可使用两个感叹号,强制转换数据类型
e: !!str 123
f: !!str true

3、.env文件

存放设置的全局变量参数及参数值,引用方式为: ${ENV(参数名)}

# .env文件
base_url=https://postman-echo.com

# xx.yml文件引用
- config: 
    name: "引用.env文件传递参数"
    base_url: ${ENV(base_url)}

4、变量 Variables

  • 全局变量 (config variables):在 config 下声明的 variables,作用域为整个测试用例
  • 数据驱动(parameters):在 config 下声明的 parameters 为测试用例的驱动参数;它的作用域也是覆盖整个测试用例
  • 局部变量(teststeps variables ):在单个测试步骤(teststep)下声明的 variables,作用域仅限当前步骤
  • 提取参数变量(session variables):在某个测试步骤(teststep)中提取(extract)特定的响应参数并赋值给变量,作用域为当前步骤之后的步骤

变量优先级:step variables > session variables > parameter variables > config variables

5、参数提取

1)、若响应结果为 JSON 结构,支持采用 jmespath 表达式进行参数提取:

{
  "locations": [
    {"name": "Seattle", "state": "WA"},
    {"name": "New York", "state": "NY"},
    {"name": "Bellevue", "state": "WA"},
    {"name": "Olympia", "state": "WA"}
  ]
}
  • 查询所有城市名称:locations[*].name
  • 查询第2个城市名称:locations[1].name
  • 查询最后一个城市名称:locations[-1].name

参数提取类型:

  • status_code:提取响应状态码,例如 200、404
  • proto:提取协议类型,例如 “HTTP/2.0”、“HTTP/1.1”
  • headers:从响应 headers 中提取字段,例如 headers.name
  • cookies:从响应 cookies 中提取字段,例如 cookies.Token
  • body:从响应 body 中提取字段,例如 body.args.foo1

注意:如果表达式中存在 - 的情况,那么需要加引号处理。例如 headers."Content-Type"

2)、正则表达式提取

若响应结果为 text/html 格式,支持采用正则表达式的方式提取目标参数

如响应的body为:


参数提取(extract) | HttpRunner

想提取页面的 title 字段,就可以这样做:

extract:
  title: "(.*)"

6、自定义函数: debugtalk.py文件

函数的申明定义在项目根目录的 debugtalk.py 中,基于「约定大于配置」的设计理念,我们无需在测试用例中进行配置

mport funppy


def get_httprunner_version():
    return "v4.0.0-alpha"


def sum_two_int(a: int, b: int) -> int:
    return a + b


if __name__ == '__main__':
    funppy.register("get_httprunner_version", get_httprunner_version)
    funppy.register("sum_two", sum_two_int)
    funppy.serve()

在 debugtalk.py 中,我们可以编写实现任意自定义逻辑的函数,只需通过 funppy 进行 register 和 serve() 即可。 测试用例中,使用${函数}引用debugtalk中的函数

7、参数化驱动

parameters(支持 3 种输入方式)

1)、参数列表,如下:

httpRunner测试框架_第3张图片

2)、csv文件

httpRunner测试框架_第4张图片

3)、 自定义函数,形如:user_id: ${get_user_id(10)},函数返回值为列表

8、结果校验

内置结果校验函数

assert Description A(check), B(expect)
eqequalsequal 判断实际结果=预期结果 A == B
ltless_than 判断实际结果<预期结果 A < B
leless_or_equals 判断实际结果<=预期结果 A <= B
gtgreater_than 判断实际结果>预期结果 A > B
gegreater_or_equals 判断实际结果>=预期结果 A >= B
nenot_equal 判断实际结果不等于预期结果 A != B
str_eqstring_equals 判断转成字符串后,实际结果=预期结果 str(A) == str(B)
len_eqlength_equalslength_equal 判断实际结果的长度=预期结果 len(A) == B
len_gtcount_gtlength_greater_than 判断实际结果的长度>预期结果 len(A) > B
len_gecount_gelength_greater_or_equals 判断实际结果的长度>=预期结果 len(A) >= B
len_ltcount_ltlength_less_than 判断实际结果的长度<预期结果 len(A) < B
len_lecount_lelength_less_or_equals 判断实际结果的长度<=预期结果 len(A) <= B
contains 判断实际结果是否包含预期结果 [1, 2] contains 1
contained_by 判断预期结果是否包含实际结果 A in B
type_match 判断预期结果和实际结果数据类型是否一致 type(A) == type(B)

9、运行接口测试

通过 hrp run 命令即可执行指定的测试用例;如需生成 HTML 测试报告,可附带 --gen-html-report 参数

hrp run demo/testcases/requests.yml demo/testcases/ref_testcase.yml --gen-html-report

在执行目录下,生成report文件夹,打开查看报告

httpRunner测试框架_第5张图片

10、运行性能测试

通过 hrp boom 命令运行性能测试;通过 --spawn-count 参数可指定并发用户数,通过 --spawn-rate 可指定起始发压斜率

hrp boom testcases/requests.yml --spawn-count 20 --spawn-rate 2

在压测运行过程中,每隔 3 秒打印一次性能汇总数据;通过 CTRL + C 终止测试后,会打印整个压测过程的汇总数据(Statistics Summary)。

C:\Project>hrp boom demo/testcases/requests.yml --spawn-count 20 --spawn-rate 2
2:39PM INF Set log to color console other than JSON format.
2:39PM WRN windows does not support setting ulimit
2:39PM ??? Set log level
Current time: 2022/09/20 14:39:56, Users: 6, State: stopping, Total RPS: 3.0, Total Average Response Time: 678.7ms, Total Fail Ratio: 0.0%
Accumulated Transactions: 1 Passed, 0 Failed
+--------------+-----------------+------------+---------+--------+---------+------+------+--------------+------------+-------------+
|     TYPE     |      NAME       | # REQUESTS | # FAILS | MEDIAN | AVERAGE | MIN  | MAX  | CONTENT SIZE | # REQS/SEC | # FAILS/SEC |
+--------------+-----------------+------------+---------+--------+---------+------+------+--------------+------------+-------------+
| request-GET  | get with params |          4 |       0 |    640 |  725.00 |  590 |  912 |          397 |       1.33 |        0.00 |
| request-POST | post form data  |          1 |       0 |    690 |  692.00 |  692 |  692 |          576 |       0.33 |        0.00 |
| request-POST | post raw text   |          2 |       0 |    460 |  579.50 |  461 |  698 |          534 |       0.67 |        0.00 |
| transaction  | Action          |          1 |       0 |   2100 | 2080.00 | 2080 | 2080 |            0 |       0.33 |        0.00 |
+--------------+-----------------+------------+---------+--------+---------+------+------+--------------+------------+-------------+

2:39PM WRN runner has stopped; skipping GoAttach
Current time: 2022/09/20 14:39:59, Users: 1, State: stopped, Total RPS: 5.6, Total Average Response Time: 541.4ms, Total Fail Ratio: 0.0%
Accumulated Transactions: 6 Passed, 0 Failed
+--------------+-----------------+------------+---------+--------+---------+------+------+--------------+------------+-------------+
|     TYPE     |      NAME       | # REQUESTS | # FAILS | MEDIAN | AVERAGE | MIN  | MAX  | CONTENT SIZE | # REQS/SEC | # FAILS/SEC |
+--------------+-----------------+------------+---------+--------+---------+------+------+--------------+------------+-------------+
| request-GET  | get with params |          2 |       0 |    680 |  682.50 |  675 |  690 |          450 |       0.67 |        0.00 |
| request-POST | post raw text   |          4 |       0 |    230 |  453.75 |  225 |  904 |          535 |       1.33 |        0.00 |
| request-POST | post form data  |          5 |       0 |    230 |  362.80 |  226 |  684 |          571 |       1.67 |        0.00 |
| transaction  | Action          |          5 |       0 |   1500 | 1542.60 | 1137 | 2024 |            0 |       1.67 |        0.00 |
+--------------+-----------------+------------+---------+--------+---------+------+------+--------------+------------+-------------+

=========================================== Statistics Summary ==========================================
Current time: 2022/09/20 14:39:59, Users: 1, Duration: 3.217s, Accumulated Transactions: 6 Passed, 0 Failed
+-------+------------+---------+--------+---------+-----+-----+--------------+------------+-------------+
| NAME  | # REQUESTS | # FAILS | MEDIAN | AVERAGE | MIN | MAX | CONTENT SIZE | # REQS/SEC | # FAILS/SEC |
+-------+------------+---------+--------+---------+-----+-----+--------------+------------+-------------+
| Total |         18 |       0 |    590 |  541.39 | 225 | 912 |          507 |       5.60 |        0.00 |
+-------+------------+---------+--------+---------+-----+-----+--------------+------------+-------------+

你可能感兴趣的:(python接口自动化,python,自动化)