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

时间:2022-07-14 09:52:24

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

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

老规矩,上图:

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

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

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

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

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

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

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

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

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

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

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

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

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

之后优化思路:将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搭建的自动化框架-实现流程化的接口串联的更多相关文章

  1. 基于Python+Requests+Pytest+YAML+Allure实现接口自动化

    本项目实现接口自动化的技术选型:Python+Requests+Pytest+YAML+Allure ,主要是针对之前开发的一个接口项目来进行学习,通过 Python+Requests 来发送和处理H ...

  2. 基于Python Requests的数据驱动的HTTP接口测试

    发表于:2017-8-30 11:56  作者:顾翔   来源:51Testing软件测试网原创 http://www.51testing.com/html/69/n-3720769-2.html   ...

  3. 从Theano到Lasagne:基于Python的深度学习的框架和库

    从Theano到Lasagne:基于Python的深度学习的框架和库 摘要:最近,深度神经网络以“Deep Dreams”形式在网站中如雨后春笋般出现,或是像谷歌研究原创论文中描述的那样:Incept ...

  4. 基于Python3.7 Robot Framework自动化框架搭建

    一.Robot Framework 和 Selenium 的区别(面试常问) 主流自动化测试框架有Robot Framework 和 Selenium,请根据实际场景选用不同的框架,以下总结各自优缺点 ...

  5. 基于PO和单例设计模式用python+selenium进行ui自动化框架设计

    一)框架目录的结构 二)config包当中的config.ini文件主要是用来存项目的绝对路径,是为了后续跑用例和生成测试报告做准备然后目前的配置文件大都会用yaml,ini,excel,还有.py也 ...

  6. 基于python+requests的简单接口测试

    在进行接口测试时,我们可以使用已有的工具(如:jmeter)进行,也可以使用python+requests进行.以下为简单的接口测试模板: 一.提取常用变量,统一配置 新建一个config.py文件, ...

  7. 基于Python的Webservice开发(四)-泛微OA的SOAP接口

    一.功能需求 泛微e-cology可以在流程中调用Webservice接口实现与其他系统的联动等复杂功能.但是目前泛微文档中仅提供了调用的方法,但是没有关于接口的相关开发信息. 本次案例是用Pytho ...

  8. python 3.6 + robotFramework自动化框架 环境搭建、学习笔记

    ################################################################# #author: 陈月白 #_blogs: http://www.c ...

  9. 基于python的App UI自动化环境搭建

    Android端Ui 自动化环境搭建 一,安装JDK.SDK 二,添加环境变量 Widows:1.系统变量→新建 JAVA_HOME 变量E:\Java\jdk1.7.0 jdk安装目录 2.系统变量 ...

随机推荐

  1. golang: 常用数据类型底层结构分析

    虽然golang是用C实现的,并且被称为下一代的C语言,但是golang跟C的差别还是很大的.它定义了一套很丰富的数据类型及数据结构,这些类型和结构或者是直接映射为C的数据类型,或者是用C struc ...

  2. CUICatalog: Invalid asset name supplied:

    [UIImage imageNamed:name];但是这个name却是空的,所以就报了这个错了. 解决方法,在项目中搜索UIImage imageNamed:,然后打印看看所谓的name是否为空.找 ...

  3. Unix/Linux环境C编程入门教程(30) 字符串操作那些事儿

    函数介绍 rindex(查找字符串中最后一个出现的指定字符) 相关函数 index,memchr,strchr,strrchr 表头文件 #include<string.h> 定义函数 c ...

  4. swig编译GDAL的C&num;库时遇到的代码安全问题及解决方法

    之前一直用的是别人编译好的gdal库开发,今天自己编译了gdal的2.0.0版本,踩了不少坑,但总算解决了. 编译方法主要参考http://blog.csdn.net/liminlu0314/arti ...

  5. nginx配置默认首页(index&period;htnl index&period;htm)全流程(包含遇到问题的解决)

    需求: 自己有个域名,原来直接扔在了服务器的文件夹里(根据客服人员指导),自己玩了一遍nginx的安装部署等操作之后,域名的指向发生了改变,到了nginx成功的界面. 自己抱着极大的好奇心来配置ngi ...

  6. elasticsearch常用命令

    elasticsearch的rest访问格式: curl -X<REST Verb> <Node>:<Port>/<Index>/<Type&gt ...

  7. urls 管理

    问题阐述:如何管理多个app下的路由分发,使得管理更加清晰? 1. 在app下创建urls.py文件 from django.conf.urls import url from django.urls ...

  8. Java &equals;&equals; 和 equals 区别

    先来看一段代码 1. String str1 = new String("hello");//堆中分配一块内存,存放"hello",str1 指向内存地址 2. ...

  9. ADOQuery的ltBatchOptimistic状态下的用法

    在ADO的ltBatchOptimistic状态下(即缓存状态),如何实现单条记录的删除与修改,也可以选择的删除或修改? 一样的删除,只是最后提交方式不一样,以前的提交最后加上try   ADOCon ...

  10. php ob静态缓存

    <?php ob_start(); //打开输出缓冲区 $cacheTime = 864000; //设置缓存页面过期时间 $cacheDir = 'cacheDir'; //设置缓存页面文件目 ...