DevTestOps帮助克服持续测试挑战


持续测试是成功实现DevOps管道的关键要素。Continuous testing,通常被称为左移测试,是一种软件和系统测试方法,在软件生命周期的早期执行测试,目标是提高质量,缩短长测试周期并减少软件缺陷进入生产代码的可能性。下面的V-模型(验证和验证模型)在显示软件开发生命周期的每个阶段和与之相关的测试阶段之间的关系方面是有用的。

DevOps团队进行连续测试的一种方法是将集成测试移到交付管道中通常位置的左侧,以便尽可能靠近构建过程。由于集成测试是经常检测到许多破坏性的,显著的缺陷的地方,这使得团队能够更快地收到关于代码质量的反馈,并获得更准确的结果。

图1:软件测试的级别(V模型)(来源:Software Testing Lecture)。

大多数DevOps项目的目标是使软件开发过程中尽可能多的手工过程自动化。DevOps管道中导致部署缓慢的一些障碍包括容易出错的手工流程,例如从开发组到QA组的交接,包括需要签名或官僚审批的流程。这些类型的切换意味着缺乏对最终产品的共享所有权,这与基本的Agile testing和开发方法学,即跨职能敏捷团队的所有成员都对产品的质量或项目的成功负有同等的责任。正因为如此,敏捷项目上的测试是由整个团队来完成的,而不仅仅是指定的测试人员或质量保证专业人员,包括其主要专长可能是编程,业务分析,数据库或系统操作的团队成员。

连续测试是DevOps管道中应同时进行的几个连续活动之一,包括

  • 连续构建。
  • 持续集成(CI)。
  • 连续交付(CD)。
  • 连续部署。

持续构建或构建自动化是实现持续交付DevOps管道的第一个阶段。如果您的开发人员正在练习test-driven development (TDD),他们将为他们编写的每段代码编写单元测试,甚至在代码本身编写之前。作为敏捷方法学的一个重要部分,TDD帮助开发人员思考他们正在构建的每个软件单元的期望行为,包括输入,输出和错误条件。然后,开发人员实现的新特性在软件构建之前被签入到中央代码库中,后者将源代码编译成二进制代码。

持续集成是一种实践,其中软件开发团队的成员使用版本控制系统,并频繁地将他们的工作集成到相同的位置,例如主分支。通过测试和其他验证的方式构建和验证每个更改,以便尽可能快地检测任何集成错误。使用构建自动化,软件构建会自动进行,使用Makefiles或Ant等工具,而不是由开发人员手动调用编译器。

https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Continuous_Delivery_process_diagram.svg/1280px-Continuous_Delivery_process_diagram.svg.png

图2:一个连续的交付管道包括一个最终的发布批准步骤(Image Source)。 

在连续交付管道的最后阶段,一旦应用程序通过了所有必需的测试,它就会被发布到生产中。出于所有意图和目的,这意味着向用户发布每一个好的构建。完全自动化的CD管道要求能够将软件应用程序的任何版本部署和发布到任何环境。有效地做到这一点需要基础设施自动化,其中环境(机器,网络设备,操作系统,中间件等)可以以完全自动化的格式进行配置和指定。这意味着使用云资源和虚拟基础设施来设置和管理您的部署过程。

随着云计算和基础设施即服务(IaaS)的采用,基础设施即代码(Infrastructure as Code,IaC)变得越来越广泛,IaaS依赖于虚拟机和其他资源,云提供商如Amazon Web Services和Microsoft Azure从其安装在数据中心的大型设备池中按需提供这些资源。IaC让DevOps团队使用高级编程语言自动管理和提供IaaS资源。在实践中,这意味着开发人员能够通过API调用控制大部分或所有IaaS资源,以便执行诸如启动服务器,负载平衡或启动Hadoop集群之类的操作。许多DevOps商店还允许开发人员编写或修改IaC模板来提供和部署新的应用程序,而不是依赖操作员或系统管理员来管理他们的DevOps环境的操作方面。

作为代码的基础设施是帮助构建有效的连续交付管道的强大工具。然而,如果您的组织没有建立一个高度重视团队合作和信任的DevOps文化,也没有能够立即找出软件缺陷的实时测试管理软件,那么这也会导致部署混乱。持续部署经常与持续交付混淆,但是在DevOps上下文中的部署和交付意味着不同的事情。

连续部署意味着每一个软件变更都被自动构建,测试并部署到生产中。连续交付意味着DevOps团队能够将软件应用程序的任何版本部署和发布到任何环境中,但可能会选择不这样做,很可能是出于业务原因。例如,如果您的组织正在使用DevOps将移动应用程序部署到大量的移动平台,并且您发现一个或多个平台不再被您的客户,内部员工或业务合作伙伴广泛使用,那么您的CD管道中的人员,自动化测试或业务规则可以在这种情况下决定不执行最终版本。

