1.简介
HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份YAML/JSON脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。
2.特点
- 继承 Requests 的全部特性,轻松实现 HTTP(S) 的各种测试需求
- 以YAML或JSON格式定义testcase,使用pytest运行,更加简洁优雅 有了pytest,成百上千的插件随时可用
- 支持variables/extract/validate/hooks机制来创建极其复杂的测试场景
- 借助辅助函数(debugtalk.py),任何函数都可以在测试用例的任何部分中使用
- 支持完善的测试用例分层机制,充分实现测试用的复用
- 使用python的第三方库jmespath,让提取和验证json响应更简单
- 基于 HAR 实现接口录制和用例生成功能(har2case)
- 结合 Locust 框架,无需额外的工作即可实现分布式性能测试
- 执行方式采用 CLI 调用,可与 Jenkins 等持续集成工具完美结合
- 集成了Allure,让测试报告更加漂亮,内容更丰富。
- 极强的可扩展性,轻松实现二次开发和 Web 平台化
3.安装
pip install httprunner
检验是否安装成功
hrun -V
显示出版本号,说明安装成功
4.快速生成项目
httprunner startproject -h
5.项目结构说明 - debugtalk.py 放置在项目根目录下(借鉴了pytest的conftest.py文件的设计)
- .env 放置在项目根目录下,可以用于存放一些环境变量
- reports 文件夹:存储 HTML 测试报告
- testcases 用于存放测试用例
- har 可以存放录制导出的.har文件
6.转换为pytest文件
har2case baidu_home.har
7.转换为YAML/JSON
har2case baidu_home.har
在后面加-2y/--to-yml
或者-2j/--to-json
8.用例结构 - 每个testcase都是HttpRunner的子类
- 必须有两个类属性:config和teststeps
- 单个teststeps列表中的单个Step内部通过链式调用(RunRequest().get().with_params().with_headers().with_cookies().validate().assert_equal())
9.测试用例(config)
name (必填)
指定测试用例名称。这将显示在执行日志和测试报告中
base_url (选填)
如果base_url指定,则teststep中的url只能设置相对路径部分
variables(选填)
指定测试用例的公共变量。每个测试步骤都可以引用未在步骤变量中设置的配置变量
verity(选填)
指定是否验证服务器的TLS证书,通常设置为False,当请求https请求时,就会跳过验证
export (选填)
指定导出的测试用例会话变量,当一个测试用例在另一个测试用例的步骤中被引用,并且将被提取一些会话变量以在后续测试步骤中使用时,则提取的会话变量应在配置export部分中进行配置。将测试用例的某些变量指定为全局变量
10.测试用例(teststep)
RunRequest(name)
RunRequest 在一个步骤中用于向API发出请求,并对响应进行一些提取或验证
name
RunRequest 的参数用于指定测试步骤名称,该名称将显示在执行日志和测试报告中
.with_variables
指定测试步骤变量。每个步骤的变量都是独立的,因此,如果要在多个步骤中共享变量,则应在配置变量中定义变量。此外,步骤变量将覆盖配置变量中具有相同名称的变量。(PS:注意参数传递的格式使用**{},使用关键字参数解包的方式进行参数传递给with_variables),参数引用使用"变量名, 如果是函数引用使用{函数名()}"
.method(url)
指定HTTP方法和SUT的URL
如果base_url在config中设置,则url只能设置相对路径部分。如果在Config中设置了baseurl,method中只能设置相对路径,可选参数为get/post/put/delete/等
.with_params
传params参数
.with_headers
传headers参数
.with_cookies
传cookie
.with_data
传data参数
.with_json
传json参数
.extract
数据提取
.with_jmespath:使用jmespath提取JSON响应主体
with_jmespath(jmes_path:文字,var_name:文字)
jmes_path:jmespath表达式,有关更多详细信息,请参考 JMESPath 教程
var_name:存储提取值的变量名,可以在后续测试步骤中引用它
.validate
断言
.assert_XXX:使用jmespath提取JSON响应主体并使用期望值进行验证。
assert_XXX(jmes_path:文本,期望值:任何,消息:文本=“”)
jmes_path:jmespath表达式,有关更多详细信息,请参考JMESPath教程
expected_value:指定的期望值,变量或函数引用也可以在此处使用
消息(可选):用于指示断言错误的原因
11.参数化
参数化有三种方式
1.parameters 字段
第一种,使用httprunner改造过的pytest参数化,通过parameters这个字段去引用
@pytest.mark.parametrize(“param”,Parameters(
{
“first”: [“first”, “second”],
“second”: [‘random string’,‘string number’]
}
))
2.读取csv文件
#代码中如此书写
@pytest.mark.parametrize(“param”, Parameters(
{“username-password”: “${parameterize(data.csv)}”}
))
使用csv文件进行参数化的时候,Parameters的键里每一个-代表一个参数分割。例如username 和 password是两个参数,相应的,csv文件中的列名应该和参数名一致
数据文件
username,password
name1,1212
name2,4545
3.debugtalk.py文件中的函数
代码中这样调用:
@pytest.mark.parametrize(“param”, Parameters(
{“username”: “${get_username()}”}
))
以上方式是使用debugtalk中的方法返回值
在debugtalk里面定义:
def get_username():
return [
{“username”: “111111”},
{“username”: “222222”},
{“username”: “333333”},
{“username”: “444444”},
{“username”: “555555”},
{“username”: “666666”},
]