DevOps落地笔记-13|自动化测试:提高测试效率的不二之选

上一课时主要介绍了通过 API 管理平台来管理企业内部的 API。持续集成是能够保证软件处于可工作状态的实践,但实施持续集成有一个必不可少的步骤——测试。只有尽可能全面的测试覆盖,才能降低软件出错的概率。但是,大多数企业里还是基于人工来完成测试环节,测试周期长,覆盖率低,使得持续集成的效果并不明显。今天介绍的内容——自动化测试,就是将人工完成的测试尽可能地自动化,从而达到减少测试时间,提高测试覆盖率,提高软件质量的目的。

什么是自动化测试?

首先,明确一下自动化测试不是什么。自动化测试不是指自动化生成测试代码,而是自动化地执行由开发人员或测试人员编写的测试代码。正如下面这句谚语:

绝不要手工去做任何可以被自动化处理的事情。——Curt Hibbs

之前是由人工点击页面上的按钮进行功能测试,人工设置不同的性能参数进行性能测试,都可以通过脚本或测试平台自动化执行。这类测试包含单元测试、组件测试、集成测试和验收测试。也包含一些非功能性测试,如安全测试和性能测试。但有些测试还是需要人工介入,比如用户体验测试、探索性测试等。本课时介绍的自动化测试只包含能够被自动化执行的测试。

为什么要自动化测试?

这个问题可能很多人都能回答几条出来。如“自动化加快了测试速度,缩短了测试时间”,“时间充足了,还可以开发更多的功能”等。下面系统介绍一下自动化测试带来的优势。

& 节约时间和降低执行成本:在软件开发全生命周期中,测试是一个非常频繁且重复的活动。每次提交代码之后,都需要进行测试以确保新的代码变动不会受到影响。在每次软件发版之前,也需要进行系统的回归测试。一旦自动化测试建设完成,就可以做到无人值守运行,甚至可以在多台机器上并行执行。自动化测试大大缩短了测试的时间。

& 减少出错概率,提高准确性:自动化测试每次执行时都会执行相同的步骤,并且每次都会生成详细的测试报告。这些测试报告不受“人”的因素影响。手工测试容易受个人经验和情绪的影响,容易出错,人员的流动又使得测试知识无法沉淀。因此,自动化测试可以减少出错率,提高准确性。

& 提升测试覆盖度:自动化测试可以增加测试的深度和范围,从而提高软件质量。比如,由于自动化测试的速度很快,可以在很短的时间里执行数千个测试用例,从而提高测试的覆盖度。

& 加快反馈效率:自动化测试在每次提交代码之后自动触发,并将测试结果通知到团队中的开发人员,大大缩短了开发人员获得反馈的时间。

& 模拟手工无法测试的场景:自动化测试可以模拟成千上万用户并发访问的场景,这样的测试场景是手工测试无法模拟的。

因此,自动化测试通过快速的批量执行测试用例,减少测试的时间,加速反馈回路,提升软件的质量。另外,使用自动化测试执行那些重复性较强的工作,可以让团队成员有更多的时间研究更有挑战性和更有价值的活动,提高团队工作效率。

如何实现自动化测试
自动化测试能带来很多收益,但实现自动化测试也是需要成本的。很多企业在实施自动化测试时,通常也只能实现了其中的一部分,比如单元测试、代码扫描、冒烟测试等。通过与持续集成流水线进行集成,能够实现代码提交后触发自动化测试,实时反馈测试结果。对于一个企业来说,实施自动化测试的步骤如下:

STEP1:定义自动化测试的范围。

在实施自动化测试之前,先确定哪些类型的测试可以被自动化。根据 Brian Marick 提出的敏捷测试四象限,不同类型的测试可以分为下图几种。
在这里插入图片描述
敏捷测试象限表明不同类型的测试有不同的目的,主要的维度包括面向技术还是面向业务、面向支持团队还是面向评价产品。然后根据这几个维度按不同的组合分为四个象限,敏捷测试中涉及的所有测试类型都可以归类到这四个象限中。

第 1 象限:面向业务、评价产品的测试。 主要是业务人员和测试人员执行的测试,测试类型有探索性测试、情景测试、可用性测试和用户验收测试等。测试目标是验证产品功能是否满足业务和终端用户的需求。该象限的测试主要以手工测试为主。

第 2 象限:面向业务、支持团队的测试。 主要是测试人员执行的测试,测试类型有功能测试、用户故事测试、原型测试、模拟测试等。测试目标是验证一个功能或者用户故事是否按验收标准正确实施。该象限的测试主要以自动化测试为主,手工测试为辅。

第 3 象限:面向技术、支持团队的测试。 主要是开发人员执行的测试,测试类型有单元测试、模块测试、集成测试等。测试目标是验证单元模块被正确地实施。该象限的测试主要以自动化为主。

第 4 象限:面向技术、评价产品的测试。 主要是测试人员执行,项目团队配合的测试,测试类型有性能测试、负载测试、安全性测试和其他非功能性测试。测试目标是验证产品是否符合非功能性要求。该象限的测试主要以自动化和手工结合的方式。

