接口自动化测试框架-AIM

3天精通Postman接口测试,全套项目实战教程!!

最近在做公司项目的自动化接口测试,在现有几个小框架的基础上,反复研究和实践,搭建了新的测试框架。利用业余时间,把框架总结了下来。

AIM框架介绍

AIM,是Automatic Interface Monitoring的简称,即自动化接口监测。是一种基于python unittest的自动化接口测试框架。

设计思想

框架根据python语言的特点,结合了面向对象和面向函数编程。

以高效编程为主要目的,避免为了封装而封装。轻配置,重编码。

接口测试的主要处理对象是参数。如果完全进行数据与代码的分离,就会造成变量,传参的冗余,降低编程效率。

于是从不做数据与代码分离出发,对于需要复用的参数,提取到类之外,视需要进行数据与代码的分离。

做到有的放矢。兼顾效率和复用性,迭代分离,更具实用性。

1552446647735

目录结构

1557469790003

case:测试用例

common:公共函数,全局变量

config:配置路径等

data:数据文件

result:测试结果

util:工具类

run.py:用例执行入口

run_mail.py:执行后自动发送邮件入口

case

BaseCase

所有Case的基类。

封装了requests库的post和get函数req,用于发送请求。

调用assertEqual等方法,封装了用例的断言。比如检查接口返回flag,检查接口状态200,检查值相等。

项目Case

测试系统的用例。按模块分别建立文件编写脚本。

Env.py:环境配置,包括url处理,登录对象login实例(用户名、密码),数据库对象dao实例(数据库连接)。

Public.py:公共模块。存放本系统公共的变量、函数、用例等。

common

Func.py:公共函数,比如获取时间日期,获取随机数,处理参数。

Login.py:登录模块,属于各系统通用,故放于此目录下。包括密码加密,验证码处理,强制登录。

Var.py:全局变量。比如token。

config

RelativePath.py:配置目录、文件的相对路径。

data

echarts数据存储csv文件,项目接口清单等。

result

log:日志。logging实现。支持输出到文件和打印控制台。文件暂时使用较少,主要打印控制台便于调试。

接口调用记录:输出每个测试方法调用接口的记录,包括参数、响应、耗时等。

自动化测试报告:HTMLTestRunner.py实现的html页面报告。

util

AutoCode.py:自动生成结构化测试代码。

CSV.py:csv相关函数封装。比如输出接口调用记录。

Excel.py:读取和存储excel文件。

Format.py:格式化。比如把浏览器复制的参数格式化为代码中带有缩进的json。

HTMLTestRunner.py:用于输出自动化测试报告。

Log.py:封装日志方法。

Mysql.py:数据库相关操作。

Parewise.py:结对测试。一种测试技术,后文详述。

Request.py:核心工具,封装接口发送请求。

Mail.py:发送邮件。

run.py

执行测试用例入口,可以选择执行一个或多个系统,也可以执行一个系统中一个或多个模块。

核心模块

BaseCase.req

通过requests封装的发送接口请求的方法。

定义在BaseCase类的内部。

参数说明
p将url、headers、body、method统一封装到一个json里面进行处理。
method='post'默认为post方法。接口以post居多。
jsondata='json'默认json参数。post方法的json或data,纯json使用json参数即可。对于receive_json这种dict,采用data参数。
loglevel=3默认为3。日志级别,输出请求、响应信息到控制台或接口调用记录.csv。
rtext=None一些get请求会返回html或pdf,在控制台或csv文件中影响显示,可以指定文本进行替换。

发送请求,并计算耗时:

        start = time.clock()if method == 'post':  # 关闭SSL认证if jsondata == 'json':r = self.timeoutTry("requests.post(p['url'], headers=p['headers'], json=p['body'], verify=False)", p)elif jsondata == 'data':r = self.timeoutTry("requests.post(p['url'], headers=p['headers'], data=p['body'], verify=False)", p)else:print('jsondata错误')elif method == 'get':r = self.timeoutTry("requests.get(p['url'], headers=p['headers'], params=p['body'])", p)else:print('method错误')end = time.clock()elapsed = decimal.Decimal("%.2f" % float(end - start))

