HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试
录制生成测试用例
为了简化测试用例的编写工作,HttpRunner 实现了测试用例生成的功能。
首先,需要将抓包工具抓取得到的数据包导出为 HAR 格式的文件,假设导出的文件名称为 demo-quickstart.har。
然后,在命令行终端中运行如下命令,即可将 demo-quickstart.har 转换为 HttpRunner 的测试用例文件。
$ har2case docs/data/demo-quickstart.har -2y
INFO:root:Start to generate testcase.
INFO:root:dump testcase to YAML format.
INFO:root:Generate YAML testcase successfully: docs/data/demo-quickstart.yml
在项目中是不会通过录制来生成测试用例的,下面就来看看在项目中HttpRunner架构是如何使用的
项目文件组织
在 HttpRunner 自动化测试项目中,主要存在如下几类文件:
- YAML/JSON:测试用例文件,以及接口定义文件
- debugtalk.py:存储项目中项目中所需的一些公用方法,并且该文件存在时,将作为项目根目录定位标记,其所在目录即被视为项目工程根目录
该文件不存在时,运行测试的所在路径(CWD)将被视为项目工程根目录 - .env:存储项目环境变量
- .csv:项目数据文件,用于进行数据驱动
- reports:默认生成测试报告的存储文件夹
测试用例组织
HttpRunner 的测试用例支持两种文件格式:YAML 和 JSON。
JSON 和 YAML 格式的测试用例完全等价,包含的信息内容也完全相同。
我们项目中选择的是YAML格式,以下都以YAML为例
在 HttpRunner 中,测试用例组织主要基于三个概念:
- 测试用例集(testsuite):对应一个文件夹,包含单个或多个测试用例(YAML/JSON)文件
- 测试用例(testcase):对应一个 YAML/JSON 文件,包含单个或多个测试步骤
- 测试步骤(teststep):对应 YAML/JSON 文件中的一个 test,描述单次接口测试的全部内容,包括发起接口请求、解析响应结果、校验结果等
测试用例如何实现?
HttpRuner采用了测试用例分层模型
概括来说,测试用例分层机制的核心是将接口定义、测试步骤、测试用例、测试场景进行分离,单独进行描述和维护,从而尽可能地减少自动化测试用例的维护成本。
先定义接口
先定义接口,每个文件对应一个接口描述,接口定义描述的主要内容包括:name、variables、request、base_url、validate 等,形式如下:
name: get headers
base_url: http://httpbin.org
variables:
expected_status_code: 200
request:
url: /headers
method: GET
validate:
- eq: ["status_code", $expected_status_code]
- eq: [content.headers.Host, "httpbin.org"]
其次再写testcase
引用接口定义写testcase,有了接口的定义描述后,我们编写测试场景时就可以直接引用接口定义了。
一般testcase 包含如下内容:
- config:
name: _demo_test
variables:
sg_name: sgroup_test
sg_title: sg_test
setup_hooks:
- ${cleanup_sg($sg_name)}
- test:
name: "demo test case description"
api: api/demo_api.yml
variables:
api_ag_name: $sg_name
api_ag_title: $sg_title
api_ag_desc: $sg_desc
api_ag_owner: $sg_owner
extract:
- sg_id_1: json.data.demo_api.id
validate:
- "eq": ["status_code", 200]
- "response_errors": ["json", False]
- "eq": ["json.data.demo_api.desc", $sg_desc]
环境变量的定义以及引用
通过.env文件设置环境变量,.env文件一般放置在项目的根目录,以key=value的形势存放数据,样例如下:
$ cat .env
UserName=admin
Password=123456
PROJECT_KEY=ABCDEFGH
HttpRuner运行时会自动将.env文件中的内容加载到实时的环境变量中,然后就可以读环境变量了
对环境变量的引用
- 在Yaml或Json脚本中的引用样例:${ENV(UserName)}
- 在python脚本中的引用样例如下:
import os
def get_encrypt_password():
raw_passwd = os.environ["Password"]
PROJECT_KEY = os.environ["PROJECT_KEY"])
password = (raw_passwd + PROJECT_KEY).encode('ascii')
return hmac.new(password, hashlib.sha1).hexdigest()
Yaml写的测试用例如何调用python写的公用方法
HttpRunner架构支持在yaml或json文件中调用pyhon函数,通过${func()}的方式引用,
假设在testcase中调用上面定义的get_encrypt_password()方法:
- test:
name: login
request:
url: http://host/api/login
method: POST
headers:
Content-Type: application/json
json:
username: ${ENV(UserName)}
password: ${get_encrypt_password()}
validate:
- eq: [status_code, 200]
case与case之间的参数如何传递
如何从上一个case的响应结果中提取参数并传递给下面的case?可以使用extract关键字,使用extract可以从接口响应结果中提取一个或多个参数
例如某个接口的响应结果为:
{
"data": {
"demotag": {
"id": "123123",
"name": "test_name",
"title": "test_title"
}
}
}
使用extract提取name和title的值:
extract:
- name: json.data.demotag.name
- title: json.data.demotag.title
接下来使用$title这种形式,就可以在其他case中用这两个值了
检查点的验证
httprunner提供validate关键字验证接口的返回结果,使用方式如下:
validate:
- "eq": ["status_code", 200]
- "response_errors": ["json", False]
- "eq": ["json.data.demotag.name", $name]
- "eq": ["json.data.demotag.title", $title]
执行测试用例
hrun testcases\demo_test.yml