从上面敏捷测试四象限可以看出,自动化测试的范围应该在 2,3,4 象限。敏捷测试四象限虽然可以让我们看到相对全面的测试总览,但对于这些测试如何落地还是不够明确,比如哪种类型的测试要多做,要尽早做。

STEP2:定义自动化测试的层次。

敏捷专家 Mike Cohn 在 2003 年提出的测试分层金字塔。该测试金字塔分为三层:底层是单元测试,中间层是服务测试,上层是 UI 测试。这底层的单元测试需要做最多的测试工作,越往上的单元,测试工作越少。根据《谷歌软件测试之道》的经验,这三个层次对于精力投入的比例是:70% 的精力放在单元测试,20% 放在服务测试,而剩下 10% 放在 UI 测试,如图中红框部分。

但从整个测试的过程来看,自动化测试不仅仅是跟代码相关的测试,不仅仅是测试执行过程的自动化,还应该包含测试数据和测试环境的自动化,这里统一称为基础设施的测试。根据经验来看,测试数据和测试环境的准备时间占据了整个测试过程的将近一半的时间。所以可以通过自动化的方式提高基础设施准备的效率。
在这里插入图片描述
根据上面的测试分层,从自动化的角度实施不同层次的测试。每一层测试的内容和测试的工具各不相同,比如:

基础设施层,该层主要是准备用于自动化测试的数据和环境。可以使用自动化或者基于容器的方式进行构建。常用的工具有Ansible、Chef、Puppt、Jenkins 等。

单元测试层,该层主要针对代码的方法、类和包进行测试。这些测试一般属于代码级的测试,并与企业内部的持续集成流水线集成。常用的工具有 xUnit 系列工具。

服务测试层,该层主要针对服务之间的接口进行测试。这些测试一般是服务接口之间的交互测试。常用的工具有 Postman、SoapUI 等。

UI 测试层,该层主要针对界面上的功能测试。这些测试一般是在一个或多个应用里进行端到端的流程测试,且应关注重点功能。常用的工具有 Selenium、Appium 等。

STEP3:与持续集成流水线集成。

前面两个步骤确定了自动化测试的范围、分层以及需要使用的工具。第三步就是要搭建自动化测试平台并与持续集成流水线进行集成,自动化测试是实施持续集成实践的重要组成部分,是提交后的代码是否可工作的重要保障。下图是持续集成流水线及自动化测试相关的流程图,其中有些平台在之前的课时中也有讲过,如 API 管理平台和环境部署平台。
在这里插入图片描述
上图主要涉及的测试流程是:

1.开发人员提交代码到 Git 仓库或进行分支合并操作。

2.持续集成服务器接收到合并事件后,触发编译构建、单元测试等检查,并将测试结果通知给开发人员。

3.上述检查通过后,部署到 SIT 测试环境中。该环境为集成环境,部署了该服务所依赖的其他组件。当服务部署时即可将 API 接口注册到 API 管理平台,并执行服务之间的 API 接口测试,验证服务集成是否有问题,随后将测试结果通知给开发人员。

4.SIT 测试环境完成测试并达到进阶要求时,即可进入 UAT 测试环境进行用户验收测试。该环境测试主要通过自动化测试平台完成该服务的功能测试。自动化测试平台包含了测试用例管理和测试数据管理。该步骤可以进行精细化地测试策略管理,可以根据代码关联的需求完成该需求相关的测试用例的测试,可以每天晚上执行全量的回归测试。

5.SIT 环境和 UAT 环境等基础设施的管理可以通过环境部署平台完成。环境部署平台可以根据自动化测试的要求,进行定制化的部署和优化设置,并对基础环境进行先决条件检查,确保自动化测试执行之前满足环境的要求。

总结

这一讲主要介绍了通过自动化测试代替手工测试,减少测试执行的时间,提高了测试的效率。将自动化测试集成到持续集成流水线中,可以在提交代码后自动触发测试,从而保证了每次提交代码后的质量,使得软件一直处于可工作状态。本课时的关键内容为与持续集成的流程图和相关组件,自动化测试虽然能带来一定的收益,但自动化测试不是免费的,需要开发相配套的平台来支撑自动化测试有效落地。

测试是软件全生命周期中非常重要的一个阶段。多年来,软件工程的测试专家们也一直在自动化测试的路上不断探索,每家企业也都在或多或少的尝试自动化测试。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第二十六回 母夜叉孟州道卖人肉 武都头十字坡遇张青-Ubuntu 防火墙ufw配置

武松到县里投案,县官看武松是个汉子,就把诉状改成:武松与嫂一时斗殴杀死,后西门庆前来,两人互殴,打死西门庆。上报东平府。东平府尹也可怜武松,从轻发落,最后判了个:脊杖…

2024 年 12 款最佳录屏软件【录屏必备指南】

在数字时代,共享屏幕就像发送短信一样常见。 无论是工作、创建教程还是流媒体游戏,找到合适的截屏软件可以决定您的在线形象。 我们测试并整理了一系列最佳的截屏和屏幕录制工具,可将您的内容提升到一个新的水平。 从功能丰富的选项到用户…

