1、使用抓包工具抓接口,并导出为.hav文件
当前主流的抓包工具和浏览器都支持将抓取得到的数据包导出为标准通用的 HAR 格式(HTTP Archive)
2、使用har2case demo.har -2y 命令生成yaml格式的测试用例
说明:
HttpRunner 实现了将 HAR 格式的数据包转换为YAML/JSON格式的测试用例文件的功能。
har2case 转换脚本时默认转换为 JSON 格式。
加上 -2y/–to-yml 参数后转换为 YAML 格式。
一个yaml或者json为一个测试用例。
1、运行单个测试用例
$ hrun demo.yml
运行测试用例会自动生成测试报告和日志,报告中可以查看请求的详细信息
运行测试用例的原理:组装测试用例、执行请求、断言、生成日志或者报告
2、运行测试用例集
指定测试用例路径即可
$ hrun testcases_folder_path
3、希望测试用例在运行过程中,遇到失败时不再继续运行后续用例,则可通过在命令中添加–failfast实现。
$ hrun filepath/testcase.yml --failfast
4、日志级别,默认是info,打印信息不多
$ hrun docs/data/demo-quickstart-6.json --log-level debug
5、保持日志信息
$ hrun docs/data/demo-quickstart-6.json --save-tests
6、使用自定义测试报告
$ hrun docs/data/demo-quickstart-2.yml --report-template /path/to/custom_report_template
7、指定报告路径
–report-dir
8.指定环境变量
–dot-env-path
1、HttpRunner 通过复用 Locust,可以在无需对 YAML/JSON 进行任何修改的情况下,直接运行性能测试。
2、安装$ pip install locustio
3、loucsts 命令不仅可以指定 Locust 支持的 Python 文件,同时可以直接指定 YAML/JSON 格式的测试用例文件。在具体实现上,当 -f 指定 YAML/JSON 格式的测试用例文件时,会先将其转换为 Python 格式的 locustfile,然后再将 locustfile.py 传给 locust 命令。
$ locusts -f tests/data/demo_parameters.yml
4、在 HttpRunner 中,新增实现 --processes 参数,可以一次性启动 1 个 master 和多个 salve。
$ locusts -f examples/first-testcase.yml --processes 4
分层的目的是降低用例维护成本
测试用例分层机制的核心是将接口定义、测试步骤、测试用例、测试场景进行分离
使用独立的文件对接口描述进行存储,name 和 request 部分是必须的
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"]
1、每一个测试步骤应该就对应一个 API 的请求描述。
2、引用接口定义
可通过 api 字段引用接口定义,引用方式为对应 API 文件的路径,
绝对路径或相对路径均可。推荐使用相对路径,路径基准为项目根目录,即 debugtalk.py 所在的目录路径。
api: api/reset_all.yml
1、理解测试用例
角度1:
测试用例是测试步骤(teststep)的 有序 集合
一个测试用例就是一个.yml文件
一个测试用例可以包含一个或者多个测试步骤
角度2:
测试用例 = 测试脚本+测试数据
测试脚本就是.yml文件,重点描述测试的业务功能逻辑,包括前置条件、测试步骤、和预期结果等,并且可以结合辅助函数(debugtalk.py)实现复杂的运算逻辑。
测试数据和脚本分离,可以方便的实现数据驱动测试。
1、测试用例集 是 测试用例 的 无序 集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的。
2、如果确实存在先后依赖关系,那就需要在测试用例中完成依赖的处理。引用方法:
testcase: testcases/setup.yml
3、示例:
config:
name: create users with parameters
variables:
device_sn: ${gen_random_string(15)}
base_url: "http://127.0.0.1:5000"
testcases:
create user $uid and check result for $device_sn.:
testcase: testcases/create_user.yml
variables:
uid: 1000
device_sn: TESTSUITE_XXX
parameters:
uid: [101, 102, 103]
device_sn: [TESTSUITE_X1, TESTSUITE_X2]
HttpRunner实现了全新的hook机制,可以在请求前或者请求后调用钩子函数
可分为测试用例层面和测试步骤层面
测试用例层面在config中新增setup_hooks 和teardown_hooks
“setup_hooks”: [
“KaTeX parse error: Expected '}', got 'EOF' at end of input: …prepare_kwargs(request)}”,
“KaTeX parse error: Expected '}', got 'EOF' at end of input: …k_httpntlmauth(request)}”
],
“teardown_hooks”: [
“KaTeX parse error: Double subscript at position 23: …wn_hook_sleep_N_̲secs(response, 2)}”
]
对于单个测试用例层面的 hook 函数,除了可传入自定义参数外,还可以传入与当前测试用例相关的信息,包括请求的 $request 和响应的 $response,用于实现更复杂场景的灵活应用。
debugtalk.py:存储项目中逻辑运算辅助函数
.testcases/.yaml:测试用例文件
.testsuites/ : 测试文件集
.env(可选):存储项目环境变量,通常用于存储项目敏感信息
data/.csv(可选):存储参数化文件,或者项目依赖的文件
.api/ :接口定义(API)
.reports:默认生成测试报告的存储文件夹
生成项目目录结构
$ hrun --startproject demo
1、可以在config或者test中通过关键字variables关键字定义变量
variables: {uri: /account/employee/getAuth.do}
2、使用extract关键字从响应结果中获取关联参数值
extract:
status: status_code
code: content.code
content_type : headers.Content-Type
获取状态码:status_code
获取响应头:headers
获取响应内容:content
$var
在测试用例的同级或者父级目录下创建 debugtalk.py 文件,并在该文件中定义相关的函数或者变量。
在测试用例中通过KaTeX parse error: Expected '}', got 'EOF' at end of input: {fun(var)}引用函数
存储项目中逻辑运算辅助函数
项目工程目录
测试用例文件中的相对路径(例如.csv)均需基于项目工程根目录
debugtalk.py文件存在时,将作为项目根目录定位标记,其所在目录即被视为项目工程根目录
debugtalk.py文件不存在时,运行测试的所在路径(CWD)将被视为项目工程根目录
运行测试后,测试报告文件夹(reports)会生成在项目工程根目录
config:
name: testcase description
variables: {}
base_url: http://test-gsxboss.baijiahulian.com
测试用例名:name
用例中url公共部分:base_url
申明变量:variables
1、新建一个测试用例文件,并引用原先的测试用例。在新的测试用例文件中使用parameters关键字定义参数并指定数据源取值方法
parameters:
user_id: [1001, 1002, 1003, 1004]
2、独立参数单独进行定义
user_id: [1001, 1002, 1003, 1004]
多个参数具有关联性的参数需要将其定义在一起,采用短横线(-)进行连接
username-password:
- [“user1”, “111111”]
- [“user2”, “222222”]
- [“user3”, “333333”]
3、数据源指定支持三种方式
方法一:定义列表
user_agent: [“iOS/10.1”, “iOS/10.2”, “iOS/10.3”]
方法二:通过内置的 parameterize(可简写为P)函数引用 CSV 文件
user_id: ${P(user_id.csv)}
方法三:调用 debugtalk.py 中自定义的函数生成参数列表:该种方式最为灵活,可通过自定义 Python 函数实现任意场景的数据驱动机制,当需要动态生成参数列表时也需要选择该种方式
示例:
#在 debugtalk.py 中定义函数 get_account,生成指定数量的账号密码参数列表。
def get_account(num):
accounts = []
for index in range(1, num+1):
accounts.append(
{"username": "user%s" % index, "password": str(index) * 6},
)
return accounts
#那么在 YAML/JSON 的 parameters 中就可以调用自定义函数生成指定数量的参数列表。
config:
name: "demo"
testcases:
testcase1_name:
testcase: /path/to/testcase1
parameters:
username-password: ${get_account(10)}
方法一:先在系统中设置环境变量名称和值
export username = admin
方法2:HttpRunner 借鉴了 pipenv 加载 .env 的方式
可在项目根目录下创建.env文件,
$ cat .env
UserName=admin
Password=123456
PROJECT_KEY=ABCDEFGH
httprun时会自动将.env中的内容加载到环境变量中
方法3:–dot-env-path
若需加载不位于自动化项目根目录中的 .env,或者其它名称的 .env 文件(例如 production.env),可以采用 --dot-env-path 参数指定文件路径:
HttpRunner 中内置了函数 environ(简称 ENV)
1、在测试用例中引用环境变量:
username: ${ENV(UserName)}
2、程序中读取环境变量
import os
os.environ[‘username’]
$ hrun --validate docs/data/demo-quickstart.json docs/data/demo-quickstart.yml docs/data/demo-quickstart-0.json
$ hrun --prettify docs/data/demo-quickstart.json docs/data/demo-quickstart.yml docs/data/demo-quickstart-0.json
1、HttpRunner 中自带了一个 Jinja2 格式的报告模版
2、使用自定义模版时,需要通过 --report-template 指定报告模板的路径,然后测试运行完成后,就会采用自定义的模板生成测试报告。
1、HttpRunner 以 类(class) 的形式对外提供调用支持,类名为HttpRunner,
from httprunner.api import HttpRunner
2、初始化参数:
runner = HttpRunner(failfast=False)
resultclass: HtmlTestResult/TextTestResult,默认值为 HtmlTestResult
failfast: 设置为 True 时,测试在首次遇到错误或失败时会停止运行;默认值为 False
http_client_session: 传入requests.Session()时进行自动化测试(默认),传入locust.client.Session()时进行性能测试
3、可用调用方法
在 HttpRunner 中,对外提供了两个方法:
run: 运行测试用例
gen_html_report: 生成 HTML 测试报告
4、可用属性
在 HttpRunner 中,对外提供了一个属性:
summary: 测试执行结果
该属性需要在调用 run 方法后获取。
5、run 参数
path_or_testcases: 指定要运行的测试用例;支持传入两类参数,YAML/JSON 格式测试用例文件路径,或者标准的测试用例结构体;
dot_env_path(可选): 指定加载环境变量文件(.env)的路径,默认值为当前工作目录(PWD)中的 .env 文件
mapping(可选): 变量映射,可用于对传入测试用例中的变量进行覆盖替换。
6、生成报告
runner.gen_html_report(
html_report_name=“demo”,
html_report_template="/path/to/custom_report_template"
)