其中的self.timeoutTry是为了处理响应超时,会在后续博文中介绍。

Parewise

结对测试。接口参数一般是多个,于是比较适合采用parewise进行用例设计。

parewaise的概念可以百度一下。

大概意思就是,大多数的bug都是条件的两两组合造成的,parewise就是针对两两组合的情况,设计测试用例。

算法为,如果某一组用例的组合结果,在其他组合中均出现,就删除该组用例,从而精简用例。

windows下有微软的PICT,txt文件录入参数后,命名行执行,就出来结果了。

比如参数

1552448368346

执行后结果,只有31条,精简了很多。

1552448425685

这个基本上一秒就出来结果了。

我自己参考网上算法写的,就要慢的多。

估计后面有时间了再看看能不能调优。

parewise算法:

cp = []  # 笛卡尔积
s = []  # 两两拆分
for x in eval('itertools.product' + str(tuple(param_list))):cp.append(x)s.append([i for i in itertools.combinations(x, 2)])del_row = []
s2 = copy.deepcopy(s)
for i in range(len(s)):  # 对每个进行匹配t = 0for j in range(len(s[i])):  # 判断所有同时都存在其他中 且位置相同for i2 in [x for x in range(len(s2)) if s2[x] != s[i]]:  # 其他 只比对有效flag = Falsefor j2 in range(len(s2[i2])):if s[i][j] == s2[i2][j2] and j == j2:t = t + 1flag = Truebreakif flag:breakif t == len(s[i]):del_row.append(i)s2.remove(s[i])return [cp[i] for i in range(len(cp)) if i not in del_row]

网上的例子是用的index函数。在我写过程中,发现这里有个坑。比如list中存在相同元素,就始终返回前一个匹配的索引,结果就会有问题。我就完全避免了index函数。不知道哪个是对的,目前满足使用需要,将就着用了。有点小尴尬。

Case

BaseCase断言:

    def checkFlag(self, p, r):"""预期,实际"""err = str([p['url'], p['body'], r.text])try:b = Falseif (r.json()['flag'] in [1, '1', '', None, 'statistic_by_result', 0,"0", 'struct_product', 'v_select_jz_single']or r.json()['message'] in ("暂无数据", "未查询到数据")):b = Trueself.assertEqual(True, b, msg=err)except (json.JSONDecodeError, KeyError):  # 1.返回的不是json,比如下载、404  2.无flagself.assertEqual(200, r.status_code, msg=err)

最简单的一个测试用例:

from case.PyPlatform2_0_2.Public import *class Home(BaseCase):"""首页"""def setUp(self):log(testname(self.__repr__()) + '\n')record([testname(self.__repr__())])def test(self):"""xxx"""self.req({"url": full_url("xxx"),"body": {}})

setup,输出日志。

Token

因为公司登陆用的token,跟cookie类似,保留登陆状态,避免重复登陆。

如何处理token也是框架设计的一个要点。

1557471452464

Env设置token,因为每个系统的登陆参数值都不一样。

Var.token = login.get_token()

BaseCase.req在每次请求时获取token,从而免登录。

if "headers" not in p.keys():p['headers'] = {'token': ''}p['headers']['token'] = Var.token

CSV

写文件:

if not os.path.exists(path):f = open(path, 'a', newline='')a = csv.writer(f)a.writerow(title)f.close()f = open(path, 'a', newline='')
a = csv.writer(f)
try:a.writerow(d)
except UnicodeEncodeError:d[4] = "Unicode隐藏"  # responsea.writerow(d)
f.close()if get_file_size(path) >= 50 * 1024 * 1024:  # 超过50M删除文件os.remove(path)record(title)

traceback自动生成文件名:

