上一章:
httprunner 2.x介绍与使用_做测试的喵酱的博客-CSDN博客
下一章:
一、 api 文件夹(没有任何数据依赖的场景)
api 文件夹:执行接口case的最小单元。如果一个接口case,没有任何数据依赖,就可以直接在api文件夹中,完成编写。
如不依赖登录信息的接口:
api/baidu_api.yml
name: 百度接口
variables:
var1: value1
var2: value2
request:
url: https://ug.baidu.com/mcp/pc/pcsearch
method: POST
headers:
Content-Type: "application/json"
json:
invoke_info: {"pos_1":[{}],"pos_2":[{}],"pos_3":[{}]}
validate:
- eq: ["status_code", 200]
执行case:
hrun api/baidu_api.yml --report-dir=reports
二、 实现数据/接口依赖的case场景(testcases 文件夹)
2.1 举例
查看商品列表接口 goods/list ,依赖登录接口/user/login/
需要先通过/user/login/ 获取登录信息token
再拿着token,去请求goods/list接口。
2.1.1 在api文件夹中,编写/goods/list 接口 ,/user/login/ 的基础信息。
/user/login/ 登录接口信息:/api/login_api.yml
name: '登录api接口'
base_url: "${ENV(BASE_URL)}"
request:
url: "/user/login/"
method: POST
headers:
Content-Type: "application/x-www-form-urlencoded"
User-Agent: "Mozilla/5.0"
data:
username: "$username"
password: "$password"
verify: false
validate:
- eq: ["status_code", 200]
/goods/list 接口信息:/api/goods_list_api.yml
name: "获取项目列表数据"
base_url: "${ENV(BASE_URL)}"
request:
url: "/projects/"
method: GET
headers:
Accept: "application/json"
Authorization: "JWT $TOKEN"
params:
size: 3
page: 2
validate:
- eq: ["status_code", 200]
- eq: ["json.results.0.id", 3]
注意:
获取商品列表接口/goods/list,需要依赖token,我们在header中,编写token时,直接使用变量的形式 $TOKEN 就可以了。(在后续步骤中,我们需要提供一个名称为TOKEN的变量)
2.1.2 在testcases文件夹中,组装/goods/list用例
/testcases/goods_list_testcase.yml
# 指定用例的全局配置信息
config:
name: "获取商品列表数据接口测试"
teststeps:
-
name: "先登录"
# 指定导入api文件夹下的接口的api最小执行单元
api: "/api/login_api.yml"
# 从相应结果中提取数据,并设置变量
# 设置的变量,可以在当前yaml用例文件下方任意地方调用
extract:
- TOKEN: "content.token"
-
name: "获取项目列表数据接口"
api: "/api/goods_list_api.yml"
1、config 设置全局配置信息
2、teststeps 模块下,开始组装用例
3、第一步,先登录,调用执行登录接口/api/login_api.yml,然后将返回值token设置为变量
extract:
- TOKEN: "content.token"
3、第二步,调用获取商品接口。(不需要手动传token变量)
三、自定义函数&动态参数
整体步骤:
1、在debugtalk.py 中,自定义函数
2、在yaml文件中,调用自定义函数
3.1 、在debugtalk.py 中,自定义函数
举个例子,定义两个函数,一个是生成随机数,一个是求和。
import time
import random
def sleep(n_secs):
time.sleep(n_secs)
def get_random_num():
return random.randint(1,1000)
def get_sum(x,y):
return x+y
3.2 在yaml文件中,调用自定义函数
在yaml文件中,调用自定义函数,使用${方法名称()}
支持传参,参数也可以是变量
json:
id: "${get_random_num()}"
total: "${get_sum(1,$price)}"
四、定义测试套件testsuites
测试套件testsuites的主要作用就是:
- 1、批量执行case
- 2、用不同的变量数据,组成不同的case
我们可以将api、testcases中的所有的动态数据,以变量表示。然后在testsuites中,写入不同的变量,组成不同的case。
4.1 testsuites 中直接写入不同的变量,组成多个case
一个接口,根据不同的传参,组成不同的case。
举例:
登录接口,
testsuites/login_testsuite.yml
# 指定测试套件中的全局配置信息
config:
name: "测试条件"
# 指定套件中的用例
testcases:
-
name: "登录接口测试"
testcase: "testcases/login_testcase.yml"
parameters:
- title-username-password-status_code-msg:
- ["正常登录", "miaojiang", "123456", 200, "token"]
- ["用户名为空", "", "123456", 400, "username"]
- ["密码为空", "miaojiang", "", 400, "password"]
- ["密码不正确", "miaojiang", "1234567", 400, "non_field_errors"]
config:测试套件的全局配置
testcases: 指定调用的登录接口case
parameters: 变量模块,以下是整个接口case,所有需要的变量的输入值
- title-username-password-status_code-msg: 整个接口中,(api、testcases中)所有涉及到的变量名称,将这些变量列出来,然后在-[]中,将变量的值一一对应。如下,就是登录接口的四条case。
- title-username-password-status_code-msg:
- ["正常登录", "miaojiang", "123456", 200, "token"]
- ["用户名为空", "", "123456", 400, "username"]
- ["密码为空", "miaojiang", "", 400, "password"]
- ["密码不正确", "miaojiang", "1234567", 400, "non_field_errors"]
4.2 用csv文件存储一个接口所有case所需要的变量的值
在4.1 中,数据驱动,直接将数据写在了testsuites文件中。如果数据过多的话,会显得比较乱,我们可以将数据存储到csv文件中。
1、定义一个csv文件,存仓case数据
data/data.csv
title,username,password,status_code,msg
正常登录,miaojiang,123456,200,token
密码错误,miaojiang,123457,400,non_field_errors
账号错误,miaojiang,123456,400,non_field_errors
用户名为空,,123456,400,username
密码为空,miaojiang,,400,password
注意:
第一行,是所有涉及到的变量的名称,以逗号隔开。
2、在testsuites/login_testsuite.yml 中,引入csv文件
# 指定测试套件中的全局配置信息
config:
name: "测试条件"
# 指定套件中的用例
testcases:
-
name: "登录接口测试"
testcase: "testcases/login_testcase.yml"
parameters:
- title-username-password-status_code-msg: ${P(data/data.csv)}
注意:
1、parameters下,设置接口所有case需要的数据
2、 title-username-password-status_code-msg,是所有涉及到的变量的名称,以-分割
3、${P()} 固定格式,读取某个文件
${P(data/data.csv)}
文件路径,为相对路径,或者绝对路径
4.3 函数方法的返回值为接口所有case需要的数据
1、在debugtalk.py中,定义一个方法,返回case所有需要的数据(为一个list),
def get_accounts():
accounts = [
{"title": "正常登录", "username": "miaojiang", "password": "123456",
"status_code": 200, "msg": "token"},
{"title": "密码错误", "username": "miaojiang", "password": "123457",
"status_code": 400, "msg": "non_field_errors"},
{"title": "账号错误", "username": "miaojiang", "password": "123456",
"status_code": 400, "msg": "non_field_errors"},
{"title": "用户名为空", "username": "", "password": "123456",
"status_code": 400, "msg": "username"},
{"title": "密码为空", "username": "miaojiang", "password": "",
"status_code": 400, "msg": "password"},
]
return accounts
注意:
- 1、函数返回值,整体为一个list
- 2、list中,每一个元素,是一个字典。每一个元素/字典,就对应一条case
- 3、字典中,key为变量的名称,value为变量的值。
2、在testsuites/login_testsuite.yml 中,调用方法
# 指定测试套件中的全局配置信息
config:
name: "测试条件"
# 指定套件中的用例
testcases:
-
name: "登录接口测试"
testcase: "testcases/login_testcase.yml"
parameters:
- title-username-password-status_code-msg: ${get_accounts()}
注意:
- ${函数名称()}
五、运行测试套testsuites
格式:
hrun 测试套文件相对路径/绝对路径
举例:
hrun testsuites/login_testsuite.yml