当前位置: 首页 > news >正文

8年资深测试总结,接口自动化框架的设计与实现,一文打通...

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

1、自动化测试框架

在大部分测试人员眼中只要沾上“框架”,就感觉非常神秘,非常遥远。

大家之所以觉得复杂,是因为落地运用起来很复杂。

每个公司,每个业务及产品线的业务流程都不一样,所以就导致了“自动化测试框架”去完成自动化测试的时候产生很多不稳定因素,这样就很难定位成一个固定的框架。

其实不然,真正的自动化测试框架不是一个模式,而是一种思想和方法的集合,通俗的讲就是一个架构。

2、自动化测试框架思想

为了更好的了解自动化测试框架,先从自动化测试的发展历程说起;

一般测试工作限在3年以上且接触过自动化测试的应该对以下几种自动化测试框架思想有一定的认知:

模块化思想;
库思想;
数据驱动思想;
关键字驱动思想;

以上仅仅是代表了一种自动化测试的思想,并不能定义为框架。上面讲到框架=思想+方法,于是演化了以下五种框架:

1)模块化测试脚本框架

需要创建小而独立的可以描述的模块、片断以及待测应用程序的脚本。这些树状结构的小脚本组合起来,就能组成能用于特定的测试用例的脚本。

2)测试库框架

与模块化测试脚本框架很类似,并且具有同样的优点。不同的是测试库框架把待测应用程序分解为过程和函数而不是脚本。这个框架需要创建描述模块、片断以及待测应用程序的功能库文件。

3)关键字驱动或表驱动的测试框架

这个框架需要开发数据表和关键字。
这些数据表和关键字独立于执行它们的测试自动化工具,并可以用来“驱动"待测应用程序和数据的测试脚本代码,关键宇驱动测试看上去与手工测试用例很类似。

在一个关键字驱动测试中,把待测应用程序的功能和每个测试的执行步骤一起写到一个表中。

这个测试框架可以通过很少的代码来产生大量的测试用例。同样的代码在用数据表来产生各个测试用例的同时被复用。

4)数据驱动测试框架

在这里测试的输入和输出数据是从数据文件中读取(数据池,ODBC源,CSV文件,EXCEL文件,Json文件,Yaml文件,ADO对象等)并且通过捕获工具生成或者手工生成的代码脚本被载入到变量中。

在这个框架中,变量不仅被用来存放输入值还被用来存放输出的验证值。整个程序中,测试脚本来读取数值文件,记载测试状态和信息。

这类似于表驱动测试,在表驱动测试中,它的测试用例是包含在数据文件而不是在脚本中,对于数据而言,脚本仅仅是一个“驱动器”,或者是一个传送机构。

然而,数据驱动测试不同于表驱动测试,尽管导航数据并不包含在表结构中。在数据驱动测试中,数据文件中只包含测试数据。

5)混合测试自动化框架

最普遍的执行框架是上面介绍的所有技术的一个结合,取其长处,弥补其不足。这个混合测试框架是由大部分框架随着时间并经过若干项目演化而来的。

3、接口自动化测试框架策略

设计出来的框架是直接给测试人员,而且其他的测试人员只需要简单的向里面不断的补充测试用例即可;

所以我们的框架设计必须三简化即操作简单,维护简单,扩展简单。

设计框架的同时一定要结合业务流程,而且不仅仅靠技术实现,其实技术实现不难,难点对业务流程的理解和把握。

设计框架时要将基础的封装成公用的,如:get请求、post请求和断言封装成同基础通用类。

测试用例要与代码分享,这样便于用例管理,所以将我们选择上面的数据驱动思想。

4、接口自动化测试框架设计

1)进行接口框架设计前,我们先看看当前的一些主流接口自动化工具框架

在这里插入图片描述

2)以上各工具特性

工具学习成本录制持续集成测试报告用例管理性能测试扩展难度最低要求
Java+testng+MavenJava
Requests+PythonPython
Robot Framework工具组件
HttpRunnerPython

根据以上的特性可得我们优先考虑Python+Requests和HttpRunner;

下面根据其两个框架分别来分析下用例执行过程。

3)用例执行解析

Python的Requests库针对所有的HTTP请求方法,采用的是统一的接口
requests.request(method, url, **kwargs)

其中,kwargs可以保护HTTP请求所有可能用到的信息,例如:headers、cookies、params、data、auth等。