连续交付的中心思想是在增量或连续的基础上交付小的软件变更,不仅快速交付改进的软件,而且为了降低引入新的软件变更相关的风险。为了降低新发布的软件可能还没有准备好生产的风险,实践CD的敏捷团队可以利用两种不同的部署策略,“金丝雀发布”或“蓝绿部署”来实现零停机时间。

“金丝雀发布”策略包括将软件的下一个版本发布到生产中,但只向一小部分用户公开。在它通过了许多环境测试之后,您就可以将它发布到基础结构中的更多服务器上,并将更多用户路由到它。

蓝绿部署策略包括在生产应用程序堆栈的相同克隆上设置应用程序的最新版本,然后在应用程序通过交付管道中的所有手动和自动测试后,立即将流量从当前生产堆栈切换到新的生产堆栈。如果您正在使用云资源和虚拟基础设施来设置和管理CD管道,这种方法尤其有效。

使用前面提到的IaC代码,DevOps团队可以自动化部署和回滚过程,以改进按需部署。IaC代码还使进行广泛测试变得更加容易,这促进了更好的质量控制。可以在canary和blue-green软件版本上执行的自动化测试类型包括性能,负载,尖峰和浸泡测试。

性能测试是对软件系统在正常负载下运行的响应时间的测试,也就是在预期的用户数量下运行的测试。性能测试的目标是获得基线,并确定应用程序在正常条件下的行为方式。例如,您的移动应用程序是否满足要求的响应时间,例如低于1000毫秒(1秒)?

https://ivanursul.com/content/images/2016/07/performance00123844D5EB--1-.png

图3:自动化测试包括性能,负载,尖峰和浸泡测试(Image Source)。

Load testing包括扩展系统上的负载,然后在扩展时测量性能。负载测试测量的内容包括响应时间,吞吐率和资源利用率。峰值负载测试的目的是在应用程序的用户数超过通常的情况下,比如在最繁忙的时间段(如月末发薪截止),测量性能。

有不止一种类型的负载测试。一种类型是压力测试,在这种测试中,您将随着时间的推移逐步增加负载量,直到找到系统的极限或断点。例如,如果您不断增加客户端-服务器应用程序的负载,那么服务器就无法处理更多的请求,它就会崩溃。

尖峰测试包括超过和超过最大设计容量,以了解应用程序如何处理大的尖峰负载。在对数据库应用程序的新数据库更改进行负载测试的情况下,尖峰测试是一个很好的考虑。如果spike测试告诉您数据库需要重大更改,甚至需要完全切换数据库系统,DevOps团队就可以主动编写IaC代码,以自动化设置和配置新的基于云的数据库资源的过程,从而处理来自最终用户的意外需求。

浸泡测试是通过在一段较长的时间内(如24小时)对系统运行一组测试来完成的,以查看系统的性能。在浸泡测试中,您通常会寻找内存泄漏,这些内存泄漏可能不会在较短时间内的功能,性能或压力测试中显示出来。浸泡测试是DevOps团队可以用来监控移动应用程序电池使用情况的测试,因为在移动设备上运行应用程序时跟踪电池消耗情况非常重要。

DevTestOps=DevOps+连续测试

创造了DevOps一词的Patrick Dubois在最近的一次采访中表示:How Dev vs. Ops Became DevOps“),因为他觉得,作为一名开发人员,”如果你真的对你正在构建的东西充满热情。。。你就会觉得对你的应用程序在生产中的表现负有责任。“在过去的十年中,DevOps已经导致了许多组织交付软件应用程序方式的文化转变。

然而,如今,大多数组织已经意识到,没有持续测试的DevOps会更快地将有缺陷的软件部署到生产环境中,这就是为什么术语DevTestOps作为一种描述软件开发中所涉及的所有团队(开发人员,操作,质量保证,业务分析人员,管理人员等)之间所需要的协作文化的方法而日益流行,以加快高质量软件的交付。

构建成功的连续交付管道意味着通过允许对生产中的应用程序进行更多的增量更新来减少交付软件更改的成本,时间和风险。随着CD管道变得自动化,显而易见的下一步是将更多的质量控制步骤合并到管道过程中,要么通过测试优先的方法(如测试驱动开发(TDD)),acceptance test-driven development(ATDD)和行为驱动开发(BDD),或者通过持续运行自动化脚本来测试新特性。

随着软件发布频率的增加,自动化测试脚本套件--包括上面描述的执行性能,负载,尖峰和浸泡测试的脚本--可以被存储并在未来的发布周期中重用。这些脚本也可以合并到test automation frameworks并用于向项目干系人保证彻底和充分的测试已经成功完成。