def _sys_name():t = str(traceback.extract_stack())b = Truefor x in os.listdir(case_dir):if x not in ["BaseCase.py", "__pycache__"]:if x in t:return x + "接口调用记录" + current_date() + ".csv"if b:print("request找不到sysname")print(t)

HTMLTestRunner

根据通用的版本,也是参考网上一些现有的美化代码,综合了一下,根据自己需求做了改造。

近20交易日测试通过率

1552449137641

加了一个echarts,把最近20交易日的测试通过率,通过折线走势图的方式展示出来。监测系统稳定性。

数据存放和读取在data目录的csv文件中。

统计表格

1552449314757

按项目进行分组统计,增加测试说明一列,按颜色区别测试结果状态,可点击查看详细描述和错误信息。

同时优化了整体的样式效果。

排序:

# 按照通过率从小到大排序
passrate_value = []
for key in passrate:if key != 'total':passrate_value.append(float(passrate[key].replace('%', '')))passrate_value.sort()

保存折线图数据:

today = datetime.datetime.now().strftime('%Y-%m-%d')
if '--' not in names:  # 跑单个系统不存if dao_is_trade_date(today):  # 非交易日不存with open(self.rct20_path, "r") as f:  # 读取数据lines = csv.reader(f)lines = list(lines)for lin in lines:lin[0] = lin[0].replace('月', '-')lin[0] = lin[0].replace('日', '')rct_data = lines# print(rct_data)nowdate = datetime.datetime.now().strftime('%m-%d')# 如果有重复日期,先删l = len(rct_data)while l != 0 and nowdate == rct_data[l - 1][0]:rct_data.pop(l - 1)l = len(rct_data)for pt in self.passrate_tl:n = pt[0]v = pt[1]row = []row.append(str(nowdate))row.append(str(n))row.append(str(v).replace('%', ''))rct_data.append(row)# 只存近20条row_20 = len(names) * 20if len(rct_data) > row_20:  # 超过20条for i in range(0, len(names)):rct_data.pop(0)with open(self.rct20_path, 'w', newline='') as f:writer = csv.writer(f)writer.writerows(rct_data)

拼接折线图数据用于展示:

while ri < len(rct_data):  # 遍历 ->s_datascan = []while ri < len(rct_data) and rct_data[ri][0] == trade_date[di]:s_data[rct_data[ri][1]].append(rct_data[ri][2])scan.append(rct_data[ri][1])ri += 1chg = list(set(names) ^ set(scan))  # 差集for c in chg:s_data[c].append('--')  # 增加/减少的项目,为'--'di += 1series = []  # 系列序列
s_names = s_data.keys()
for k in s_names:s = {}  # 单个系列s['name'] = ks['type'] = 'line'if s_data != {}:s['data'] = s_data[k]series.append(s)

这部分代码是很久之前写的了,代码应该是不够简洁、高效、规范滴,是可以优化滴。偷了懒没有重构了。

用例设计

测试类型描述
冒烟测试所有接口写单独的test,确保调用正常。
全选测试将所有参数尽可能多的全选上,调用接口。
一定程序上可以弥补结对测试的不足。
结对测试如前文所述,关注两两组合的情况。

参数值,部分采用随机数。也视需求,从数据库或其他接口获取数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92011.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Orange的运维学习日记--28.Linux逻辑卷详解

Orange的运维学习日记–28.Linux逻辑卷详解 文章目录Orange的运维学习日记--28.Linux逻辑卷详解为什么使用 LVM基本概念创建物理卷创建卷组创建逻辑卷创建文件系统并挂载清理 LVM 对象扩展与缩减逻辑卷扩展 LV缩减 LV调整文件系统大小扩展 XFS 文件系统扩展 EXT4 文件系统缩减 …

AI大模型学习三十三、HeyGem.ai 服务端(ubuntu)docker 安装 /客户端(win)分离部署

