python程序接口化_基于Python+requests搭建的自动化框架-实现流程化的接口串联

框架产生目的:公司走的是敏捷开发模式,编写这种框架是为了能够满足当前这种发展模式,用于前后端联调之前(后端开发完接口,前端还没有将业务处理完毕的时候)以及日后回归阶段,方便为自己腾出学(mo)习(yu)时间。

鄙人一介小测试,一手承接产品,一手面对开发(4个后端,3个web前端,外加不知道几个的乙方),项目经手了5批人,鄙人是第5批的测试,规范没有,前人积累没有,天崩开局/(ㄒoㄒ)/~~。

老规矩,上图:

getparhInfo.py:获取autoapi文件夹所在的目录,便于项目换家,有没有其实无所谓的;

importosdefget_path():

path= os.path.split(os.path.realpath(__file__))[0]returnpathif __name__ == '__main__':print('测试路径是否OK,路径为:', get_path())

readConfig.py

importosimportconfigparserimportgetpathInfo

path=getpathInfo.get_path()

config_path= os.path.join(path, 'config')

config= configparser.ConfigParser() #调用外部的读取配置文件的方法

config.read(config_path, encoding='utf-8')classReadConfig():defget_http(self, name):

value= config.get('HTTP', name)returnvaluedefget_email(self, name):

value= config.get('EMAIL', name)returnvaluedefget_account(self, name):

value= config.get('ACCOUNT', name)returnvalue

environment= ReadConfig().get_http('environment') # 切换环境

mobile_phone= ReadConfig().get_account('mobile_phone')

password= ReadConfig().get_account('password')

parent_username= ReadConfig().get_account('parent_phone')

parent_pwd= ReadConfig().get_account('parent_pwd')

common:公共方法文件夹,最省事配置:日志封装(中文日志在这里要留意,有坑),请求封装(如果有token之类的限制的话)

logs.py

import logging

import time

from getpathInfo import get_path

class Log(object):

def __init__(self, logger=None):

"""

指定保存日志的文件路径,日志级别,以及调用文件

将日志存入到指定的文件中

"""

# 创建一个logger

self.logger = logging.getLogger(logger)

self.logger.setLevel(logging.DEBUG)

# 创建一个handler,用于写入日志文件

self.log_time = time.strftime('%Y-%m_%d_')

self.log_path = get_path()+'\log\'

self.log_name = self.log_path + self.log_time + 'test.log'

fh = logging.FileHandler(self.log_name, 'a', encoding='utf-8') # 追加模式,防止中文乱码

fh.setLevel(logging.INFO)

# 再创建一个handler,用于输出到控制台

ch = logging.StreamHandler()

ch.setLevel(logging.INFO)

# 定义一个handler的输出样式

formatter = logging.Formatter(

'[%(asctime)s] %(filename)s->%(funcName)s line:%(lineno)d [%(levelname)s]%(message)s')

fh.setFormatter(formatter)

ch.setFormatter(formatter)

# 给logger添加handler

self.logger.addHandler(fh)

self.logger.addHandler(ch)

# 添加下面一句,在记录日志之后移除句柄

fh.close()

ch.close()

def getLog(self):

return self.logger

log = Log().getLog()

if __name__ == '__main__':

log.info('日志')  # 抄过来的代码一定要进行测试

configHttp.py

这里是默认加上token的,但是并不是所有接口都是需要token,解决思路:再加个configHttpNormal.py,或者run_main()里再加个入参。

importjsonimportrequestsfrom common.logs importlogfrom readConfig importenvironment,mobile_phone,passwordfrom case.api.User importloginimporturllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 如果有抓包需求,需要把verify设置成False,这行代码忽略系统之后的警告"""这个文件主要来通过get、post等方法来进行http请求,并拿到请求响应"""token=login(mobile_phone,password) # 登录方法

headers= {'Authorization': token,"Content-Type": 'application/json;charset=UTF-8','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'}classRunMain():defsend_post(self, path, data):

response= requests.post(url=environment+path,data=json.dumps(data,ensure_ascii=False,separators=(',',':')).encode('utf-8'), headers=headers,verify=False)

log.info(path)  # path

log.info(data)  # 请求,便于复现

log.info(response.status_code)  # 请求状态码returnresponsedefsend_get(self, path, data):

response= requests.get(url=environment+path, data=data, headers=headers,verify=False)

log.info(path)

log.info(data)

log.info(response.status_code)returnresponsedef run_main(self, method, path=None, data=None):

result=Noneif method.lower() == 'post':

result=self.send_post(path, data)elif method.lower() == 'get':

result=self.send_get(path, data)else:print("method值错误!!!")returnresultif __name__ == '__main__':

result1= RunMain().run_main('get', '/v1/wrong-work/info?type=1').json()

result2= RunMain().run_main('Get', '/v1/wrong-work/info?type=2').json()print(result1)print(result2)

case:用例文件夹,敏捷模式中开发提测基本上都是单接口提测,而且同一个模块下的接口分给了不同的开发,为了方便定位到开发,所以我将平台所有的接口都写了过来╮(╯▽╰)╭,

老规矩,下方直接执行,可以进行单接口的相关验证。

相信各位也看了很多的接口自动化测试框架,我上面的应该没有多少新意,下面就是不同点;

regression_testing 顾名思义,回归测试ing,只有进行时,没有完成时……

鄙人将前端的业务逻辑通过接口层模拟了过来,做了许久之后,不禁产生了怀疑:这都是哪位鬼才设计的?没有被开发XX了吗?

上图是使用unittest框架进行的,用例之间传参用法其实就是我上面展示的一部分;

其实这个文件夹下不适合使用unittest框架,因为通过用例之间的巧妙设计,虽然可以将业务之间的调用状态都模拟出来,但是由于脏数据的存在,某些bug没有在这些测试过程中表示出来。

哎,苦命啊,前端赶紧进行插桩操作,报错日志上传起来;鄙人只能放大招了,拾起了爬虫思路,自动遍历吧(穷举);

放代码片段,哎,遍历一时爽,重构火葬场(json目录深了之后,是真的不想看)。

之后优化思路:将regression_testing里面的方法改成test_*,写一个run方法,加上测试报告,邮件通知(ps:但鄙人不用啊,就十个人,遇到bug,tapd复制上参数,“老哥,出bug了”)

参考文献:

自动化测试框架:

框架期间问题解决:

unittest用例间传参:

【python接口自动化框架-unittest】如何传参数到下一个case – WANG-X – 博客园 (cnblogs.com)

部分请求如: /v1/verify?clazz=1,2,3,4,5 解决方案如下:

python–map的用法 – lincappu – 博客园 (cnblogs.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值