HttpRunner-04:编写测试用例(校验A类IPv4)
1.需求
假设现在有一个需求,当访问http://www.httpbin.org/ip
地址时,响应信息中包括origin字段,返回值为一个ip地址格式,需求是校验它是否符合A类的IPv4地址
引用维基百科解释:
A类IPv4地址经过进一步整理得到的范围为:1.0.0.1~127.255.255.254
,即我们的需求目的就是校验origin字段返回值是否在A类IPv4地址范围内。
2.编写测试用例(yaml)
明确需求后,我们接下进入设计用例
首先,我们在debugtalk.py
文件中定义一个校验是否为A类IPv4的方法,这样写的目的是为了在执行测试用例前,做一个前置判断,完成稍微复杂的测试场景
# add content to debugtalk.py
def is_valid_ipv4(origin):
"""
check origin in 1.0.0.1~127.255.255.254 (class A ipv4)
:param origin: ipv4
:return: origin variable or None
"""
if origin is None:
return
elif isinstance(origin, str):
value_list = origin.split('.')
if len(value_list) == 4:
_ip = [int(s) for s in value_list]
if 1 <= _ip[0] <= 127 and 0 <= _ip[1] <= 255 and 0 <= _ip[2] <= 255 and 1 <= _ip[3] < 255:
return origin
其次,在testcase目录下新建一个文件,命名为:check_origin_ip.yml
,编写一个测试用例,如下:
config:
name: httpbin接口测试练习
base_url: "http://www.httpbin.org"
verify: False
teststeps:
-
name: 检查是否为A类IPv4地址:1.0.0.1~127.255.255.254
# variables:
# origin: 192.168.1.111
extract:
origin: 'body.origin'
request:
method: GET
url: /ip
headers:
User-Agent: HttpRunner/${get_httprunner_version()}
Content-Type: "text/plain"
validate:
- eq: ['body.origin', "${is_valid_ipv4($origin)}", '不是A类IPv4地址?'] # 这里引用debugtalk文件定义的方法,写法:${调用函数},并且声明一个$origin参数,利用extract从当前 HTTP 请求的响应结果中提取参数
部分测试用例结构解释:
config
- name(必须):测试用例的名称,将在log和报告中展示。
- base_url(可选):测试用例中的通用Host,如果base_url被指定,测试步骤中的url只能写相对路径。当你要在不同环境下测试时,这个配置非常有用
- verify(可选的):指定是否验证服务器的TLS证书。如果我们想记录测试用例执行的HTTP流量,这将特别有用,因为如果没有设置verify或将其设置为True,则会发生SSLError。
teststeps
- name(必须):name用来定义测试步骤 name,将出现在log和测试报告中
- variables(可选的):测试步骤中定义的变量,作用域为当前测试步骤。如果想在多个测试步骤中共享变量,需要在config variables中定义。测试步骤中的变量,会覆盖config variables中的同名变量。
- extract(可选):从当前 HTTP 请求的响应结果中提取参数,并保存到参数变量中(例如token),后续测试用例可通过$token的形式进行引用。原理:利用jmespath 提取Json response body的内容。
- request(必须):
- METHOD(必须):http方法
- URL(必须):设置Url,如果base_url在config中设置了,url只能是相对路径部分
- HEADERS(可选):设置请求的headers
- validate(可选):测试用例中定义的结果校验项,作用域为当前测试用例,用于实现对当前测试用例运行结果的校验。
原理:用 jmespath 提取Json response的内容,并进行断言校验。
- 运算符: [jmespath表达式, expected_value, message]
运算符包括:
- equal: 等于
- contained_by: 实际结果是否被包含在预期结果中
- contains: 预期结果是否被包含在实际结果中
- endswith: 以...结尾
- greater_or_equals: 大于等于
- greater_than: 大于
- length_equal: 长度等于
- length_greater_or_equals: 长度大于等于
- length_greater_than: 长度大于
- length_less_or_equals: 长度小于等于
- length_less_than: 长度小于
- less_or_equals: 小于等于
- less_than: 小于
- not_equal: 不等于
- regex_match: 字符串是否符合正则表达式匹配规则
- startswith: 以...开头
- string_equals: 字符串相等
- type_match: 类型是否匹配
- jmespath: jmespath表达式,详见JMESPath Tutorial
- expected_value: 指定期望值或变量,也可以调用方法
- message(optional): 用于描述断言失败原因
3.运行测试用例(并生成html格式报告)
使用hrun命令执行yaml文件,并且追加生成html报告的命令--html=report.html --self-contained-html
- 执行测试用例的完整写法如下
rosaany@Rosefinch:~/demo$ hrun testcases/check_origin_ip.yml --html=report.html --self-contained-html
这时,在demo目录下生成一份report.html
文件,生成的文件命名在执行测试用例时指定
最后,结果显示一共有测试用例1条,成功1条,说明实验结果符合设计预期。