一、说明服务端安装官方安装客户端在windows 上安装解决分离问题利用samba实现共享&#xff0c;我是在局域网访问&#xff0c;安装道理可以在非局域网访问重新弄了一块显卡&#xff0c;所以驱动也重新装下二、环境准备(base) mucunax58:~$ lsb_release -a No LSB modules are …

AI在安全方面的十个应用场景

人工智能&#xff08;AI&#xff09;正在重塑安全领域的“游戏规则”&#xff0c;把“被动防御”变成“主动狩猎”。综合当前主流实践与最新案例&#xff0c;可将其应用归纳为以下十大场景&#xff1a;威胁检测与狩猎利用机器学习/深度学习模型对网络流量、终端行为和云端日志进…

Android --- Bug调查经验记录

文章目录1.布局中Pag不显示的问题2.数据库降级问题3.RecycleView 列表滑动卡顿1.布局中Pag不显示的问题 在调查一个pag不显示的问题&#xff0c;整体逻辑没有问题&#xff0c;但是就是不显示 pag不显示的根本原因大概有文件找不到&#xff0c;一个是路径问题&#xff0c;一个是…

【C语言】深度剖析指针(三):回调机制、通用排序与数组指针逻辑

文章目录一、回调函数&#xff1a;通过函数指针实现灵活调用1.1 什么是回调函数&#xff1f;1.2 回调函数的实际应用&#xff1a;简化计算器代码二、qsort函数2.1 qsort函数的参数说明2.2 使用qsort排序整型数据2.3 使用qsort排序结构体数据示例&#xff1a;学生信息排序2.4 qs…

sql调优总结

sql调优 线上发现部分sql查询时间过长。使用explain观察是否命中表的索引。未命中索引&#xff0c;使用 TABLE add index 语句添加索引。 除此之外&#xff0c;单个字段命中联合索引的情况也会导致查询变慢 针对多个字段的查询可添加联合索引。 总结如下慢sql的原因&#xff1a…

如何在nuxt项目中使用axios进行网络请求?

在 Nuxt 项目中使用 Axios 进行网络请求有两种常用方式&#xff1a;一是直接安装 Axios 并全局配置&#xff0c;二是使用 Nuxt 官方推荐的 nuxtjs/axios 模块&#xff08;更便捷&#xff09;。以下是详细步骤&#xff1a; 方法一&#xff1a;使用官方推荐的 nuxtjs/axios 模块&…

Unity 实现手机端和电脑项目在局域网内通信

电脑端启动后自动广播自身存在&#xff0c;手机端启动后监听广播并发现服务器。发现后自动建立 UDP 连接&#xff0c;双方可互发消息。内置心跳检测&#xff0c;网络中断时会自动检测并提示断开using UnityEngine; using System.Net; using System.Net.Sockets; using System.T…

C++_389_定义一个禁用了赋值操作、具有线程同步资源保护的结构体,作为一些回调函数的参数,方便获取响应操作的结果等信息

