Python接口自动化测试框架完结版--实战(二)

上篇已经介绍了一个接口测试的大概整体流程,但是并没有存在一些接口数据的依赖,今天主要介绍下如何处理接口数据的依赖问题。
以更改会员信息接口为例,文档如下:
在这里插入图片描述
基本思路:
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的属性来调用(后面也会用到)具体项目目录结构请看上一遍,链接: https://blog.csdn.net/weixin_42262081/article/details/106751223,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为框架。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久醉绕心弦,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值