httprunner
官网链接:https://cn.httprunner.org/prepare/testcase-structure/
一、安装框架介绍
HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON
脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。
1、安装以及依赖软件
- 可运行平台:windows、Linux、macOS,推荐系统:Linux/macOS
- 安装方式:
pip install httprunner
- 依赖的Python版本:Python 3.4及以上版本
2、项目文件结构
- YAML/JSON(必须):测试用例文件,一个文件对应一条测试用例
- debugtalk.py(可选):脚本函数(存储项目中逻辑运算函数)
- 该文件将作为项目根目录定位标记,其所在目录即被视为项目工程的根目录
- api : 存放base接口
- testcase:组合api中的接口,场景自动化case组装。(又先后顺序)
- testsuite:用例集合(无序)
- .env(可选):存储项目环境变量
- reports(自动生成): 运行后自动生成,无需创建
3、常用命令
- hrun 核心命令
- har2case 格式转换命令,将har格式转换成json/yaml格式
二、编写运行
1、测试用例组织
测试用例组织中三个基础概念:测试套件、测试用例、测试步骤
测试用例集(testsuite
):对应一个文件夹,包含单个或多个测试用例(YAML/JSON)
文件,应该是完整且独立的,每条测试用例应该是都可以独立运行的
测试用例(testcase
):对应一个 YAML/JSON
文件,包含单个或多个测试步骤。是测试步骤的 有序 集合,每一个测试步骤对应一个 API 的请求描述
测试步骤(teststep
):对应 YA
ML/JSON
文件中的一个 teststep,描述单次接口测试的全部内容,包括发起接口请求、解析响应结果、校验结果等。 无序 集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的;如果确实存在先后依赖关系,那就需要在测试用例中完成依赖的处理
①变量引用
接口用例中,取值时可以通过自定义,也可以引用其他已定义好的变量或参数,格式为$var
②函数引用
接口用例中,取值时除了自定义、引用其他变量外,还可以引用debugtalk.py定义的函数来获取到函数返回值,格式为${get_value()}
③编写用例注意事项
(1)extract响应结果的字段有 : status_code, cookies, elapsed, headers, content, text, json, encoding, ok, reason, url。如果响应结果中有多层嵌套,可通过content.xxx.0.id格式获取id,其中content是指响应内容,xxx是响应内容中的某个字段,0表示获取xxx数组中第一个内容。
(2)所有json/yaml和.env文件中格式错误都会导致执行失败。
.env编辑时需注意:从第一行开始编辑,结尾不要有空行,采用key=value,value不需用“”括起来,否则会变成value的一部分
(3)支持的检验器有eq(=)、lt(<)、le(<=)、gt(>)、ge(>=)、ne(!=)、str_eq、len_eq、len_gt、len_ge、len_lt、len_le、contains、contained_by、type_match、regex_match、startswith、endswith。
- API目录下保存单个接口
# 测试名称(必须的),String
name: 查询实例
# 无条件跳过测试(可选的),String,跳过测试的说明
skip:
# 条件为 true 时跳过测试(可选的)
skipIf:
# 条件为 false 时跳过测试(可选的)
skipUnless:
# 变量(可选的), List,被上级(testcases,testsuite)覆盖
variables:
# 设置变量,实例id
instance_id: 'i-xxxxxx'
# 默认域名(可选的).String
base_url: http://test
# 请求参数(必须的), dict, 与request中的参数相同
request:
method: GET
url: /v3/instance
params:
# 通过 $+参数名称 的形式,应用变量
instance_id: $instance_id
# 提取器(可选的), dict,提取返回参数 (content是responses,body内容)
extract:
code: content.code
# 验证(可选的), list
validate:
- eq: [$code , 200]
- eq: [content.msg, "成功!"]
# 前置处理(可选的),list (可以修改request内容)
setup_hooks:
# 后置处理(可选的),list
teardown_hooks:
注:
- 可以通过查看源码
runner.py
->Runner
->_run_test
方法查看具体信息 httprunner
中timeout
的默认值为120
api/DescribeInstances.yml
name: 安全组查询
base_url: ${ENV(url)}
variables:
InstanceId: "i-XXXXXXX"
InstanceName: ""
PageNumber: ""
PageSize: ""
#skipIf: true
request:
url: ""
verify: false
params:
AccessKeyId: ${ENV(ak)}
Version: '2017-11-10'
Action: 'DescribeInstances'
InstanceId: "$InstanceId"
InstanceName: "$InstanceName"
PageNumber: "$PageNumber"
PageSize: "$PageSize"
method: GET
headers:
host: ${ENV(host)}
setup_hooks:
- ${setup_request($request)}
validate:
- eq: ["status_code", 200]
exteact:
- content
2、testcase中的优先级
- base_url
- testcase test > testcase config > testsuite test > testsuite config > api
- variables
- testcase config > testcase test > testcase_def config > testcase_def test > api
- verify
- testcase teststep (api) > testcase config > testsuite config
3、testsuites
参数化数据驱动
Httprunner2.0中支持testsuits中进行参数化和数据驱动,假如测试用例中定义了多个参数,那么测试用例在运行时会对参数进行笛卡尔积组合,覆盖所有参数组合情况。
1、参数情况分2种
(1)独立参数
(2)具有关联性的多个参数
2、指定数据源方式分3种
(1)在 YAML/JSON 中直接指定参数列表
(2)通过内置的P函数引用 CSV 文件
(3)调用 debugtalk.py 中自定义的函数生成参数列表
注:
# 使用默认的 report_template.html
hrun testcases/instance.yaml
# 使用自定义的模板,可以指定相对路径或绝对路径
hrun testcases/instance.yaml --report-template=templates/ens_test.html
# 控制台打印日志类型为debug(输出详细的请求),默认为INFO
hrun testcases/instance.yaml --log-level=debug
# 将login.yaml对应的logs输出:x.loaded.json, x.parsed.json, x.summary.json
hrun testcases/instance.yaml --save-tests
三、httprunner附录
hrun 命令行相关命令行参数
参数名称
|
参数值
|
参数说明
|
-h, --help
|
不带参数
|
查看帮助信息
|
-V, --version
|
不带参数
|
查看版本号
|
--no-html-report
|
不带参数
|
不生成测试报告
|
--html-report-name
|
HTML_REPORT_NAM
|
重命名html报告名称
|
--html-report-template
|
HTML_REPORT_TEMPLATE
|
自定义html报告模板,参数带上html模板的信息路径
|
--log-level
|
LOG_LEVEL
|
日志等级,如:debug
|
--log-file
|
LOG_FILE
|
指定日志文本保存路径
|
--dot-env-path
|
DOT_ENV_PATH
|
指定环境变量.env的详细路径
|
--failfast
|
不带参数
|
运到失败后停止测试
|
--startproject
|
STARTPROJECT
|
指定项目的根目录
|
--validate
|
[VALIDATE [VALIDATE ...]]
|
校验json格式
|
--prettify
|
[PRETTIFY [PRETTIFY ...]]
|
各式化json文件
|
Validator详细
No.
|
Comparator
|
Description
|
A(check), B(expect)
|
1
|
eq
|
value is equal
|
A == B
|
2
|
lt
|
less than
|
A < B
|
3
|
le
|
less than or equals
|
A <=B
|
4
|
gt
|
greater than
|
A >B
|
5
|
ge
|
greater than or equals
|
A >=B
|
6
|
ne
|
not equals
|
A != B
|
7
|
str_eq
|
string equals
|
str(A) == str(B)
|
8
|
len_eq, count_eq
|
length or count equals
|
len(A) == B
|
9
|
len_gt,count_gt
|
length greater than
|
len(A) > B
|
10
|
len_ge,count_ge
|
length greater than or equals
|
len(A) >= B
|
11
|
len_lt, count_lt
|
length less than
|
len(A) < B
|
12
|
len_le, count_le
|
length less than or equals
|
len(A) <= B
|
13
|
contains
|
contains
|
[1,2] contains 1
|
14
|
contained_by
|
contained by
|
A in B
|
15
|
type_match
|
A is instance of B
|
isinstance(A, B)
|
16
|
regex_match
|
regex matches
|
re.match(B, A)
|
17
|
startswith
|
start with
|
A startwith(B) is True
('abc' startwith 'ab') |
18
|
endswith
|
ends with
|
A endswith(B) is True
('abc' endswith 'bc') |
config参数
参数
|
是否必须
|
格式
|
详情
|
name
|
YES
|
string
|
测试用例的名称,在测试报告中将作为标题
|
variables
|
NO
|
list of dict
|
定义的全局变量,作用域为整个用例
|
parameters
|
NO
|
list of dict
|
全局参数,用于实现数据化驱动,作用域为整个用例
|
request
|
NO
|
dict
|
request 的公共参数,作用域为整个用例;常用参数包括 base_url 和 headers
|
request参数
参数
|
是否必须
|
格式
|
详情
|
base_url
|
NO
|
String
|
测试用例请求 URL 的公共 host,指定该参数后,test 中的 url 可以只描述 path 部分
|
headers
|
NO
|
dict
|
request 中 headers 的公共参数,作用域为整个用例
|
teststeps参数详情
参数
|
是否必须
|
格式
|
详情
|
name
|
YES
|
String
|
测试步骤的名称,在测试报告中将作为测试步骤的名称
|
request
|
YES
|
dict
|
HTTP 请求的详细内容;可用参数详见 python-requests 官方文档
|
variables
|
NO
|
list of dict
|
测试步骤中定义的变量,作用域为当前测试步骤
|
extract
|
NO
|
list
|
从当前 HTTP 请求的响应结果中提取参数,并保存到参数变量中(例如token),后续测试用例可通过$token的形式进行引用
|
validate
|
NO
|
list
|
测试用例中定义的结果校验项,作用域为当前测试用例,用于实现对当前测试用例运行结果的校验
|
validate_script
|
NO
|
String
|
列表,每个元素对应一行 Python 代码。
例如: validate_script: - "assert status_code == 201" - "a = response_json.get('args').get('a')" - "assert a == '1'" |
times
|
NO
|
int
|
重复执行测试用例的次数
|
setup_hooks
|
NO
|
list
|
在 HTTP 请求发送前执行 hook 函数,主要用于准备工作
|
teardown_hooks
|
NO
|
list
|
在 HTTP 请求发送后执行 hook 函数,主要用户测试后的清理工作
|