httprunner V4.3.5 安装与使用
一、Httprunner介绍
1、什么是Httprunner
HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。
核心特征:
- 继承 Requests 的全部特性,轻松实现 HTTP(S) 的各种测试需求
- 测试用例与代码分离,采用YAML/JSON的形式描述测试场景,保障测试用例具备可维护性
- 测试用例支持分层机制,充分实现测试用例的复用
- 测试用例支持参数化和数据驱动机制
- 使用 skip 机制实现对测试用例的分组执行控制
- 支持热加载机制,在文本测试用例中轻松实现复杂的动态计算逻辑
- 基于 HAR 实现接口录制和用例生成功能(har2case)
- 结合 Locust 框架,无需额外的工作即可实现分布式性能测试
- 执行方式采用 CLI 调用,可与 Jenkins 等持续集成工具完结合
- 测试结果统计报告简洁清晰,附带详尽统计信息和日志记录
- 具有可扩展性,便于扩展实现 Web 平台化(HttpRunnerManager)
2、HttprunnerV4版本介绍
- 开发语言: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/pip
v1/v2/v3/v4 版本对比概览:
3、HttprunnerV4版本Go & Python 功能对比
4、Httprunner 与 unittest & pytest 的区别
使用语言和用途:
- Httprunner 是一个面向HTTP(S)协议的通用开源测试框架,支持YAML、JSON等多种格httprunner主要是一个用于接口自动化测试和性能测试的框架,支持HTTP/HTTPS/HTP2/WebSocket/TCP/RPC协议,使用YAML或JSON格式的文件描述测试用例,特别适合接口测试和性能测试。
- unittest是Python自带的测试框架,主要用于编写单元测试,提供测试用例的编写、测试套件的组织、测试执行和断言等基本功能。
- pytest也是一个用于Python的测试框架,可以进行单元测试和功能测试,具有更简洁的语法和灵活的自动发现测试功能,支持参数化测试、测试装饰器和插件机制等。
学习曲线和复杂性:
- httprunner的语法相对简单,测试脚本编写和维护较为容易,适合初学者快速上手。
- unittest的语法相对繁琐,但在Python标准库中集成,无需额外安装,对于熟悉Python的开发者来说,这是一个优势。
- pytest的语法简单易懂,学习曲线较为平缓,支持多种测试方式和插件,可以满足复杂的测试需求。
功能和特性:
- httprunner支持请求参数化、断言和全局变量等功能,提供丰富的测试报告和日志功能。
- unittest提供了测试用例的编写、测试套件的组织、测试执行和断言等基本功能,适合进行单元测试。
- pytest支持参数化测试、fixture、mock等多种功能,可以生成详细的测试报告,支持并发测试,提高测试效率。
优劣势总结:
- httprunner的优势在于其简单的语法和易用性,并支持多协议HTTP(S)/HTP2/WebSocket/TCP/RPC等,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。
- unittest作为Python自带的测试框架,无需额外安装,但语法相对繁琐。它适合进行单元测试,是Python开发者熟悉的选择。
- pytest以其简洁的语法和强大的功能受到开发者的青睐,支持多种测试方式和插件,可以满足复杂的测试需求。劣势在于对于需要大量IO操作的测试可能存在性能瓶颈。
二、安装
1、Httprunner下载
- 1.1、一键安装部署(MAC):
$ bash -c "$(curl -ksSL https://httprunner.com/script/install.sh)"
如报错提示:无权限则使用sudo命令进行安装:
sudo bash -c "$(curl -ksSL https://httprunner.com/script/install.sh)"
- 检查httprunner安装版本:
httprunner -V or hrun -V
出现版本号即安装成功。
- 检查hrp是否安装成功:
hrp -h
出现下图则安装成功
- 1.2、通过pip安装:(通用Mac&Windows):
建议:安装到虚拟环境下,这样可切换使用不同版本的httprunner
pip install httprunner==4.3.5 //指定版本安装,不加默认下载最新
查看版本:
hrun -V or httprunner -V
“V”一定要大写,不然如下图报错:
- 常见报错:You should consider upgrading via the ‘python -m pip install --upgrade pip’ command.
You are using pip version 10.0.0, however version 20.0.0 is availa- 解决方案:
python -m pip install --upgrade pip //更新升级pip
升级后依然下载失败,可能pip源内找不到httprunner(Windows常见),更新pip的镜像源即可:
pip install -i https://pypi.douban.com/simple httprunner //豆瓣镜像源
pip install -i https://pypi.tuna.tsinghua.edu.cn httprunner //清华大学镜像源
2、Hrp下载
1. 下载hrp
安装httprunner V4.3.5后,还无法使用hrp命令行工具,需要下载编译产物,在 GitHub Releases
页面中自行选择版本进行下载:
2. 配置hrp的环境变量:
- Mac:打开终端进入配置
vim ~/.bash_profile //如果使用的是bash shell
vim ~/.zshrc //如果使用的是zsh shell
进入后添加环境变量:(vim:敲“i”->Enter进入编辑),将以下代码添加进环境变量
export PATH="/usr/local/hrp/bin:$PATH" // 该路径 /usr/local/hrp/bin/hrp 为hrp的文件路径
保存并关闭文件。(vim:保存退出=>Esc–>:wq–>Enter 保存并退出)
生效配置:
source ~/.bash_profile
source ~/.zshrc
验证环境变量配置是否成功:
hrp -h or hrp -v
- Windows配置hrp环境变量:
将下载的包解压后的hrp.exe放在C盘httprunner文件目录下(自定义目录)在【我的电脑=>属性=>高级系统设置=>环境变量=>系统变量】,在PAHT下新 增变量:C:\httprunner 确认保存即可。
验证环境变量:
hrp -h or hrp -v
出现版本号 or 出现帮助页面即可,参考以上。
三、快速上手使用
1、创建手脚架项目
- 新增手脚架项目:
使用以下命令新增Httprunner项目并命名为demo:
hrp startproject demo
如下图即新增成功:
打开demo项目如下图:
2、录制生成Har文件
- Charles 录制 HAR 文件:(fiddler & 浏览器开发者模式F12均可抓包导出为har文件)
以下采用 Charles 等抓包工具为例: 抓取接口导出
存为har格式文件:
3、将Har转换成测试用例
- HttpRunner4.3.5将所有的转换功能都集中在 hrp convert 一个指令中。通过执行 hrp convert -h 可以查询该指令的功能简介、用法和各个选项的介绍:
hrp convert --from-har xxx.har //将HAR文件默认转换成转换成Json文件 文件名为xxx_test.json
hrp convert --from-har xxx.har --to-yaml //将HAR文件转换成YAML文件 文件名为xxx_test.yaml
hrp convert --from-har xxx.har --to-json //将HAR文件转换成Json文件 文件名为xxx_test.json
hrp convert --from-harxxx.har --to-pytest //将HAR文件转换成pytest文件 文件名为xxx_test.py
- 注释:执行hrp convert --from-har xxx.har --to-pytest命令,会先将 xxx.har转化成xxx_test.json,然后再将xxx_test.json转化成xxx_test_test.py
- hrp convert 指令支持指定目录输出,–output-dir 后接测试用例的期望输出目录的路径,用于将转换生成的测试用例输出到对应的文件夹:
hrp convert --from-har xxx.har --to-pytest --output-dir demo/cases //输入文件到当前目录下的demo/cases文件夹中
如下:
- 执行测试用例:
**JSON/YAML(/pytes)**类型的测试用例文件,httprunnerV4.3.5使用hrp run 命令执行:
hrp run xxx.json ##执行json测试用例
hrp run xxx.yaml ##执行yaml测试用例
hrp run testcases/ ##执行testcases文件下所有测试用例
pytest文件可通过pytest命令执行改测试用例文件:pytest xxx.py
目前的 HttpRunner 支持运行 pytest 的测试用例进行接口测试。由于 HttpRunner wraps pytest,因此pytest 所有的参数都可以与 hrp 命令一起使用。
4、手工编写测试用例
pytest 、 YAML 和 JSON 格式的测试用例完全等价,包含的信息内容也完全相同,在httprunner中,测试用例组织主要基于三个概念:
- 1测试用例集(testsuite):对应一个YAML/JSON/Python文件,包含单个或多个测试用例文件。通 俗来将,测试用例集就是「一堆」测试用例。对应地,HttpRunner 除了支持指定单个文件来运行某一测试用例,也支持指定多个文件或指定文件夹来运行一整个测试用例集。
- 测试用例(testcase): 对应一个YAML/JSON/Python文件,包含单个或多个测试步骤。
- 测试步骤(teststep): 对应YAML/JSON/Python中 teststeps 下的一个节点,描述单次接口测试 的全部内容,包括发起接口请求、解析响应结果、检验结果等。
pytest 、 YAML 和 JSON 格式的测试用例,用例结构整体结构都包含两部分:
-
config: 每个测试用例都必须有config部分,作为整个测试用例的全局配置项,用于配置用例:
-
teststeps:包含测试步骤相关信息,测试用例存在顺序关系,运行时将从前往后依次运行 各个测试步骤,其中步骤可以引用其他测试用例:
示例:
request.yaml
config:
name: test
variables: {
}
verify: false
teststeps:
- name: "test"
request:
method: GET
url: http://127.0.0.1:8080/api/test/
params:
action: list_course
pagenum: "1"
pagesize: "20"
headers:
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Host: 127.0.0.1:8080
Referer: http://127.0.0.1:8080/mgr/test/index.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36
X-CSRFToken: ABjPB9CYXuc0dPy8Wu2hJppDVu1sdhWRrfoWPBM7DimSrMtkHVUAoNAXeWqOIh0d
cookies:
csrftoken: ABjPB9CYXuc0dPy8Wu2hJppDVu1sdhWRrfoWPBM7DimSrMtkHVUAoNAXeWqOIh0d
sessionid: b1g42w3ynatxpphy0fhahpdi7g4pn2vg
extract:
msg: body.msg
cookie: header.cookie
validate:
- check: status_code
assert: equals
expect: 200
msg: assert response status code
- eq: ["body.msg","成功"]
request.py
from httprunner import HttpRunner, Config, Step, RunRequest
class TestCaseRequestsTest(HttpRunner):
config = (
Config("request methods testcase with functions")
)
teststeps = [
Step(
RunRequest("")
.get("http://127.0.0.1:8080/api/test/")
.</