测试基础|为啥大多数功能测试会觉得测试平台不好用?自动化测试的几点思考

一、接口自动化到底要验证什么

个人觉得做什么事情前,应该想下做的动机和想要达成的目的,这样会减少很多不必要的弯路。

1. 自动化的原因

测试界普遍认为应该加自动化用于提高测试效率和保障;

测试kpi任务;

应对需要频繁执行的测试场景;

需要增加信心和可靠性。

2. 理想中的目的

线上定时巡检,监测系统稳定性,更早地发现问题,减少故障恢复的时间;

辅助提高回归测试质量(就是辅助作用,别想着能靠自动化发现大问题);

记录每次巡检的结果,有助于团队了解系统的历史性能。

3. 接口自动化的设计方向

说到底,接口自动化的所有处理就是围绕下面三步去提取测试点和选型工具,并没有什么很高大上的东西,底层还是要看写测试点的这个人的业务水平,创建出有效的测试点。

图片

我们基本根据这三步和上面的目的去规划测试点和实现方式。

在这里插入图片描述

3.1 工具选择原则:

图片

3.2 主要测试点提取

图片

3.3 测试场景实现难点(大部分都能借助测试框架解决,解决不了的就用工作流程解决,再解决不了的就不用解决,自动化测试只是辅助措施)

->这里用pytest的测试框架来描述解决方法,不同的测试框架自己找对应的方法

图片

4. 自动化实现中的实际痛点

现在的普遍论调应该基本都是在技术优化上,但是实际上自动化测试的实际痛点的本质上因为人的痛点:

(1)日益增长的工作内容同有限人力之间的矛盾

有限的测试人力无法满足日益增加的测试需求/要求;

引入自动化测试无法减少工作量的增加,却要挤出时间和资源去实施和维护一个辅助性质的自动化。

(2)理想化愿景与实际可行性之间的矛盾

平台化设计过度复杂,想要覆盖各种测试需求,导致用例创建繁琐、学习曲线陡峭;

妄想匹配所有项目需求,不断细化和组件化等,导致失去灵活性、增加维护成本。

(3)技术追求与实际需求之间不平衡的矛盾

倾向于追求更高级、复杂的技术,以展示其专业技能,导致出现用很复杂的流程和实现方式去验证一件反而简单的事;

封装过度,导致代码难以理解和维护(我们不是开发,没必要防御性编程)。

解决思路:

1.自动化设计就要立足于实际的项目需要,只关注当前项目的核心功能和业务流程,不盲目追求覆盖率,只对关键路径、核心功能和高风险场景进行自动化,不一定动辄就是测试平台。

2.接口自动化性价比最高的就是脚本化(复制粘贴是真的方便)搭配一个成熟的测试框架,不搞花里胡哨的封装和平台化,力求易读、易维护的自动化测试脚本。

3.不追求更高级的技术,注重实用性/快捷性,自动化的关键点不是你用了什么技术去做请求断言返回,而是你的这个用例关注的方向对没。(你用Java 搞了个平台创建断言了接口返回和我用postman写了个脚本断言返回,测试结果效果上有什么质的区别吗?)

5. 自动化搭建大致过程

选择一个合适的工具;

根据我上面主要测试点提取的表,选择需要验证的内容进行断言;

利用codeGeex/gpt的辅助,一步步把需要完成的自动化搭起来;

后续随着用例数和场景复杂了,遇到什么问题就有什么解决什么,你不可能一开始就能想到全部的问题。

如果你是用 python,大致用到的就是这些,除了通用的 http 请求,如果有其他协议,就找对应协议的库

测试框架:pytest:用于编写和执行测试用例,支持参数化测试、夹具等功能。HTTP请求库:requests:用于发送HTTP请求,方便处理接口的GET、POST等操作数据驱动:yaml:用于存储测试数据,例如接口请求参数、期望响应等。可以使用PyYAML库解析YAML格式的数据文件。数据库连接:mysql-connector-python,用于与MySQL数据库建立连接,执行数据库操作,例如验证接口返回的数据与数据库中的数据是否一致。日志记录:logbook,用于记录测试过程中的日志信息,有助于排查问题和进行调试。报告生成:allure-pytest,结合pytest和Allure生成详细的测试报告,提供可视化的测试结果和执行历史。

二、目前测试平台有什么奇怪点

了解问题的核心关键在于 “从群众中来,到群众中去”,这句话同样适用于测试岗,很多平台都会标注“独特的用例编写方式”、“低门槛,易使用”的特性,但是实际上都是粗制web化的jmeter或者粗制web化的postman又或者是奇葩的低代码拖拽,不仅创建用例麻烦不灵活 且 调试接口费时间,功能细化和封装过度也导致了不小的学习使用成本,且该学习成本不像 jmeter 这种工具的使用经验那样可复用。这些既不能提高效率又不能用来提高测试水平的做法用一句话来形容的话就是:“离群众太远了”。

1. 测试平台使用槽点

测试平台交互模式:

创建项目->创建模块->创建case->关联项目->关联模块;

