基于Python+requests搭建的自动化框架-实现流程化的接口串联
框架产生目的:公司走的是敏捷开发模式,编写这种框架是为了能够满足当前这种发展模式,用于前后端联调之前(后端开发完接口,前端还没有将业务处理完毕的时候)以及日后回归阶段,方便为自己腾出学(mo)习(yu)时间。
鄙人一介小测试,一手承接产品,一手面对开发(4个后端,3个web前端,外加不知道几个的乙方),项目经手了5批人,鄙人是第5批的测试,规范没有,前人积累没有,天崩开局/(ㄒoㄒ)/~~。
老规矩,上图:
getparhInfo.py:获取autoapi文件夹所在的目录,便于项目换家,有没有其实无所谓的;
import os def get_path():
path = os.path.split(os.path.realpath(__file__))[0]
return path if __name__ == '__main__':
print('测试路径是否OK,路径为:', get_path())
readConfig.py
import os
import configparser
import getpathInfo path = getpathInfo.get_path()
config_path = os.path.join(path, 'config')
config = configparser.ConfigParser() # 调用外部的读取配置文件的方法
config.read(config_path, encoding='utf-8') class ReadConfig(): def get_http(self, name):
value = config.get('HTTP', name)
return value def get_email(self, name):
value = config.get('EMAIL', name)
return value def get_account(self, name):
value = config.get('ACCOUNT', name)
return value 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()里再加个入参。
import json
import requests from common.logs import log
from readConfig import environment,mobile_phone,password
from case.api.User import login
import urllib3
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'} class RunMain():
def send_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) # 请求状态码
return response def send_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)
return response def run_main(self, method, path=None, data=None):
result = None
if method.lower() == 'post':
result = self.send_post(path, data)
elif method.lower() == 'get':
result = self.send_get(path, data)
else:
print("method值错误!!!")
return result if __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了”)
参考文献:
自动化测试框架:
https://blog.csdn.net/songlh1234/article/details/84317617 # 框架主体都是这位老哥的,文抄公的水平您还满意?
https://www.jianshu.com/p/9d3f991c901a
https://www.cnblogs.com/peter200-OK/p/9086087.html # 这个慎重,或许是鄙人太菜了,没有抄好这个作业
框架期间问题解决:
unittest用例间传参:
【python接口自动化框架-unittest】如何传参数到下一个case - WANG-X - 博客园 (cnblogs.com)
部分请求如: /v1/verify?clazz=1,2,3,4,5 解决方案如下:
python-map的用法 - lincappu - 博客园 (cnblogs.com)
基于Python+requests搭建的自动化框架-实现流程化的接口串联的更多相关文章
- 基于Python+Requests+Pytest+YAML+Allure实现接口自动化
本项目实现接口自动化的技术选型:Python+Requests+Pytest+YAML+Allure ,主要是针对之前开发的一个接口项目来进行学习,通过 Python+Requests 来发送和处理H ...
- 基于Python Requests的数据驱动的HTTP接口测试
发表于:2017-8-30 11:56 作者:顾翔 来源:51Testing软件测试网原创 http://www.51testing.com/html/69/n-3720769-2.html ...
- 从Theano到Lasagne:基于Python的深度学习的框架和库
从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...
- 基于Python3.7 Robot Framework自动化框架搭建
一.Robot Framework 和 Selenium 的区别(面试常问) 主流自动化测试框架有Robot Framework 和 Selenium,请根据实际场景选用不同的框架,以下总结各自优缺点 ...
- 基于PO和单例设计模式用python+selenium进行ui自动化框架设计
一)框架目录的结构 二)config包当中的config.ini文件主要是用来存项目的绝对路径,是为了后续跑用例和生成测试报告做准备然后目前的配置文件大都会用yaml,ini,excel,还有.py也 ...
- 基于python+requests的简单接口测试
在进行接口测试时,我们可以使用已有的工具(如:jmeter)进行,也可以使用python+requests进行.以下为简单的接口测试模板: 一.提取常用变量,统一配置 新建一个config.py文件, ...
- 基于Python的Webservice开发(四)-泛微OA的SOAP接口
一.功能需求 泛微e-cology可以在流程中调用Webservice接口实现与其他系统的联动等复杂功能.但是目前泛微文档中仅提供了调用的方法,但是没有关于接口的相关开发信息. 本次案例是用Pytho ...
- python 3.6 + robotFramework自动化框架 环境搭建、学习笔记
################################################################# #author: 陈月白 #_blogs: http://www.c ...
- 基于python的App UI自动化环境搭建
Android端Ui 自动化环境搭建 一,安装JDK.SDK 二,添加环境变量 Widows:1.系统变量→新建 JAVA_HOME 变量E:\Java\jdk1.7.0 jdk安装目录 2.系统变量 ...
随机推荐
- windows下安装redis集群
前几天在自己在本机win10 电脑下部署了redis集群. 主要通过的是网上两个博客: 如何在windows下部署redis集群:https://blog.csdn.net/zsg88/article ...
- codefroces中的病毒,这题有很深的trick,你能解开吗?
大家好,欢迎阅读周末codeforces专题. 我们今天选择的问题是contest 1419的C题,目前有接近8000的人通过了本题.今天这题的难度不大,但是真的很考验思维,一不小心就会踩中陷阱,我个 ...
- Redis---09Redis集群(二)
一.集群的Jedis开发: 1.导入jar包 jedis-2.8.1.jar commons-pool2-2.4.2.jar 2.代码 public class TestCluster { publi ...
- 如何学习C语言
总结学习 C 语言的几个步骤,其他编程语言基本类似. 看书 学习一门编程语言少不了先学习基本语法. C语言的语法也就是变量,数组.指针.表达式.逻辑操作.函数,宏定义等等.学习这些先买一本入门级书籍, ...
- STM32入门系列-介绍STM32型号与功用
作为STM32初学者,一般会选择购置一块开发板,因为在开发板上有很多已经集成好的模块,如红外模块.按键模块.LED模块.DAC模块.ADC模块.can模块.485模块.以太网模块.WiFi模块.蜂鸣器 ...
- Java学习的第十三天
1.object类及其方法 Java类的浅层克隆,深层克隆 2.克隆很难 3.明天学习java的继承,关键字
- pandas基础读写
一.数据库读写 --以mysql为例子 1.连通器的使用 ①连通器 from sqlalchemy import create_engine 连通器=create_engine('mysql+pymy ...
- 最简单的基于FFmpeg的直播系统开发移动端例子:IOS 视频解码器
本文记录IOS平台下基于FFmpeg的视频解码器.该示例C语言的源代码来自于<最简单的基于FFMPEG+SDL的视频播放器>.相关的概念就不再重复记录了. 源代码 项目的目录结构如图所示. ...
- C++ 数据结构 4:排序
1 基本概念 1.1 定义 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的数据元素调整为"有序"的数据元素. 1.2 数学定义 假设含n个数据元素的 ...
- 【笔记】nrf52832广播使用--厂商自定义数据应用
需求: 1)使用蓝牙不停发送ble广播,发送自定义的数据,并每一秒更新自定义数据. 2)设置不同的发射功率.广播间隔.广播名称 1.初始化 使用nordic官方sdk17版本,打开一个ble串口用例. ...