所以,只要遵循Requests的参数规范,在接口测试用例中复用Requests参数的概念即可。而HttpRunner处理逻辑很简单,直接读取测试用例中的各项参数,传递给Requests发起请求。

Requests接口请求示例

def test_login(self):url = "www.xxx.com/api/users/login"data = {"name": "user1","password": "123456"}resp = requests.post(url, json=data)self.assertEqual(200, resp.status_code)self.assertEqual(True, resp.json()["success"])

在该用例中,实现了HTTP POST请求,然后对响应结果进行判断,检查响应code等是否符合预期。

这样的用例在实际项目中会存在两个问题:
用例模式基本固定,会存在大量相似或重复的用例,用例维护有很大问题;
用例与执行代码不分离,参数数据也未分离,同样不易维护;

HttpRunner使用json/yaml格式处理测试用例,分离后的用例描述如下

{"name": "test login","request": {"url": "www.xxx.com/api/users/login","method": "POST","headers": {"content-type": "application/json"},"json": {"name": "user1","password": "123456"}},"response": {"status_code": 200,"headers": {"Content-Type": "application/json"},"body": {"success": true,"msg": "user login successfully."}}}

HttpRunner用例执行引擎

def run_testcase(testcase):req_kwargs = testcase['request']try:url = req_kwargs.pop('url')method = req_kwargs.pop('method')except KeyError:raise exception.ParamsError("Params Error")resp_obj = requests.request(url=url, method=method, **req_kwargs)diff_content = utils.diff_response(resp_obj, testcase['response'])success = False if diff_content else Truereturn success, diff_content

从测试用例中获取HTTP接口请求参数,testcase[‘request’]

{"url": "www.xxx.com/api/users/login","method": "POST","headers": {"content-type": "application/json"},"json": {"name": "user1","password": "123456"}}

发起Http请求

requests.request(url=url, method=method, **req_kwargs)

检测测试结果,即断言

utils.diff_response(resp_obj, testcase['response'])
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

勇敢面对挑战,坚定前行,你的努力终将开花结果。每一步都是向着梦想迈进的力量,相信自己,勇往直前,创造属于你自己的辉煌。

不忘初心,砥砺前行,每一次努力都将成就辉煌。勇敢地迎接挑战,坚定地迈向梦想,因为你的努力终将开启成功之门。相信自己,你必定能创造奇迹。

困难并不可怕,勇敢面对挑战,才能收获辉煌。坚持不懈,努力奋斗,梦想的光芒终将照亮前行的道路。相信自己,你定能创造属于自己的奇迹。

相关文章:

  • Go:如何在GoLand中引用github.com中的第三方包
  • 关于Alibaba Cloud Toolkit 下载配置以及后端自动部署
  • RT-DETR 应用 BiFPN 结构 | 加权双向特征金字塔网络
  • 【pytorch源码分析--torch执行流程与编译原理】
  • java高级之单元测试、反射
  • 常见面试题-TCP三次握手四次挥手
  • MySQL 是怎样运行的:单表访问方法及基于成本的优化
  • Windows 同步时间服务器批处理
  • 软件测试常见面试题1000问涵盖一千+公司面试软件测试面试题(全网最全)
  • 安全防御——二、ENSP防火墙实验学习
  • Ecal基于wifi下跨机通讯
  • 服务器的操作系统,你选择哪些?
  • 家政预约服务小程序源码系统 线上+线下两种模式 带完整的搭建教程
  • 运动想象 EEG 信号分析
  • 1.OpenResty系列之入门简介
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Angular 4.x 动态创建组件
  • Java知识点总结(JavaIO-打印流)
  • Objective-C 中关联引用的概念
  • Promise面试题,控制异步流程
  • yii2权限控制rbac之rule详细讲解
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 前端面试之CSS3新特性
  • 如何在 Tornado 中实现 Middleware
  • 入口文件开始,分析Vue源码实现
  • 设计模式 开闭原则
  • 小而合理的前端理论:rscss和rsjs
  • 学习使用ExpressJS 4.0中的新Router
  • 一些css基础学习笔记
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​你们这样子,耽误我的工作进度怎么办?
  • #控制台大学课堂点名问题_课堂随机点名
  • #每日一题合集#牛客JZ23-JZ33
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (1)STL算法之遍历容器
  • (C语言)逆序输出字符串
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一) storm的集群安装与配置
  • (转)项目管理杂谈-我所期望的新人
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .net6使用Sejil可视化日志
  • .NET程序员迈向卓越的必由之路
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @Resource和@Autowired的区别
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [20190113]四校联考