RM电控--机械入门

SW常用的快捷键: 多种视角观看: 左侧为自攻螺丝,右侧为钻尾螺丝 钻尾螺丝可以依靠自身进行钻孔操作,而自攻螺丝打之前必须先打好小孔。 螺钉; 这些螺钉大家认得全吗?你还知道哪些呢?_哔哩哔哩_bilibili …

今年春节联欢晚会中的扑克魔术到底是咋变的?

今年的刘谦给全国观众带来了俩魔术,一个是洗牌一个是撕牌,前面第一个魔术看不出来太神奇了,但是第二魔术感觉挺有趣的我可以简单分析分析。 然后我们列出这个魔术的关键步骤: 打乱四张牌 1 2 3 4 对折、撕开、面向同一个方向重…

机器学习系列——(二十二)结语

随着我们的机器学习系列的探索画上句号,我们不禁感慨于这一领域的广阔和深邃。从最初的基础概念到复杂的算法,从理论的探讨到实际应用的示例,我们一起经历了一段非凡的旅程。机器学习不仅是当前技术创新的核心驱动力之一,也是塑造…

【MySQL进阶之路】MySQL 中表空间和数据区的概念以及预读机制

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送! 在我后台回复 「资料」 可领取编程高频电子书! 在我后台回复「面试」可领取硬核面试笔记! 文章导读地址…

ssm+vue的医药垃圾分类管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的医药垃圾分类管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结…

React18原理: 渲染与更新时的重点关注事项

概述 react 在渲染过程中要做很多事情,所以不可能直接通过初始元素直接渲染还需要一个东西,就是虚拟节点,暂不涉及React Fiber的概念,将vDom树和Fiber 树统称为虚拟节点有了初始元素后,React 就会根据初始元素和其他可…

使用Arcgis裁剪

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、掩膜提取二、随意裁剪三、裁剪 前言 因为从网站下载的是全球气候数据,而我们需要截取成中国部分,需要用到Arcgis的裁剪工具 一、掩…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toggle组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toggle组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Toggle组件 组件提供勾选框样式、状态按钮样式及开关样式。 子组件 仅当Toggl…

基于片段的3D分子生成扩散模型 - AutoFragDiff 评测

AutoFragDiff 是一个基于片段的,自回归的,口袋条件下的,3D分子生成扩散模型。 AutoFragDiff方法来源于文章《Autoregressive fragment-based diffusion for pocket-aware ligand design》,由加州大学的Mahdi Ghorbani等人于2023年…

[收藏] 数据结构知识全览

以下是数据结构技术主要知识的总结: 1. 基本数据结构 - 数组:固定大小的连续内存空间存储元素,支持随机访问。 - 链表:由节点组成的线性结构,每个节点包含数据和指向下一个节点的指针。 - 栈:后进先出&…

一文讲透SPSS中查看文件和变量信息

数据文件建立后,我们可能希望看到数据文件的结构和变量的组成以确定是否需要完善或修改,此时我们就需要用到文件和变量信息查看功能。 1. 查看变量信息 (1)在结果输出窗口中查看变量信息 在菜单栏中选择“文件”|“显示数据文件…

机器学习:回归决策树(Python)

一、平方误差的计算 square_error_utils.py import numpy as npclass SquareErrorUtils:"""平方误差最小化准则,选择其中最优的一个作为切分点对特征属性进行分箱处理"""staticmethoddef _set_sample_weight(sample_weight, n_samp…

websocket简易基操

一、概述 1.1 简介 WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议),它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的,Websocket是一个持久化的协议。…

【MySQL】数据库基础 -- 详解

一、什么是数据库 存储数据用文件就可以了,为什么还要弄个数据库? 一般的文件确实提供了数据的存储功能,但是文件并没有提供非常好的数据(内容)的管理能力(用户角度)。 文件保存数据有以下几个缺点&…

LeetCode 0094.二叉树的中序遍历:递归/迭代(栈模拟递归)

【LetMeFly】94.二叉树的中序遍历:递归/迭代(栈模拟递归) 力扣题目链接:https://leetcode.cn/problems/binary-tree-inorder-traversal/ 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root […

CVE-2022-0760 漏洞复现

CVE-2022-0760 NSS [HNCTF 2022 WEEK2]ohmywordpress 【CVE-2022-0760】 题目描述:flag在数据库里面。 开题: 顺着按钮一直点下去会发现出现一个按钮叫安装WordPress 安装完之后的界面,有一个搜索框。 F12看看network。 又出现了这个Wor…

C++入门学习(二十五)do-while循环

do { // 代码块,至少会执行一次 } while (条件); 对比一下while和do-while循环: 因为while循环先判断条件,所以数字10直接就没有进入for循环里,卡在了判断条件这一步,所以就没有输出数据; do-while循环是…

亚信安慧AntDB零故障割接方案的实践

亚信安慧AntDB秉持着为客户提供最佳数据库解决方案的理念,不断探索并创新,最近取得了重大的突破。他们成功地研发出一种先进的数据库割接方案,实现了不停服、零故障的数据库割接操作,有效地将替换所带来的业务影响降至最低。 这一…