HttpRunner

HttpRunner基础知识

1 是什么

HttpRunner是开源的API测试工具,具有丰富的插件化机制和高度的可扩展能力。可将抓包后导出的har文件转换为Json/Yaml格式的测试数据,再根据测试数据自动生成基于pytest的测试用例,然后进行用例运行。也可以结合Locust进行性能测试。

2 设计理念

  • 约定大于配置:测试用例是标准结构化的,格式统一
  • 支持与 HAR/Postman/Swagger/Curl/JMeter 等工具对接,轻松实现用例生成和转换

3 核心特性

  • 用例支持多种格式
  • 支持录制&生成测试用例
  • 复杂场景:基于 variables/extract/validate/hooks 机制可以方便地创建任意复杂的测试场景

4 核心概念

4.1 测试用例(TestCase)

  • 测试用例应该是完整独立的,每条测试用例都应该可以独立运行
  • 每个YAML/JSON文件对应一条测试用例
  • 已测试用例为核心,将任意测试场景抽象为有序步骤的集合

4.2 变量(variables)

约定通过 ${}$ 的形式来引用变量

4.3 函数(functions)

约定通过${}的形式来调用插件函数

1
${func{$a,$b}}

4.4 参数提取(extract)

通过JsonPath表达式或者正则表达式(regex)来进行提取

4.5 自定义函数(debugtalk.py)

即函数助手,函数的实现逻辑写在这个文件里面

4.6 参数化数据驱动(parameterize)

4.7 Hook机制(hooks)

用于实现测试步骤前后置操作,类似于pytest中的setUp和tearDown

4.8 结果校验(validate)

结果校验内容包含了 4 个字段,分别是字段提取表达式、断言函数、预期结果以及提示信息

  • 字段提取表达式:用于提取目标字段用作断言函数的输入,支持 jmespath 表达式和正则表达式(regex)两种提取方式
  • 断言函数:顾名思义,就是用于对目标字段与预期结果是否满足相等、大小、包含、被包含等关系进行断言的函数,目前支持内置函数,不支持自定义拓展
  • 预期结果:指定断言的预期结果,用作断言函数的另一个输入
  • 提示信息:当前断言操作对应的提示信息,该字段为选填

5 常用命令

  • hrun:主要运行测试用例
  • hmake:将yaml/json格式的用例数据转换为pytest测试用例
  • har2case:将har文件转化为yaml/json格式的测试用例
  • locust:性能测试

6 用例格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
config:
name: "request methods testcase with functions"
variables:
foo1: config_bar1
foo2: config_bar2
expect_foo1: config_bar1
expect_foo2: config_bar2
base_url: "https://postman-echo.com"
verify: False
export: ["foo3"]

teststeps:
-
name: get with params
variables:
foo1: bar11
foo2: bar21
sum_v: "${sum_two(1, 2)}"
request:
method: GET
url: /get
params:
foo1: $foo1
foo2: $foo2
sum_v: $sum_v
headers:
User-Agent: HttpRunner/${get_httprunner_version()}
extract:
foo3: "body.args.foo2"
validate:
- eq: ["status_code", 200]
- eq: ["body.args.foo1", "bar11"]
- eq: ["body.args.sum_v", "3"]
- eq: ["body.args.foo2", "bar21"]
-
name: post raw text
variables:
foo1: "bar12"
foo3: "bar32"
request:
method: POST
url: /post
headers:
User-Agent: HttpRunner/${get_httprunner_version()}
Content-Type: "text/plain"
data: "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3."
validate:
- eq: ["status_code", 200]
- eq: ["body.data", "This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32."]
-
name: post form data
variables:
foo2: bar23
request:
method: POST
url: /post
headers:
User-Agent: HttpRunner/${get_httprunner_version()}
Content-Type: "application/x-www-form-urlencoded"
data: "foo1=$foo1&foo2=$foo2&foo3=$foo3"
validate:
- eq: ["status_code", 200]
- eq: ["body.form.foo1", "$expect_foo1"]
- eq: ["body.form.foo2", "bar23"]
- eq: ["body.form.foo3", "bar21"]
------------- End -------------