上篇已经介绍了一个接口测试的大概整体流程,但是并没有存在一些接口数据的依赖,今天主要介绍下如何处理接口数据的依赖问题。
以更改会员信息接口为例,文档如下:
基本思路:
1.更改会员信息,首先是登录状态下,所以会依赖登录接口
2.此项目用的是token的机制,需要获取登录返回的token
3.获取登录后的member_id
根据以上三点简单的写了一下测试用例如下,data里面的member_id与headers里面的token是需要替换的。
member_id可以写死一个,每次都去修改此用户的昵称也是可以的,每次去获取替换也是没问题的。但是token每次登录后是会变的,所以每次实时去获取是最合理的。
member_id与token该如何获取?登录的接口这里就不详细介绍了,直接把登录封装起来,用来获取member_id与token来看下登录成功的响应结果:
from common.handler_request import visit
from jsonpath import jsonpath
def login(): # 用户登录
res = visit('http://xxxx/login', method='post', json={'mobile_phone':'13800138000','pwd':'12345678'})# 请求接口
member_id = jsonpath(res, "$..id")[0]
token_type = jsonpath(res, "$..token_type")[0]
token = jsonpath(res, "$..token")[0]
Token = token_type + " " + token
return {'member_id': member_id, 'token': Token}
print(login())
运行结果:
{'member_id':1,'token':'Bearer eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjEyMDAxLCJleHAiOjE1OTMzMzI0OTB9._5xOyZ490Tom8iFVg0S1xWu1Jk4xYPeSel7KhG6EU03jdf3zDZpH3UC7qWgAYWqlSEbekFsiv-HxznNPs1Xdlg'}
此方法也可以放到中间层的handler当中,可以调用实例方法login获取member_id与token,也可以把member_id与token做为Handler的属性来调用(后面也会用到)具体项目目录结构请看上一遍,链接: ,Handler类的代码如下:
import os
from common import read_yaml
from common import path_config
from common import handler_excel
from common import logger_handler
from common.handler_request import visit
from jsonpath import jsonpath
class Handler:
root_path=path_config#文件路径
yaml_info=read_yaml.read_yaml(os.path.join(root_path.CONFIG_PATH,'config.yml'))#配置文件内容
###excel
#这里的__表示此类的私有属性,外部不可以调用
__case_name = yaml_info['excel']['file_name']# 获取excel用例的名称
__casepath = os.path.join(root_path.DATA_PATH,__case_name)# 获取excel文件的路径
excel= handler_excel.ExcelMothed(__casepath)# 初始化
@property#表示为类的属性
def token(self):
return self.login()['token']
@property#表示为类的属性
def member_id(self):
return self.login()['member_id']
def login(self): # 用户登录
res = visit('http://api.lemonban.com/futureloan/member/login', method='post',json={'mobile_phone':'13800138000','pwd':'12345678'})# 请求接口
print(res)
member_id=jsonpath(res, "$..id")[0]
token_type = jsonpath(res, "$..token_type")[0]
token = jsonpath(res, "$..token")[0]
Token = token_type + " " + token
return {'member_id': member_id,'token': Token}
def logger(self,name):
__log_path = os.path.join(path_config.LOG_PATH, 'logs')
__log_info = Handler.yaml_info['log']
Logger = logger_handler.get_logger(name,__log_path,
logger_level= __log_info['logger_level'],
stream_level= __log_info['stream_level'],
handler_level= __log_info['file_level'])
return Logger
if __name__=="__main__":
print(Handler().login())
实现更新用户信息的接口用例如下:
import unittest
import ddt
from common.handler_request import visit
import json
from middleware import handler
logger=handler.Handler().logger('update')
update_cases=handler.Handler.excel.get_case('update')
@ddt.ddt
class TestUpdate(unittest.TestCase):
@ddt.data(*update_cases)
def test_update(self,cases):
if "#member_id#" in cases['data']:
cases['data']=cases['data'].replace("#member_id#",str(handler.Handler().member_id))
if "#token#" in cases['headers']:
cases['headers']=cases['headers'].replace('#token#',str(handler.Handler().token))
res=visit(cases['url'],cases['method'],json=json.loads(cases['data']),headers=json.loads(cases['headers']))
try:
self.assertEqual(json.loads(cases['expected'])['code'],res['code'])
self.assertEqual(json.loads(cases['expected'])['msg'], res['msg'])
logger.info('用例成功')
except AssertionError as e:
logger.error('用例失败')
raise e
运行结果:
update--2020-06-28 16:44:55,189--test_updata.py--22--INFO:用例成功
update--2020-06-28 16:44:54,350--test_updata.py--22--INFO:用例成功
update--2020-06-28 16:44:54,831--test_updata.py--22--INFO:用例成功
每次执行的时候都会重新生成member_id与token。
代码基本已经实现,但是有个问题,如果excel中要背替换的数据有好多,那是不是就需要去写好的的if然后替换,if然后替换…显然有点繁琐,这里介绍一种用正则表达式的方法去替换数据,也封装在了Handler类中: 正则入门篇,代码如下:
def replace_data(self,data):#正则替换数据
while re.search(r'#(.+?)#',data):#search去查找data中匹配的字符
key=re.search(r'#(.+?)#',data).group(1)#key为查到的字符串
value=getattr(self,key,'')#value为获取到的Handler的属性
data=re.sub('#(.+?)#',str(value),data,1)#直到data中没有可以替换的字符后结束循环
return data
需要注意的是excel中被替换的用例数据需要与Handler类中定义的属性保持一致,否则会替换不成功。
最后代码:
import unittest
import ddt
from common.handler_request import visit
import json
from middleware import handler
logger=handler.Handler().logger('update')
update_cases=handler.Handler.excel.get_case('update')
@ddt.ddt
class TestUpdate(unittest.TestCase):
@ddt.data(*update_cases)
def test_update(self,cases):
data=json.loads(Handler().replace_data(cases['data']))
headers=json.loads(Handler().replace_data(cases['headers']))
res=visit(cases['url'],cases['method'],json=json.loads(cases['data']),headers=json.loads(cases['headers']))
try:
self.assertEqual(json.loads(cases['expected'])['code'],res['code'])
self.assertEqual(json.loads(cases['expected'])['msg'], res['msg'])
logger.info('用例成功')
except AssertionError as e:
logger.error('用例失败')
raise e
关于接口自动就写这么多吧,写的不是很好,欢迎大佬指点。。
接下来准备更新web端ui自动化的知识,以python+pytest+selenium为框架。