编写case:请求参数、前后置、预期值等多个输入框,需要逐个点击填写信息 (和 jmeter 创建用例的方式有什么区别?),当接口发生变更时,也是需要逐个用例手动修改信息,维护成本高,用例的可读性也差;

调试 case: 调试信息不够清晰且慢,调试出问题时也无法马上明确是平台问题还是接口本身问题。

2. 测试平台的设计通病

把【低门槛,易使用】理解为:不用写代码就是容易用,抛开实际意义上的实用。

太想通用:平台的灵活性本身比较差,为了增加灵活性又为了考虑功能测试不懂代码,通常都会将多种操作流程组件化,增加很多配置项。但是一件产品如果是一端的产出,没有对应的产品、测试和持续的用户反馈,必定会有设计不当或者过度组件化,导致测试用例的抽象层次变得复杂、上手难度增加、执行有性能问题等。

鸡肋:为体现自身技术,选型难度较大的前后端技术栈,过度追求技术炫耀让平台更难理解和使用,底层逻辑还是走的对返回包的断言,导致难以让人信服。就像赛博丁真绕了个大圈关灯一样。

3. 意识形态差异:

都什么年代了,现在面试功能测试哪个不要求基本的代码脚本能力?更别说现在都有gpt加持,真的不用特别考虑测试无代码能力的场景。

都是测试,肯定是希望通过写脚本去巩固自己熟悉的开发语言,即使繁琐,也有学习成长的快感。

三、写自动化的心理误区

1. 没使用设计模式,很心虚

特别是新手,认为如果没有使用设计模式来编写自动化测试代码,就会感到不够专业或不足够好。

设计模式的确在自动化测试中可以提高代码的可维护性和可扩展性,但并非所有项目都需要复杂的设计模式。如果你只是为了实现简单的接口测试,引入设计模式只会导致代码过于复杂,增加了维护成本。

设计模式是一个不断演进的过程,可以在需要的时候逐步引入,而不必为了设计模式而设计模式。始终专注于编写简单、可读、可维护的脚本。

哪怕你用下面最简单明了的模式,哪又怎样?能达到自动化的目的即可,干嘛要折磨自己(个人见解,大佬忽略)

project_root/
|-- api_tests/     存放 API 测试用例的目录
|   |-- project1/      项目1
|   |   |-- __init__.py
|   |   |-- test_api_project1.py
|   |   |-- utils/
|   |       |-- __init__.py
|   |       |-- api_client_project1.py   封装 API 请求的客户端工具
|   |-- project2/          项目2
|       |-- __init__.py
|       |-- test_api_project2.py
|       |-- utils/
|           |-- __init__.py
|           |-- api_client_project2.py   封装 API 请求的客户端工具
|-- conftest.py      共享的 fixture 和配置信息
|-- pytest.ini          Pytest 的配置文件
|-- requirements.txt

2. 过度关注工具而非测试目标

Java的TestNG、python的pytest、jmeter、postman还是在前面工具基础上封装平台,本质上都是向目标接口发出请求再进行断言,不管技术实现上有多难,最后实现的测试目标都是一样的。

自动化最终难题都在用例维护和管理上,即使平台化也是如此。

测试用例的设计和执行质量直接影响测试的有效性,良好设计的测试用例可以更好地捕捉潜在的问题,而低质量的测试用例可能导致遗漏重要的测试点。

3. 一切都可以自动化

自动化是业务逻辑抽象的结果,只是业务逻辑测试的一种方式,相比手工的确是效率更高些,但是需要一个基础条件:稳定的项目。

4. 试图一步到位

一开始就想覆盖所有的接口和测试场景,徒增压力和维护成本。

要逐步增量的方法,从一些核心的接口和关键的测试场景开始,逐步扩展测试范围。

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

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

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

相关文章

0基础如何进入IT行业?

0基础如何进入IT行业? 简介:对于没有任何相关背景知识的人来说,如何才能成功进入IT行业?是否有一些特定的方法或技巧可以帮助他们实现这一目标? IT 行业可能是当今门槛最低的行业之一,想要进入 IT 行业&a…

【机器学习·浙江大学】机器学习概述、支持向量机SVM(线性模型)

机器学习概述 机器学习 特征提取(feature) 根据提取的特征构造算法,实现特定的任务⭐(这门课程的重点:假设所有的特征已经存在且有效,如何根据这些特征来构造学习算法) 如下图所示,机器学习主要就是来进行…

FreeRTOSFreeRTOS列表和列表项

FreeRTOS列表和列表项 今天继续跟着正点原子学习FreeRTOS列表和列表项的内容。列表和列表项这个知识点用到了C语言链表的知识点。所以必须对C语言中的链表这个数据结构才能更好的理解这部分内容。TIPS:正点原子这节课内容讲的特别好,强烈推荐&#xff1…

基于SSM的基于个人需求和地域特色的外卖推荐系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的基于个人需求和地域特色的外卖推荐系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&…

关于 Python 的 import,你了解多少?

