1.关联参数
如何将上一个登录接口返回的token传给下一个接口当做请求参数
参数关联场景:1.登录返回token->2.下一个接口头部传token
extract提取变量
&token引用变量
config:
name:get_join
base_url:https://xx.xxx.xx.x:8001
teststeps:
-
name:get_join
request:
method:GET
url:/api/v1/goods
json:
username: 1
password: 2
extract:
token:body.token
validate:
- eq:[status_code,200]
- eq:[body.code,0]
- eq:[body.msg,success]
-
name:get_userinfo
request:
method:POST
url:/api/v1/goods
headers:
Authorization:Token $token
json:
name:test
sex:M
age:20
mail:xxx@qq.com
validate:
- eq:[status_code,200]
- eq:[body.code,0]
- eq:[body.msg,success]
2.环境变量
创建.env文件
base_url=http://
user=test
psw=123456
床架yaml文件
config:
name:get_join
base_url:${ENV(base_url)}
teststeps:
-
name:get_join
request:
method:GET
url:/api/v1/goods
variables:
username: ${ENV(user)}
password: ${ENV(psw)}
extract:
token:body.token
validate:
- eq:[status_code,200]
- eq:[body.code,0]
- eq:[body.msg,success]
3.一个测试用例引用第二个测试用例
将登录用例设置成公共用例,其他用例执行前导入此用例
login_case.yaml
config:
name:登录
expect:
-token
teststeps:
-
name:step-login
request:
method:POST
header:
Content-type:
url:https://
data:
username:admin
password:"123456"
extract:
token:body.token
validate:
- eq:[status_code,200]
- eq:[body.code,0]
- eq:[body.msg,success]
updata_info.yaml
config:
name:修改个人信息
base_url:https://
teststeps:
-
name:step-login
testcase:登录用例的性相对路径
-
name:updata_info
request:
method:POST
headers:
Authorization:Token $token
url:api/v1/userinfo
data:
username:admin
password:"123456"
validate:
- eq:[status_code,200]
- eq:[body.code,0]
- eq:[body.msg,success]
4.参数化和数据驱动
参数化是在parameters关键字
适用场景:搜索功能,步骤相同参数不同
login_case.yaml
config:
name:登录
base_url:https://
variables:
user:test1
psw:"123456"
parameters:
#user:[test1,test2,test3,test4] #四个测试用例依次替换user
user-psw:
-[test1,123456]
-[test2,123456]
-[test3,123456]
-[test4,123456]
expect:
-token
teststeps:
-
name:step-login
request:
method:POST
header:
Content-type:
url:pai/v1/login
data:
username:admin
password:"123456"
extract:
token:body.token
validate:
- eq:[status_code,200]
- eq:[body.code,0]
- eq:[body.msg,success]
4.参数化引用CSV文件
(1)在yaml/json中直接指定参数列表
该种方式最简单,适合参数列表比较小的情况
(2)通过配置的parameterize函数引用CSV文件
该种方式需要准备csv数据文件,适合数据量比较大的情况
(3)调用debugtalk.py中自定义的函数生成参数列表
该种方式最为灵活,可通过自定义python函数实现任意场景的数据驱动机制,当需要动态生成参数列表时也需要使用该方式
创建user_psw.csv
user,psw
test1,123456
test2,123456
test3,123456
login_case.yaml
config:
name:登录
base_url:https://
variables:
user:test1
psw:"123456"
parameters:
user-psw:${P(以项目的根目录查找导文件入)}
expect:
-token
teststeps:
-
name:step-login
request:
method:POST
header:
Content-type:
url:pai/v1/login
data:
username:admin
password:"123456"
extract:
token:body.token
validate:
- eq:[status_code,200]
- eq:[body.code,0]
- eq:[body.msg,success]
5.参数化引用debugtalk函数
创建debugtalk.py文件在根目录下
def get_user_id():
return [
{"user_id":test1},
{"user_id":test2},
{"user_id":test3}
]
def get_user_psw(n):
account=[]
for i in range(1,n+1):
account.append("user":"test"%i,"psw":"123456")
return acccount
def register_user():
user = "test"+str(int(time.time()))
return user
login_case.yaml
config:
name:登录
base_url:https://
variables:
user:test1
psw:"123456"
parameters:
# user_id:${get_user_id()}
user-psw:${def get_user_psw(5)}
expect:
-token
6.注册案例(随机变量)
Eg:
需求:自动化需要多次反复运行账号注册
问题:注册账号,同一个账号只能注册一次
解决思路:注册账号时添加时间(随机变量)或链接数据库删掉此变量
register.yaml
config:
name:注册
base_url:https://
variables:
user:%{register_user()}
psw:"123456"
teststeps:
-
7.hook机制(step和teardown)
setup_hooks:开始执行前触发hook函数,主要用于请求预处理(签名,加密)
teardown_hooks:执行结束后触发hook函数,主要用于返回处理(解密)
在debugtalk.py中写两个函数
def srtup_hook():
print("srtup_hook")
def teardown_hook():
print("teardown_hook")
def request_sign(request):#请求预处理,将body中带上签名参数
body = request.get('req_json')
sign="sign"
body["sigin"]=sign
request[req_json]=body
def response_status(response):#对返回的结果进行处理,将状态码改成203
response.status_code = 203
login_case.yaml
config:
name:登录
base_url:https://
variables:
user:test1
psw:"123456"
parameters:
user-psw:${P(以项目的根目录查找导文件入)}
expect:
-token
teststeps:
-
name:step-login
request:
method:POST
header:
Content-type:
url:pai/v1/login
data:
username:admin
password:"123456"
setup_hooks:
-${def srtup_hook()}
-${def request_sign($request)}
tear_hooks:
-${def teardown_hook()}
-${def response_status($response)}
extract:
token:body.token
validate:
- eq:[status_code,200]
- eq:[body.code,0]
- eq:[body.msg,success]
8.sign签名案例
9.文件上传
upload关键字上传文件
upfile.yaml
config:
name:上传文件
base_url:http://
teststeps:
-
name:step-上传文件
request:
url:/api/v1/upfile/
method:POST
upload:
file:根目录地址
title:文件
10.测试结果校验数据库状态
Eg:
修改商品信息接口,修改商品状态后,校验数据库对应的goodsstatus状态有没有更新成功
updata_goods_fromsql.yaml
config:
name:修改商品用例
base_url:http://
variables:
sp_id:1
goodsname:yoyo
...
merchantid:"1001"
price:21.0
teststeps:
-
name:step-修改商品
request:
url:/api/v1/goods/
method:PUT
json:
goodname:$goodname
goodcode:$goodcode
...
price:$price