/* 回调参数。注意:此结构体禁用了赋值,会编译报错 */struct API_CALLBACK_T{public:API_CALLBACK_T(){eRet = e_fail;bWait = true;

uniapp基础 (一)

目录 UniApp 是什么&#xff1f;有什么优势 跨平台高效开发 Vue.js 技术生态 插件生态丰富 渐进式开发支持 UniApp 跨平台兼容的实现原理 编译时转 运行时适配层 条件编译 性能优化策略 1.预编译模 2.原生组件混合渲 3.分包加载 UniApp 的生命周期钩子有哪些&#x…

【图像算法 - 10】进阶入门:改进 YOLO11 安全帽检测的关键参数与场景适配

一、项目背景与需求 视频全文介绍 【图像算法 - 10】进阶入门&#xff1a;改进 YOLO11 安全帽检测的关键参数与场景适配今天我们使用深度学习来训练一个安全帽检测系统&#xff0c;基于YOLO11的安全帽检测系统。我们使用了两万张图片的数据集训练了这次的基于YOLO11的安全帽检…

【C 学习】04.1-类型转换浮点数

“知道做不到就是不知道”一、类型转换1.自动类型转换&#xff1a;当运算符&#xff08;常见、-、*、/、%&#xff09;两边出现不一致的类型时&#xff0c;编译器会自动转换成较大的&#xff08;范围更大&#xff09;类型。从小到大&#xff1a;char-short-int-long-long long;…

基于反事实对比学习的鲁棒图像表征|文献速递-医学影像算法文献分享

Title题目Robust image representations with counterfactual contrastive learning基于反事实对比学习的鲁棒图像表征01文献速递介绍医学影像中的对比学习已成为利用未标记数据的有效策略。这种自监督学习方法已被证明能显著提升模型跨领域偏移的泛化能力&#xff0c;并减少训…

机器学习(5):朴素贝叶斯分类算法

贝叶斯的核心思想就是&#xff0c;谁的概率高就归为哪一类。贝叶斯推论P(A):先验概率。即在B事件发生之前&#xff0c;我们对A事件概率的一个判断。P(A|B)&#xff1a;后验概率。即在B事件发生之后&#xff0c;我们对A事件概率的重新评估。P(B|A)/P(B)&#xff1a;可能性函数。…

Docker 容器内进行 frp 内网穿透

开始之前需要有一台可以进行公网访问的服务器 下载安装 frp 这个直接到 github 官网就可以下载了 点击Releases 就可以查看到可以下载的源&#xff0c;根据自己电脑的型号进行选择就好了。 linux服务器上下载 如果是在linux的服务器上的话可以直接通过wget进行下载 例如&a…

复制网页文字到Word、WPS文字?选中后直接拖放

要把网页、PDF或其他应用中的文字内容复制到Word、WPS文字、记事本等&#xff0c;不一定要先复制、再粘贴&#xff0c;也可以选中文字后直接拖动到目标位置即可。多次操作&#xff0c;可以把窗口并排再拖动。如果你经常需要在不同应用之间引用文字&#xff0c;不妨试一试。操作…

Starrocks中的 Query Profile以及explain analyze及trace命令中的区别

背景 本文基于Starrocks 3.5.5 现有公司因为业务的不同&#xff0c;可能会更加关系单个SQL 的RT&#xff0c;因为如果一个SQL的RT比较大的话&#xff0c;影响的就是这个业务&#xff0c;从而影响收入&#xff0c;所以对于这方面我们就比较关心&#xff0c; 而最近在基于Starro…

网络 —— 笔记本(主机)、主机虚拟机(Windows、Ubuntu)、手机(笔记本热点),三者进行相互ping通

背景介绍最近在笔记本电脑上的虚拟机(Ubuntu、Windows Server搭配)上部署了"WD"开源手游服务器(旧版本)&#xff0c;手机连接上了笔记本电脑开启的WIFI热点&#xff0c;同时手机上安装了"WD"手游客户端。于是首先得保证网络相互畅通才能玩游戏&#xff0c;…

裸露土堆识别准确率↑32%:陌讯多模态融合算法在生态监测的实战解析

原创声明本文为原创技术解析文章&#xff0c;涉及技术参数及架构描述均参考《陌讯技术白皮书》&#xff0c;禁止任何形式的转载与抄袭。一、行业痛点&#xff1a;裸露土堆识别的现实挑战在生态环境保护、建筑工地监管等场景中&#xff0c;裸露土堆的精准识别是遏制扬尘污染、防…

网站从HTTP升级到HTTPS网址方法

将网站从HTTP升级到HTTPS涉及几个关键步骤&#xff0c;以确保安全连接以及用户和搜索引擎的平稳过渡。获取并安装SSL/TLS证书&#xff1a;1、从CA机构授权提供商Gworg获取SSL/TLS证书。选项包括域名验证(DV)、组织验证(OV)和扩展验证(EV)证书&#xff0c;验证严格度各不相同&am…