多线程和多进程是 Python 中两种实现多任务的不同策略,二者都可以在特定的场景下在一定程度上提高程序的运行速度、性能以及吞吐,但二者的运行机制却有很大的差别。 在 Python 中,多线程以_并发(concurrent)的方式运行…

Chapter 1 Basic Concepts of Communication and Communication Systems

1.1 The Concept of Communication communication【通信】:It is the process of using signals to transmit messages containing information in space. To put it simply, communication is the spatial transmission of information【信息的空间传递】Information【信息】…

C语言数组:数据的集合艺术(续)

前言 在上一篇文章中,我们深入探讨了C语言数组的基本概念、操作以及多维数组的应用。今天,我们将继续探索数组的更多高级特性,包括动态内存分配、指针与数组的关系以及数组在实际编程中的应用案例。 一、动态内存分配与数组 在C语言中&…

Unity开发一个FPS游戏之三

在前面的两篇博客中,我已实现了一个FPS游戏的大部分功能,包括了第一人称的主角运动控制,武器射击以及敌人的智能行为。这里我将继续完善这个游戏,包括以下几个方面: 增加一个真实的游戏场景,模拟一个废弃的…

数据加密的两种方案

说明:本文介绍对项目中的数据加密的两种方案; 场景 源自真实的项目需求,需要我们对系统中的敏感数据(如手机号、证件号等)进行加密处理,即存入到数据库中的是加密后的密文数据。加密本身是不难的&#xf…

Spring Security——11,自定义权限校验方法

自定义权限校验方法 一键三连有没有捏~~ 我们也可以定义自己的权限校验方法,在PreAuthorize注解中使用我们的方法。 自定义一个权限检验方法: 在SPEL表达式中使用 ex相当于获取容器中bean的名字未ex的对象。然后再调用这个对象的 hasAuthority方法&am…

软考高级架构师:嵌入式系统的内核架构

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

ssm028蜀都天香酒楼的网站设计与实现+jsp

基于JSP的蜀都天香酒楼管理系统的设计与实现 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定蜀都…

带头双向循环链表实现

1.结构及特性 前面我们实现了无头单向非循环链表,它的结构是这样的: 在这里的head只是一个指向头结点的指针,而不是带头链表的头节点。 而带头双向循环链表的逻辑结构则是这样的 这就是链表的结构,链表的每一个节点都有两个指针…

docker 安装redis报错:can not init background jbos

启动redis,发现一直再重启 docker run -d --name redis -p 6379:6379 --restartalways redis:6.2.6 --requirepass "123456" 查看日志,发现job没启动 docker logs 47f6572a779c 尝试了一堆解决办法。。。最后发现尝试安装了redis6.2.6版本&a…

从《布瓦尔与佩库歇》实践中学习社会科学概论

从《布瓦尔与佩库歇》实践中学习社会科学概论 前情提要《布瓦尔与佩库歇》实践笔记云藏山鹰社会科学概论报告核心--信息形数身知™意合™意气实体过程意气实体过程宇宙学诠释™ 社会科学概论花间流风版导读,马斯克风格演讲[ 一尚韬竹团队供稿;] 内容展开…

实验4 层次图和HIPO图

一、实验目的 通过绘制层次图和HIPO图,熟练掌握层次图和HIPO图的基本原理。 能对简单问题进行层次图和HIPO图的分析,独立地完成层次图和HIPO图设计。 二、实验项目内容(实验题目) 1、用Microsoft Visio绘制出图书馆管理系统的层…

Flume 拦截器概念及自定义拦截器的运用

文章目录 Flume 拦截器拦截器的作用拦截器运用1.创建项目2.实现拦截器接口3.编写事件处理逻辑4.拦截器构建5.打包与上传6.编写配置文件7.测试运行 Flume 拦截器 在 Flume 中,拦截器(Interceptors)是一种可以在事件传输过程中拦截、处理和修改…

Spring定义Bean对象笔记(二)

前言:上一篇记录了通过XML文件来定义Bean对象,这一篇将记录通过注解和配置类的方式来定义Bean对象。 核心注解: 定义对象:Component,Service,Repository,Controller 依赖注入: 按类型:Autowired 按名称&am…

【JavaScript】作用域 ③ ( JavaScript 作用域链 | 作用域链变量查找机制 )

文章目录 一、JavaScript 作用域链1、作用域2、作用域链3、作用域链变量查找机制 二、代码示例 - 作用域链 一、JavaScript 作用域链 1、作用域 在 JavaScript 中 , 任何代码都有 作用域 , 全局作用域 : 在 <script> 标签中 或者 js 脚本中 定义的变量 属于 全局作用域 …

Vue3【进阶】

简介 https://cn.vuejs.org/guide/introduction.html 创建vue3工程 【基于 vue-cli创建】 基本和vue-cli的过程类似&#xff0c;只是选择的时候用vue3创建 【基于vite创建】【推荐】 【官网】https://vitejs.cn/ 【可以先去学一下webpack】 步骤 【https://cn.vitejs.…