Django实现接口自动化平台(五)httprunner(4.x)介绍【持续更新中】

news2024/12/22 22:16:49

上一章:

Django实现接口自动化平台(四)解决跨域问题【持续更新中】_做测试的喵酱的博客-CSDN博客

下一章:

一、httpruner介绍

1.1 背景:

之所以学习httpruner的用法,是要把httpruner嵌入我们的自动化平台,来实现接口自动化。

官方文档:

📚 用户指南 | HttpRunner

整体概览 | HttpRunner

HttpRunner V3.x Docs

1.x 2.x 使用的是unittest

3.x使用的是unitest

1.2  v4版本 介绍

开发语言:Golang + Python

脚本转换工具:HAR/Postman/Swagger/Curl

脚本格式类型:YAML/JSON/pytest/gotest

脚本执行引擎:Go 自研 + Python pytest

接口测试报告:html 自研(Go template) + pytest-html/allure

性能测试引擎:Go Boomer

运行环境依赖:Go 引擎无需依赖、pytest 引擎依赖 Python 3.7+

安装部署方式: curl/wget

1.3 v4 版本的 Go & Python 功能对比

HttpRunner v4.0 同时采用了 Golang/Python 两种编程语言,底层会有两套相对独立的执行引擎,目标是兼具 Golang 的高性能和 pytest 的丰富生态。

关键差异点对比如下:

引擎GoPython
脚本类型YAML/JSON/gotestYAML/JSON/pytest
网络协议多协议 HTTP(S)/HTTP2/WebSocket/TCP/RPCHTTP(S)
脚手架工具hrp startproject/
用例生成工具hrp har2case/
脚本转换工具hrp convert/
插件化语言多语言(Go/Python/Java/etc.Python
运行环境依赖与插件语言相关,详见依赖环境说明Python 3.7+
脚本编写语法提示gotest 链式调用pytest 链式调用
运行接口测试hrp runhrp pytest
运行性能测试hrp boom/
网络性能采集hrp run –http-stat/
接口测试报告html 自研(Go template)pytest-html/allure

其他:

我自己写了一个接口自动化框架,实现思路与httpruner 差不多,敢兴趣的小伙伴可以瞅瞅。

pytest+yml+allure实现接口自动化框架(终版)_pytest+allure接口自动化_做测试的喵酱的博客-CSDN博客

httpruner最大的特点,不是创新,而是整合。将各个框架的优点,整合到了一起。

1.4 设计理念

相比于其它 API 测试工具,HttpRunner 最大的不同在于设计理念。

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

1.5 核心特性

  • 网络协议:完整支持 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 快速完成安装部署

二、httpruner 安装

HttpRunner v4 采用 Golang 开发,相比于之前的 Python 版本,最大的一个优势是可以编译生成二进制文件。在目标系统只需要下载到对应系统环境的二进制文件即可运行,无需安装任何运行时环境依赖(例如 Python、Java JDK、NodeJS 等)。

当前 HttpRunner v4 支持如下几种安装方式。

2.1 一键部署(推荐)

为了加速二进制包的下载速度,我们已经将编译产物上传到了阿里云 OSS,并且提供了一键安装部署的脚本。只需执行一条 shell 命令,即可完成 hrp 的下载和安装操作。

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

注意:install.sh 脚本内部依赖 curl/tar/mktemp/ls/rm/uname/chmod/command 命令行工具,大多数 Linux/macOS 系统都会预置,如果你的系统中存在缺失,需自行解决。

针对 Windows 系统,上述脚本较大概率无法正常运行,建议自行下载编译产物后进行配置。

 

2.1.1 报错处理: 

1、因为没有权限,导致安装失败,使用sudo 命令安装

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

2.2 下载编译产物

同时,你也可以在 GitHub Releases 页面中,自行选择版本进行下载。

当前 HttpRunner v4 在每次发布版本时,会自动编译生成 5 个版本,覆盖的环境包括:

  • macOS(darwin) + amd64(x86)
  • macOS(darwin) + arm64(M1)
  • linux + amd64(x86)
  • linux + arm64
  • windows + amd64(x86)

获取到编译产物(.tar.gz 格式)后,对压缩包进行解压:

$ tar -xzf hrp-xxx.tar.gz

解压后可以获得一个 hrp 二进制文件,你只需给 hrp 添加可运行权限即可。

$ chmod +x hrp

同时为了让 hrp 在系统中可以全局调用,推荐将 hrp 添加到系统环境变量的 PATH 路径中,

针对 Linux/macOS 系统,推荐将 hrp 移动到系统 /usr/local/bin 目录。

$ mv hrp /usr/local/bin/

针对 Windows 系统:

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

如果你的环境为 MinGW64,根据用户反馈,下载 windows-amd64 版本也是可以使用的。

2.3 自行本地编译

如果在上述已有的编译产物中没有包含你的系统类型,那么你可以自行拉取源码进行编译。

# 拉取 hrp 源码
$ git clone https://github.com/httprunner/httprunner.git
$ cd httprunner
# 通过 make 进行一键编译,生成的产物在 output 文件夹中
$ make build
[info] build hrp cli tool
++ mkdir -p output
++ bin_path=output/hrp
++ go build -ldflags '-s -w' -o output/hrp hrp/cmd/cli/main.go
++ ls -lh output/hrp
-rwxr-xr-x  1 debugtalk  staff    20M Apr 10 18:18 output/hrp
++ chmod +x output/hrp
++ ./output/hrp -v
hrp version v4.0.0-alpha

2.4 go install 安装

如果你的系统有 Golang 环境,那么也可以通过 go install 命令从 GitHub 仓库中拉取代码进行安装。

指定版本号(v4.x.y)进行安装:

$ go install github.com/httprunner/httprunner/v4/hrp/cmd/cli@v4.x.y

如果你期望使用最新的代码进行安装,可以指定 master 分支进行安装:

$ go install github.com/httprunner/httprunner/v4/hrp/cmd/cli@master

2.5 检查安装结果

完成安装操作后,你将获得一个 hrp 命令行工具。hrp 包含多个子命令,具体的使用方式可查看命令行帮助。

在你的命令行终端中执行 hrp -h 命令,如果能正常打印帮助信息,则说明 hrp 已安装成功。

zhaohui@zhaohuideMacBook-Pro ~ % 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:
  adb          simple utils for android device management
  boom         run load test with boomer
  build        build plugin for testing
  completion   Generate the autocompletion script for the specified shell
  convert      convert multiple source format to HttpRunner JSON/YAML/gotest/pytest cases
  dns          DNS resolution for different source and record types
  help         Help about any command
  ios          simple utils for ios device management
  ping         run integrated ping command
  pytest       run API test with pytest
  run          run API test with go engine
  startproject create a scaffold project
  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.

三、脚手架创建项目

3.1选择 go 插件

$ hrp startproject demo --go

3.2 选择 python 插件

在终端中,执行以下命令

$ hrp startproject demo --py

3.2.1 问题处理

1、执行创建命令,在终端中长时间卡着进度没有增加。因为在下载依赖

2、安装报错,提示权限不够

$ hrp startproject demo --py

 报错信息:

11:37AM INF exec command cmd="/Users/zhaohui/.hrp/venv/bin/python3 -m pip install --upgrade funppy==v0.5.0 --index-url https://pypi.org/simple --quiet --disable-pip-version-check"
ERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Users/zhaohui/.hrp/venv/lib/python3.7/site-packages/grpc/__init__.py'
Consider using the `--user` option or check the permissions.

解决办法:使用sudo创建

$ sudo hrp startproject demo --py

3、sudo 安装报错

 报错信息:

11:41AM INF exec command cmd="/Users/zhaohui/.hrp/venv/bin/python3 -m pip install --upgrade httprunner==v4.3.0 --index-url https://pypi.org/simple --quiet --disable-pip-version-check"
WARNING: The directory '/Users/zhaohui/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
WARNING: The directory '/Users/zhaohui/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

解决办法:使用sudo -H 安装

sudo -H hrp startproject study_hrp --py

3.2.2 创建项目成功提示

创建项目成功提示

3.3忽略插件

$ hrp startproject demo --ignore-plugin

举例:

 hrp startproject miao_hrp --py

四、编写测试用例

4.1录制生成 HAR 文件


基于 HAR 生成测试用例

4.1.1 什么是 HAR 格式

以下内容来自维基百科关于 HAR 格式的介绍

HTTP 存档格式(HTTP Archive format,简称 HAR)是一种 JSON 格式的存档文件格式,多用于记录网页浏览器与网站的交互过程。文件扩展名通常为 .har。

HAR 格式的规范定义了一个 HTTP 事务的存档格式,可用于网页浏览器导出加载网页时的详细性能数据。此格式的规范由万维网联盟(W3C)的 Web 性能工作组制作,截至2016年3月是一份规范草案。

4.1.2 录制 HAR 文件

采用 Charles 等抓包工具,以及 Chrome 等浏览器均可以导出 HAR 格式的文件,具体方式可以参考如下流程:

4.1.3 Charles 录制 HAR 文件

Charles 录制 HAR 分为如下两步:

  • 步骤一:在抓取到的会话(Session)上右击选择 Export Session...

  • 步骤二:导出格式选择 HTTP Archive (.har) 来导出为 HAR 文件

4.1.4 Chrome 录制 HAR 文件

Chrome 录制 HAR 文件可以通过如下两种方法:

  • 方法一:点击按钮导出 HAR 文件
  • 方法二:在请求列表空白处右击,选择以 HAR 格式保存所有内容

4.2 转换生成测试用例


使用主流 API 工具转换生成测试用例。

在 v4.0 版本中,HttpRunner 将实现一套更为灵活的测试用例转换机制,并且将所有的转换功能都集中在 hrp convert 一个指令中。用户可以通过指定选项将将输入转换为各种类型的测试用例。

HttpRunner 的转换功能将不仅仅局限于支持 Postman、Swagger 等工具导出的工程文件到 HttpRunner 测试用例的转换,

还会支持 curl、Apache ab 等指令到测试用例的转换,甚至是会支持测试用例的不同形态之间的相互转换。

本文将介绍 HttpRunner v4.0 用例转换功能的基本使用方式以及注意事项,从而可以方便用户快速上手。此外,为了帮助大家更好地理解用例转换的原理,本文还会介绍 hrp convert 指令转换过程的具体流程,最后会介绍 hrp convert 指令当前的开发进度。

4.2.1 查看帮助文档

通过执行 hrp convert -h 可以查询该指令的功能简介、用法和各个选项的介绍:

$ hrp convert -h
convert to JSON/YAML/gotest/pytest testcases

Usage:
  hrp convert $path... [flags]

Flags:
  -h, --help                help for convert
  -d, --output-dir string   specify output directory, default to the same dir with har file
  -p, --profile string      specify profile path to override headers (except for auto-generated headers) and cookies
      --to-gotest           convert to gotest scripts (TODO)
      --to-json             convert to JSON scripts (default true)
      --to-pytest           convert to pytest scripts
      --to-yaml             convert to YAML scripts

Global Flags:
      --log-json           set log to json format
  -l, --log-level string   set log level (default "INFO")

hrp convert 各个选项的详细说明和使用示例如下:

4.2.2 指定输出类型

--to-json/--to-yaml/--to-gotest/--to-pytest 用于将输入转化为对应目标形态的测试用例,四个选项中最多只能指定一个。

例如,将输入的 HAR 文件转换为 pytest 测试用例:

# 将输入的 demo.har 转换为 pytest 测试用例 demo_test.py
$ hrp convert demo.har --to-pytest

如果不指定该选项,则默认会将输入转换为 JSON 形态的测试用例,例如:

# 默认会将输入的 demo.har 转换为 JSON 测试用例 demo_test.json
$ hrp convert demo.har

其他:

我转换报错了,但是没找到原因。

4.2.3 指定输出目录

--output-dir 后接测试用例的期望输出目录的路径,用于将转换生成的测试用例输出到对应的文件夹,需要注意该路径必须是存在且合法的,例如:

# 创建输出目录
$ mkdir -p testcase/from/postman

# 将输入的 postman_collection.json 转换为 YAML 测试用例 postman_collection_test.yaml,并导出到 testcase/from/postman 目录下
$ hrp convert postman_collection.json --to-yaml --output-dir testcase/from/postman

指定全局修改配置文件

--profile 后接 profile 配置文件的路径,该文件的后缀可以为 .json/.yaml/.yml,其作用是在转换过程中对测试用例的各个步骤进行全局修改,目前支持修改输入中的 Headers 和 Cookies 信息,并且支持替换(不存在则会创建)以及覆盖两种修改模式,下面给出这两种修改模式的 profile 配置文件示例:

  • profile.yaml:根据 profile 替换指定的 Headers 和 Cookies 信息
headers:
    Header1: "this header will be created or updated"
cookies:
    Cookie1: "this cookie will be created or updated"
  • profile_override.yaml:根据 profile 覆盖原有的 Headers 和 Cookies 信息
override: true
headers:
    Header1: "all original headers will be overridden"
cookies:
    Cookie1: "all original cookies will be overridden"

创建了以上的两个 profile 配置文件后,我们可以使用 --profile 选项指定配置文件来进行全局修改,例如:

# 将输入的 demo.har 转化为 json 测试用例 demo_test.json,并进行全局替换
$ hrp convert demo.har --profile profile.yaml

# 将输入的 demo.har 转化为 pytest 测试用例 demo_test.py,并进行全局覆盖
$ hrp convert demo.har --to-pytest --profile profile_override.yaml

注意事项

  1. 输出的测试用例文件名格式为 输入文件名称(不带后缀) + _test + .json/.yaml/.go/.py 后缀,如果该文件已经存在则会进行覆盖
  2. hrp convert 可以自动识别输入类型,因此不需要通过选项来手动指定输入类型,如遇到输入类型不支持、加载失败或转换失败的情况,则会输出错误日志并跳过,不会影响其他转换过程的正常进行
  3. 在 profile 文件中,指定 override 字段为 false/true 可以选择全局修改模式为替换/覆盖。需要注意的是,如果不指定该字段则默认的全局修改模式为替换模式
  4. 输入为 JSON/YAML 测试用例时,向前兼容 HttpRunner v2.0/v3.0 版本的测试用例,输出则统一采用 HttpRunner v4.0 版本的风格
  5. 在进行测试用例的不同形态之间的相互转换时,如果输入测试用例的类型与输出的类型相同,所指定的 --output-dir 和 --profile 选项仍然生效

五、手工编写测试用例(重点)


手工编写 YAML/JSON/pytest/gotest 测试用例

5.1 通用概念介绍

在介绍如何手工编写测试用例之前,首先介绍 HttpRunner 中的一些通用概念,理解这些概念对于手工编写测试用例至关重要,因为无论是哪种形态的测试用例,都是按照一定的规则来设计的。这些通用概念具体包含以下的内容:

5.2 测试步骤(teststep)

测试步骤是测试用例的最小执行单元,测试用例是测试步骤的有序集合,对于接口测试来说,每一个测试步骤应该就对应一个具体的用户操作。HttpRunner 支持的测试步骤如下:

测试步骤类型含义
request用于发起 HTTP 请求的步骤类型
api用于引用 API 的步骤类型
testcase用于引用其他测试用例的步骤类型
transaction用于定义一个事务
rendezvous集合点
think_time思考时间
websocket用于发起 WebSocket 请求的步骤类型

除了基本的测试步骤之外,部分测试步骤还可以进行增强,从而拓展更多功能,这一部分内容将在增强测试用例章节中进行详细介绍。

增强操作类型含义适用的测试步骤
variables局部变量通用
setup_hooks前置函数request/api/websocket
teardown_hooks后置函数request/api/websocket
extract参数提取request/api/websocket
validate结果校验request/api/websocket
export导出变量testcase

5.3 测试用例(testcase)

从 2.0 版本开始,HttpRunner 开始对测试用例的概念进行进一步的明确,参考 wiki 上对于 test case 的定义:

A test case is a specification of the inputs, execution conditions, testing procedure, and expected results that define a single test to be executed to achieve a particular software testing objective, such as to exercise a particular program path or to verify compliance with a specific requirement.

概括下来,一条测试用例(testcase)应该是为了测试某个特定的功能逻辑而精心设计的,并且至少包含如下几点:

  • 明确的测试目的(achieve a particular software testing objective)
  • 明确的输入数据(inputs)
  • 明确的运行环境(execution conditions)
  • 明确的测试步骤描述(testing procedure)
  • 明确的预期结果(expected results)

按照上述的测试用例定义,HttpRunner 的测试用例应该保证是完整并且可以独立运行的。

从测试用例的组成结构来看,一个测试用例可以分为「测试脚本」和「测试数据」两部分:

  • 测试脚本:重点是描述测试的业务功能逻辑,包括预置条件、测试步骤、预期结果等,并且可以结合辅助函数(debugtalk.go/debugtalk.py)实现复杂的运算逻辑
  • 测试数据:重点是对应测试的业务数据逻辑,例如数据驱动文件中的定义的 UUID、用户名等等,以及环境配置文件中定义的 base_url 环境变量等等

测试脚本与测试数据分离后,就可以比较方便地实现数据驱动测试,通过对测试脚本传入一组测试数据,实现同一业务功能在输入不同业务数据情况下的测试验证。那么测试数据是如何传入测试脚本中的呢?这就需要用到测试数据与测试脚本之间的桥梁——用例配置(config),测试脚本除了包含多个有序的测试步骤之外,还包含针对当前测试用例的用例配置项,HttpRunner 支持的用例配置项如下:

用例配置项名称含义
verify客户端是否进行 SSL 校验(todo)
base_url当前请求的基础 URL(deprecated in v4.1, moved to .env)
headers定义测试用例级别的请求头
environs配置环境变量(如果未指定则会从 .env 文件导入)
variables定义测试用例级别的变量
parameters配置参数驱动的数据源
parameters_setting配置参数驱动的具体策略
think_time配置思考时间的具体策略、超时时间限制等
websocket配置 WebSocket 断开重连的最大次数和间隔等(todo)
export导出当前测试用例中的变量
weight性能测试过程中,分配给当前测试用例的虚拟用户权重
path当前测试用例所在路径(通常不需要手工填写)

5.4 测试用例集(testsuite)

对于测试用例集的概念,同样参考 wiki 上对于 test suite 的定义:

a test suite, less commonly known as a validation suite, is a collection of test cases that are intended to be used to test a software program to show that it has some specified set of behaviors. A test suite often contains detailed instructions or goals for each collection of test cases and information on the system configuration to be used during testing. A group of test cases may also contain prerequisite states or steps, and descriptions of the following tests.

从上面定义中可以看出,测试用例集是测试用例的无序集合,通俗来将,测试用例集就是「一堆」测试用例。对应地,HttpRunner 除了支持指定单个文件来运行某一测试用例,也支持指定多个文件或指定文件夹来运行一整个测试用例集。

项目根目录:

项目根目录是整个测试用例集的目录,测试用例中的相对路径(例如在测试步骤中引用 API 或测试用例的路径,或者在使用参数驱动功能时引用 CSV 文件的路径)都是基于项目根目录来进行引用的。在 HttpRunner v4.0 中,项目根目录以 proj.json 为锚,并且按照使用习惯,环境配置文件 .env,以及辅助函数的定义文件 debugtalk.py/debugtalk.go 通常也是放在项目根目录下的。

手工编写 YAML/JSON 测试用例

YAML 和 JSON 是两种常用的定义结构化数据的格式,关于这两种格式的优劣是非常有争议的问题,下面首先从编写风格、功能多样性和解析效率几个方面进行一下对比:

  • 编写风格:YAML 必须使用空格来表示缩进,并且对空格具体数量没有要求,只需要相同层级左侧对齐即可,这种缩进风格简洁且易于阅读,针对同一测试用例,YAML 文件的篇幅通常要比带缩进的 JSON 文件简短很多,用户可以较快地把握整体结构,但是对于手动编写 YAML 测试用例的场景而言,则需要重点注意相同层级左侧对齐,否则很容易导致测试用例的加载错误。JSON 的编写风格则是频繁地使用 {} [] 和 “",对缩进并没有严格要求(习惯上还是采用良好的缩进风格来便于阅读),正是由于额外的符号过多,容易降低阅读和手工编写上的体验
  • 功能多样性:在功能方面,YAML 是 JSON 的超集,YAML 有许多 JSON 缺乏的附加功能,包括注释、可扩展数据类型、关系锚、不带引号的字符串等等,尤其是添加注释的功能在编写测试用例供他人阅读时尤为实用,而 JSON 只支持数值、字符串、布尔值、数组、对象和空值六种数据类型。
  • 解析效率:与 YAML 相比,JSON 对机器来说更容易解析,序列化/反序列化的速度更快

从上面的对比中可以看出 YAML 与 JSON 各有优劣,用户在编写测试用例的时可以根据自己的喜好和使用场景来进行选择,不过二者具有较强的相似性,下面以 YAML 为例来对手工编写测试用例进行介绍,JSON 测试用例的编写方式同理,只需要适配 JSON 的语法规则即可。

编写用例配置

下面展示一个 YAML 用例配置部分的示例,读者只需要了解 YAML 的基本语法规则以及各个字段的类型即可在项目中自定义用例配置部分。

config:
  name: "demo with complex mechanisms"
  verify: False
  base_url: "https://postman-echo.com"
  headers:
    X-Request-Timestamp: "165460624942"
  parameters:
    user_agent: [ "iOS/10.1", "iOS/10.2" ]
    username-password: ${parameterize($file)}
  parameters_setting:
    strategies:
      user_agent:
        name: "user-identity"
        pick_order: "sequential"
      username-password:
        name: "user-info"
        pick_order: "random"
    limit: 6
  think_time:
    strategy: random_percentage
    setting:
      max_percentage: 1.5
      min_percentage: 1
    limit: 4
  variables:
    app_version: v1
    user_agent: iOS/10.3
    file: examples/hrp/account.csv
  websocket:
    reconnection_times: 5
    reconnection_interval: 2000
  export: ["app_version"]
  weight: 10

编写测试步骤

request

teststeps:
  -
    name: get with params
    variables:
      foo1: ${ENV(USERNAME)}
      foo2: bar21
      sum_v: "${sum_two_int(1, 2)}"
    request:
      method: GET
      url: $base_url/get
      params:
        foo1: $foo1
        foo2: $foo2
        sum_v: $sum_v
    extract:
      foo3: "body.args.foo2"
    validate:
      - eq: ["status_code", 200]
      - eq: ["body.args.foo1", "debugtalk"]
      - eq: ["body.args.sum_v", "3"]
      - eq: ["body.args.foo2", "bar21"]
  -
    name: post raw text
    variables:
      foo1: "bar12"
      foo3: "bar32"
    request:
      method: POST
      url: $base_url/post
      headers:
        Content-Type: "text/plain"
      body: "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3."
    validate:
      - eq: ["status_code", 200]
      - eq: ["body.data", "This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32."]
  -
    name: post form data
    variables:
      foo2: bar23
    request:
      method: POST
      url: $base_url/post
      headers:
        Content-Type: "application/x-www-form-urlencoded"
      body: "foo1=$foo1&foo2=$foo2&foo3=$foo3"
    validate:
      - eq: ["status_code", 200]
      - eq: ["body.form.foo1", "$expect_foo1"]
      - eq: ["body.form.foo2", "bar23"]
      - eq: ["body.form.foo3", "bar21"]

HTTP/2 请求请参考 HTTP/2 章节

api

teststeps:
    - name: test api /get
      api: api/get.json
      variables:
        app_version: 2.8.7
        device_sn: $device_sn
        os_platform: ios
        user_agent: iOS/10.4
      extract:
        session_token: body.headers."postman-token"
      validate:
        - check: status_code
          assert: equal
          expect: 200
          msg: check status_code
        - check: body.headers."postman-token"
          assert: equal
          expect: ea19464c-ddd4-4724-abe9-5e2b254c2723
          msg: check body.headers.postman-token

testcase

teststeps:
-
    name: request with functions
    variables:
        foo1: testcase_ref_bar1
        expect_foo1: testcase_ref_bar1
    testcase: testcases/requests.yml
    export:
        - foo3

transaction

请参考事务(transaction)章节

rendezvous

请参考集合点(rendezvous)章节

think_time

请参考思考时间(think_time)章节

websocket

请参考 WebSocket 章节

注意事项

与下面即将介绍的代码形态编写测试用例的方式不同,手工编写 YAML/JSON 测试用例具有较大的灵活性并且容易出错,因此在手工编写测试用例的过程中需要格外注意。最后,步骤类型的判断是会有一定优先级的,如果用户在一个测试步骤中指定了多个步骤类型,则会按照 api > testcase > think_time > request > transaction > rendezvous > websocket 的顺序进行类型识别,并最终判断为其中的一类,虽然这种情况极少会出现,但也在此说明一下,以防止发生一些意料之外的错误

六、YAML配置文件的格式

用例编写,是用yaml文件来实现的,yaml文件的格式非常重要。

相关学习文档:

yaml语法_yaml文件中list怎么区分字符串和数字_做测试的喵酱的博客-CSDN博客


 1、yaml是数据格式,不是数据类型(结构)
 2、yaml配置文件的后缀为.yml或者.yaml
 3、yaml中使用#作为注释,注释只能在某一行的前后,不能与key\value在同一行
 4、yaml中有两种结构,一种是key: value,value与冒号之间必须有空格
   另一种是 - key: value,“-”为列表结构
 5、yaml文件中嵌套的同一级条目前缩进必须一致(一般缩进2个空格)
 6、yaml中如果value使用引号(单引号或者双引号),那么该value为字符串类型
 7、如果value中只要有字母,哪怕没有添加引号,一般也会识别为字符串类型(false、true、on、off、null除外)
 8、value为false、true、on、off,是布尔类型,null为空
 9、value中为纯数字或者小数,会被识别为int或float类型

miao_httprunner/api/demo_api.yml

name: demo api
variables:
    var1: value1
    var2: value2
request:
    url: /api/path/$var1
    method: POST
    headers:
        Content-Type: "application/json"
    json:
        key: $var2
validate:
    - eq: ["status_code", 200]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/617319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网最全、最新MyBatis框架核心知识

MyBatis框架 1. 软件开发常用结构 MyBatis是操作数据库的,相当于是一个增强的JDBC 1.1 三层架构 三层架构包括: 界面层(User Interface layer)业务逻辑层(Business Logic Layer)数据访问层(Dat…

Window搭建IOS App自动化测试环境

平台搭建:tidevice(Windows逆向通信iOS工具)WebDriverAgent(iOS通信服务)facebook-wda(iOS测试框架) macOSXcode:在手机上安装WebDriverAgent的时候需要用到,必须要Xcod…

HDFS概述及其优缺点

什么是HDFS? HDFS的全称是hadoop distributed file system,即hadoop的分布式文件系统。 见名知意,它就是用来进行文件存储的。毕竟它是大数据的一个组件,用来存储这种海量的数据。 它是基于03年10月份,谷歌发表的GFS…

Hadoop 怎么委任和解除节点?

前言 本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 正文 Hadoop 集群的管理员经常需要向集群中添加节点…

Android Studio引用第三方库的方式

title: 大小端详解 date: 2023-06-06 21:01:24 comments: true #是否可评论 toc: true #是否显示文章目录 categories: #分类 - gradle - android studio tags: #标签 - gradle - android studio summary: android stduio 导入第三方库方式 Android Studio引用第三方库的方式 …

NCUTer 我的创作纪念日(2023-06-06)

前言 大家好,我是NCUTer,今天收到私信,突然发现,我来到CSDN已经2年多了,距离发布第一篇博客已经2年整了。正式规划性的写博客,是在2021年6月底开始的,当时啥也不懂,不知道该怎么去做…

10万字XX市开发区智慧综治中心平台建设一期工程招标文件word

(一)智慧综治中心信息化平台 需基于“一个平台,多级用户”的原则,利用移动互联网、物联网、大数据、人工智能和地理信息等新一代信息技术,整合辖区多方社会治理数据,建立一个覆盖全区三级综治中心用户的统一…

2个原因解答:为什么网络安全缺口大,招聘却很少?

2023年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢?…

【博客639】Life of a label in prometheus

prometheus中label的生命周期 前言 Prometheus labels allow you to model your application deployment in the manner best suited to your organisation. As directly supporting every potential configurations would be impossible, we offer relabelling to give you t…

Paxos算法

组成 Paxos算法有proposer, accepter, leaner三种角色节点,其中proposer有点像客户端,而accepter是存储节点。 持久化需要 basic-Paxos是二阶段进行的 第一阶段 propose发起prepare请求,带上rnd accpeter如果发现rnd,比如自己…

图论在数学建模中的应用及MATLAB实现

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 图论基本概念 图论原理 1. 最短路径问题 2. 最小生成树问题 MATLAB实现 1. 创建图 2. 最短路径算法 3. 最小生成树算法 数学建模案…

第一章 小程序入门

文章目录 前言一、❎ 环境搭建1、AppID2、设置外观和代理3、小程序项目构成小程序的基本结构小程序的页面组成部分 4、JSON 配置文件JSON 配置文件的作用app.json 配置文件project.config.json 配置文件sitemap.json 配置文件页面 .json 配置文件 5、WXML 模板什么是 wxmlwxml …

Java --- springboot3之web静态资源配置

目录 一、静态资源规则 二、欢迎页规则 三、favicon.ioc规则 四、HTTP缓存机制 五、自定义静态资源规则 5.1、配置方式 5.2、代码方式 一、静态资源规则 Override public void addResourceHandlers(ResourceHandlerRegistry registry) {if (!this.resourceProperties.is…

UA-ModelCompiler 的编译和使用

UA-ModelCompiler 是OPCFoundation的开源程序,它实现将NodeSet 的xml 文件编译成C# 的类,以便结合到UA Server 中。同时,它也能够将一种简便的模型xml 文档(ModelDesgin.xml) 转换成为NodeSet2.xml 。 最近的项目中要使用UA-ModelCompiler &…

【C++】C++ 右值 相关常见问题

【C】C 右值 相关常见问题 文章目录 【C】C 右值 相关常见问题1.介绍一下左值引用和右值引用1.1左值和左值引用1.2右值和右值引用 2.左值引用与右值引用比较3.左值引用的使用场景4. move语义5.完美转发 C 11 关于右值相关概念: 在 C 中,右值是指仅作为表…

【3DsMAX】从零开始建房(3)

目录 步骤 1. 统一材质 2. 制作椅子 3. 制作货物盒 步骤 1. 统一材质 选中所有的模型,按下M键打开材质编辑器 选择精简材质编辑器 选择64示例窗 可以随便选中一个材质球,然后将材质指定给选定对象 然后可以修改线框颜色为黑色 2. 制作椅子 激活…

【力扣周赛】第348场周赛

【力扣周赛】第348场周赛 2716. 最小化字符串长度题目描述解题思路 2717. 半有序排列题目描述解题思路 2718. 查询后矩阵的和题目描述解题思路 2719. 统计整数数目题目描述解题思路 2716. 最小化字符串长度 题目描述 描述:给你一个下标从 0 开始的字符串 s &#…

30个接口自动化测试面试题,看过的已经在上班了

1. 什么是接口自动化测试? 答:接口自动化测试是指使用自动化工具对接口进行测试,验证接口的正确性、稳定性和性能等方面的指标。2. 为什么要进行接口自动化测试? 答:接口自动化测试可以提高测试效率,减少人…

STM32 实现简单定时任务调度器,动态创建任务,两种思路实现跑马灯

代码实现和硬件没关系,所以并不限于STM32,Arduino 之类的其他地方也能用,只要有一个能获取时间的函数就行,或者说,只要有一个会随着时间自动增加的变量就行,时间单位无所谓,所以确实想的话&…

地图实火!断货加印,限时折扣抢购通道开启

(关注公众号点击图片三折购买《社交泛娱乐出海作战地图》) 实火! 融云自制《社交泛娱乐出海作战地图》 “WICC 泛娱乐出海嘉年华”最热单品 关注【融云全球互联网通信云】了解更多 《出海作战地图》线下首发立刻引爆现场,“如…