在httprunner中,测试用例有三层结构,分别是
1.测试集合testsuite,对应一个目录,包含一个或多个测试用例文件。
2.测试用例testcase,对应单个文件,可以是yaml/json/python文件,包含一个或多个测试步骤。
3.测试步骤teststep,单个步骤。
一般采用yaml文件格式来写用例。
yaml文件的用例格式如下:
config:
name: xxx
variables: # 配置变量(config variables)
varA: "configA"
varB: "configB"
varC: "configC"
parameters: # 参数变量(parameter variables)
varA: ["paramA1"]
varB: ["paramB1"]
base_url: "https://postman-echo.com"
verify: False
export: ["foo3"]
teststeps:
-
name: step 1
...
-
name: step 2
...
实例
为了介绍yaml文件的写法,这里利用网站https://pity.fun/来进行测试。
访问网址,输入账号密码打开F12点击登录,可以看到登录接口。
https://api.pity.fun/auth/login post方法 请求体为json
{"username":"tester","password":"tester"}
响应体为json
{"code":0,"msg":"登录成功","data":{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOye8","user":{"id":6,"username":"tester","name":"tester","email":"55497569@qq.com","role":1,"phone":"11111111111","created_at":"2022-12-30 16:34:55","updated_at":"2023-03-13 15:00:09","deleted_at":0,"update_user":6,"last_login_at":"2023-03-16 22:39:26","avatar":"https://static.pity.fun/avatar/user_6.png","is_valid":true},"expire":1679236766.573221}}
login.yml
在testcase文件夹下创建login.yml,内容如下
config:
name: "登录成功"
variables:
username: tester
password: tester
expect_foo2: config_bar2
base_url: "https://api.pity.fun"
verify: False
export:
- token
teststeps:
-
name: 登录成功
variables:
foo1: bar1
request:
method: POST
url: /auth/login
headers:
Content-Type: "application/json"
json:
{"username":"$username","password":"$password"}
extract:
token: body.data.token
validate:
- eq: ["status_code", 200]
- eq: [body.code,0]
- eq: [body.msg,"登录成功"]
复制文件的相对路径,打开terminal,输入
hrun 文件名 -s
![](https://i-blog.csdnimg.cn/blog_migrate/7b00c669b9fd1494e2f4916c7f67c6cd.png)
可以看到有一条命令执行通过
接下来介绍这个yaml文件的内容
config(必须)
每个测试用例都必须有config部分。并且只能有一个config部分。
name(必须)
测试用例的名称,将在log和报告中展示。
base_url(可选)
测试用例中的通用Host,例如"https://api.pity.fun"。如果base_url被指定,测试步骤中的url只能写相对路径。当要在不同环境下测试时,这个配置非常有用。
variables(可选的)
定义的全局变量,作用域为整个用例。每个测试步骤都可以引用config variables。也就是说,step variables 优先级高于 config variables.
引用变量时,采用$变量名引用,如实例的账号名和密码,就是通过变量传入的。
parameters(可选的)
全局参数,用于实现数据化驱动,作用域为整个用例。这个后续再写。
verify(可选的)
指定是否验证服务器的TLS证书。如果我们想记录测试用例执行的HTTP流量,这将特别有用,因为如果没有设置verify或将其设置为True,则会发生SSLError。
export(可选的)
指定输出的测试用例变量。将每个测试用例看作一个黑盒,config variables是输入变量,config export是输出变量。当一个测试用例在另一个测试用例的步骤中被引用时,config export将被提取并在随后的测试步骤中使用。
在实例中,导出了token,如果下一个接口需要用到token,则可以使用。(注意不能随便用,必须两个接口在一个测试用例文件中才可以)
testcase测试用例
teststeps
每个测试用例都有1个或多个测试步骤(List[step]),每个测试步骤对应一个API请求或其他用例的引用。
![](https://i-blog.csdnimg.cn/blog_migrate/f12ffb37f9b2141afd69f910f43e64ab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b8891db61e002f5b2b5dbe5ee74c3e25.png)
name(必须)
name用来定义测试步骤 name,将出现在log和测试报告中。
variables(可选的)
测试步骤中定义的变量,作用域为当前测试步骤。
如果想在多个测试步骤中共享变量,需要在config variables中定义。
测试步骤中的变量,会覆盖config variables中的同名变量。
request(必须)
METHOD(必须)
设置http方法,支持RestFul中的所有http方法(GET/POST/PUT/PATCH/DELETE/) ,相当于requests.request 中的method。
URL(必须)
设置Url,如果base_url在config中设置了,url只能是相对路径部分。相当于requests.request 中的url。
PARAMS(可选)
设置Url的query,相当于requests.request 中的params,用于当请求方法为GET方法时。
HEADERS(可选)
设置请求的headers,相当于requests.request 中的headers。如实例中的请求头
Content-Type: "application/json"
COOKIES(可选)
设置Http请求的cookies,相当于requests.request 中的cookies。
DATA(可选)
设置http请求的Body,相当于requests.request 中的data。
JSON(可选)
设置http请求json格式的body,相当于requests.request 中的json。
实例中请求体就是json格式
extract(可选)
从当前 HTTP 请求的响应结果中提取参数,并保存到参数变量中(例如token),后续测试用例可通过$token的形式进行引用。
原理:利用jmespath 提取Json response body的内容。
实例中从body.data.toke提取出token,并命名为token。
validate(可选)
测试用例中定义的结果校验项,作用域为当前测试用例,用于实现对当前测试用例运行结果的校验。
原理:用jmespath 提取Json response的内容,并进行断言校验。
实例中的断言了响应状态码为200,并且断言了响应体的两个body中的code和msg。
hooks(可选)
测试步骤中引用测试用例
新建文件query.yml,写入如下内容并运行,可以看到运行了两个步骤且成功。
这个用例有两个步骤,其中第一个步骤引用了登录文件。
第二个步骤使用$token的方法,调用了步骤一导出的token变量。
在引用测试用例的步骤中,可以用变量,注意不能用其他如断言关键字,导出
config:
name: "查询用户信息"
base_url: "https://api.pity.fun"
teststeps:
- name: 登录成功
testcase: ./testcases/login.yml
-
name: 查询用户信息
request:
method: GET
url: /auth/query?token=$token
validate:
- eq: ["status_code", 200]
- eq: [body.code,0]
- eq: [body.msg,"操作成功"]
variables
跟request中的variables一样
testcase
指定引用的测试用例
export
从引用的测试用例中提取的变量,该变量在后面的test steps中可以引用
testsuite测试集合
测试集合是一个目录,其下的每个文件都是一个测试集
如下例,使用关键字testcases定义的就是测试集合,测试集合下的是一个个测试用例。
tesecase中引用测试用例文件。
这里比在teststeps中方便的是,可以写extract和validate。
需要注意的是,在testcases里,只能引用其他文件,不支持写request关键字
config:
name: "查询用户信息"
base_url: "https://api.pity.fun"
testcases:
- name: 登录成功
testcase: ./testcases/login.yml
extract:
token: body.data.token
validate:
- eq: [ "status_code", 200 ]
- eq: [ body.code,0 ]
- eq: [ body.msg,"登录成功" ]
-
name: 查询用户信息
testcase: ./testcases/query_custom.yml
validate:
- eq: ["status_code", 200]
- eq: [body.code,0]
- eq: [body.msg,"操作成功"]
![](https://i-blog.csdnimg.cn/blog_migrate/91f53023a2c19c2ad7c520c13f10e79f.png)