当前位置: 首页 > 科技观察

优秀的自动化实践(一):从纺锤模型到金字塔模型

时间:2023-03-13 22:02:14 科技观察

1、当前软件发展趋势本章开始,我们将简要介绍近年来企业发展中出现的一些重要概念,以便引入持续测试的主题。其中两个重要的概念是DevOps和微服务。两者都是当前软件开发中的优秀实践和方法论,旨在为企业提供更大的灵活性,提高运营效率。1.1DevOpsDevOps是一套实用的方法论和文化,提倡打破原有的组织和局限。职能团队已经开始拥抱和接受DevOps所提倡的高度协作、一体化的研发、测试、运维和交付理念。随着DevOps和敏捷的日益普及,无论是互联网公司还是传统软件公司都开始拥抱敏捷,践行DevOps。持续集成CI(Continuousintegration)和持续交付CD(Continuousdelivery)作为DevOps的优秀实践,越来越受到关注。1.2微服务架构MicroserviceArchitecture微服务架构源于DevOps的思想和实践,是一种软件架构风格。微服务架构带来了一系列好处,例如可部署性、可靠性、可用性等。虽然原则上任何架构都可用于实践DevOps,但微服务架构正在成为构建持续部署(CD)系统的标准架构风格。由于每个服务的体积小,它允许通过持续重构来实现单个服务的架构,从而减少大型项目的前期设计需求,允许早期软件发布和持续交付。微服务和DevOps是天然的共同体,结合起来实现软件开发行业的转型。2.测试自动化随着敏捷和微服务架构的引入,CI/CD已经成为构建和部署的标准,即使在没有采用微服务架构的项目中也是如此。测试对于确保定义的流程和事务按预期运行至关重要。为应对现代软件产品的频繁变更和发布,传统的手工测试方式在人员和效率方面严重不足,因此自动化测试成为现代软件开发过程中的关键组成部分。自动化测试是持续集成和持续交付的核心。没有有效的自动化测试保障,持续集成和持续交付只是一个没有灵魂的壳。2.1测试分类测试可以根据不同的维度分为不同的类别。根据测试方式是否手动,可分为自动化测试和手动测试;根据测试的目的,可分为功能测试、性能测试、负载测试等。本文使用MartinFowler按照层级分类对测试进行分类。MartinFowler描述,测试金字塔分为三个层次:单元、服务和用户界面。虽然每个人的具体描述不尽相同(有人将三层定义为单元、接口、集成测试;也有人将整个金字塔划分为4-5个层次),但金字塔自下而上的结构是被认可和认同的。跟着。1)单元测试单元测试是对代码单元(通常是类/方法)的测试。单元测试的价值在于可以提供快速的反馈,可以在开发过程中验证逻辑单元。好的单元测试可以帮助改进现有的设计。在团队掌握TDD的前提下,单元测试可以辅助重构,有助于提高代码的整洁度。2)接口(服务/API)测试接口测试是针对业务接口的测试,主要测试内部接口功能是否完备。比如内部逻辑是否正常,异常处理是否正确。接口测试的主要价值在于接口定义比较稳定,不像接口或者底层代码会经常变化,所以接口测试更容易编写,用例的维护成本也比较低。在接口层面准备测试是比较划算的。3)集成(UI)测试集成测试从用户的角度验证产品功能的正确性。它测试端到端的流程,并添加用户场景和数据来验证整个流程是否健康顺畅。集成测试具有最高的商业价值。它验证了一个完整的流程,但是由于需要验证完整的流程,所以环境部署、用例准备、实施的成本比较高,实施起来并不容易。2.2微服务架构给测试带来的挑战微服务架构在解决了应用规模和应用开发规模的问题后,也带来了一些新的问题。比较突出的是微服务数量的增加和服务之间调用关系的复杂化等等。复杂的依赖关系使得即使是高级项目开发人员也无法一次理清所有关系。与传统的单体应用相比,微服务在测试策略上存在一些差异。简单来说,在微服务架构中,测试的层次更多,需要测试的服务和应用也更多。手动执行所有测试效率低下,跟不上互联网快速迭代的需求。这时候就需要引入自动化测试,减轻测试团队的压力,提高测试效率和测试质量。2.3自动化测试说到自动化测试,功能测试人员可能觉得它很高端很复杂。我们先来看看一般的功能测试是如何进行的:设计和编写用例文档,描述测试步骤和预期结果;测试人员根据测试用例描述一步步操作,然后判断实际结果是否与预期一致。如果它们匹配,则测试通过;如果他们不这样做,则测试失败。自动化测试的作用与功能测试相同。分层理论和自动化测试方法的结合创造了三个层次的自动化:单元测试自动化、接口测试自动化和UI测试自动化。当然,不同层次自动化的侧重点是不同的。因此,从测试行为的本质来看,功能测试与单元自动化测试、界面自动化测试与UI自动化测试没有区别。唯一的区别是,一个是由人执行的,一个是由代码或工具执行的。2.4自动化测试分层1)单元自动化测试单元测试自动化是指检查和验证软件中最小的可测试单元,调用被测服务的类或方法,根据类或类的参数传入相应的数据方法。得到一个返回结果,最后断言返回结果是否符合预期。如果相等,则测试通过;如果不相等,则测试失败。因此,单元测试侧重于代码的实现和逻辑。单元测试是最基本的测试,也是测试中最小的单元。它的对象是一个函数对象,也可以包括输入和输出。针对函数功能或函数内部的代码逻辑,不包含业务逻辑。这类测试一般由研发人员完成,需要用到单元测试框架,比如Java的Junit、TestNG、Python的unittest。2)接口自动化测试接口自动化测试主要验证模块之间的调用返回以及不同系统和服务之间的数据交换。接口测试自动化一般在业务逻辑层进行测试。根据接口文档是RESTful还是RPC?调用被测接口,构造相应的请求数据,并获取返回值,无论是成功还是失败。不管输入的参数是什么,我们都会得到一个结果,最后断言返回的结果是否等于预期的结果。如果相等,则测试通过;如果不相等,则测试失败。所以,接口测试重在数据。只要数据正确,大部分功能就完成了,剩下的无非就是如何在页面上展示数据了。常用的接口测试工具有postman、jmeter、loadrunner等。3)集成(UI)自动化测试UI层是用户使用产品的入口。所有的功能都通过这一层提供给用户。目前大部分的测试工作都集中在这一层。这种测试更贴近用户的行为,模拟用户点击A按钮,在输入框中输入一些命令。有时候用户可能看到登录成功了,但是UI自动化并不知道刚才的点击是否生效了。所以要找“证据”,比如登录成功后页面右上角会显示“欢迎,xxx”,这是登录成功的有力“证据”。UI自动化登录成功后,获取数据进行断言。如果断言相等,则测试通过;如果不相等,则测试失败。因此,UI自动化的重点是用户操作的形态,以及UI上的各种组件是否可用。常见的测试工具有UFT、RobotFramework、Selenium、Appium等。4)层级比实践每个自动化测试都有自己的侧重点、优缺点,在实际工作中不可能做到均等分布,所以需要制定一个合理的测试策略来组织和分配它,包括每个部分的测试投入了多少,测试用例的比例是多少等。测试金字塔中还有一个信息维度,如上图所示。走得越高,离QA、业务/终端用户越近,走得越低,离开发越近;你走得越高,测试执行越慢,你走得越低,测试执行得越快;,故障信息越模糊,越难追踪),测试成本越低,测试成本越低。根据测试金字塔模型和投入产出比,我们知道回报率越低,回报率越高,所以要用大量的单元测试和全面的接口测试来覆盖基本逻辑和产品提供的功能,以及少量的集成(UI)测试,对前端界面进行功能验证。据说业界最佳实践要靠谷歌。谷歌在自动化分层方面的投入占比:单元测试(Unit):占比70%;接口测试(Service):占比20%;集成测试(UI):占10%%。3、自动化测试的最佳实践对于现阶段公司大部分团队来说,主轴模型更符合实际的测试模式。在新项目中,由于时间限制或开发人员习惯,单元测试可能在一开始就没有准备好;而一些遗留项目可能没有很多单元测试。在上述情况下,一般的做法是先着重测试中间层,原因有二:一是中间层的输入输出比较高,可以达到较高的自动化率;其次,它可以帮助加强开发人员和测试人员之间的协作,提高测试质量。这一层需要开发人员和测试人员共同定义,因为开发人员知道内部实现的细节,而测试掌握业务场景。3.1纺锤形过渡到金字塔形过渡项目进行一段时间后,各层的测试比例必须过渡到理想的金字塔形过渡。此时需要关注以下三个方面:互传能力的开发和测试;全员专注于产品设计和代码质量;让用例逐渐下沉,最后逐渐过渡到理想型。3.2测试质量评价关于度量,不要用单一指标来评价测试和产品质量,如用例通过率、代码覆盖率等,不能独立评价产品质量。评估测试质量时应关注以下几个方面:首先是用例比例,即各层用例的比例。第二个是测试覆盖率。第三是测试的总运行时间,因为经过优化之后,总运行时间肯定会越来越少。第四个是代码质量指标,反映代码的质量和整洁度。4、自动化测试面临的挑战引入自动化测试可以给团队带来很多好处。当然,自动化测试也有其自身的不足和挑战。最大的挑战是变更,因为变更会导致测试用例失败,所以需要不断调试自动化脚本。如何控制和降低成本,是对自动化测试工具和人类能力的挑战。另外值得注意的是,自动化测试并不能完全替代人工测试,一定的人工探索性测试也是必不可少的。我们一直在进行不懈的努力和探索。本文是自动化测试最佳实践系列的第一篇,重点介绍自动化测试的现状和金字塔模型。在接下来的系列文章中,我们将继续介绍我们的自动化测试实践。包括自动化测试平台的核心功能、持续测试方法和工具等。【本文为栏目组织宜信工学院原创文章,微信公众号“宜信工学院(id:CE_TECH)”点击在这里可以看到作者更多的好文章