作者 | Mahipal Nehra
译者 | 刘雅梦
策划 | 闫园园
软件开发公司一直在采用 DevOps,因为它有助于自动化和简化应用程序的开发生命周期。不仅如此,DevOps 还通过规划、沟通、流程和工具,更好地协调了开发团队和运维团队,从而提高了项目的交付质量和速度。但是测试 DevOps 的最佳策略是什么呢?本文将讨论 DevOps 的基本概念、生命周期、最佳实践以及我们应该使用的工具。
软件开发公司一直在采用 DevOps,因为它有助于自动化和简化应用程序的开发生命周期。不仅如此,DevOps 还通过规划、沟通、流程和工具,更好地协调了开发团队和运维团队,从而提高了项目的交付质量和速度。
随着 DevOps 的发展,企业要么使用敏捷 DevOps,要么只选择 DevOps 方式。
(敏捷是一个迭代过程,专注于协作、反馈和快速发布。)
但是,测试 DevOps 的最佳策略是什么呢?为了帮助大家,我们将讨论 DevOps 的基本概念、生命周期、最佳实践以及我们应该使用的工具。
1什么是 DevOps?
DevOps 是一套工具、文化理念和实践,通过自动化和集成开发团队和运维团队之间的流程,提高了组织高速交付项目的能力。DevOps 强调跨团队的协作与沟通、团队授权和自动化。
在 DevOps 的方法论下,开发团队和运维团队并不是相互孤立的。这两个团队通常会合并为一个团队,开发人员负责应用的整个生命周期,从开发到部署和运维。此外,DevOps 团队拥有广泛的技能,并不局限于应用程序的某个功能或特性。
有时,安全和质量保证团队会在整个应用程序开发过程中与 DevOps 集成。在这种情况下,如果 DevOps 团队的重点是应用程序的安全性,那么它也被称为 DevSecOps。
与传统的手工实践不同,DevOps 团队使用技术栈和工具来自动化流程,从而可以自动、可靠、快速地构建应用程序。此外,DevOps 工具允许开发人员独立执行一些需要其他团队协助的任务,如配置基础设施或部署代码等任务。
2DevOps 生命周期
DevOps 生命周期是持续开发生命周期中的一系列自动化流程。DevOps 生命周期采用迭代的方式,这就是实践者为什么会将其符号化为无限循环的原因。这个无限循环代表了一种持续和协作策略,其中包括应用程序生命周期中每个阶段的技术栈和工具。
生命周期的左侧处理应用程序的开发和测试,而右边则描述了部署和运维的循环。
让我们来概述一下 DevOps 的生命周期。
- 计划(Plans):DevOps 团队在计划阶段确定业务需求并收集用户的反馈。为了最大化业务价值并提供预期结果,开发人员还会在该阶段创建项目路线图。
- 编码(Code):在这个阶段,通过使用诸如 Git 或 GitHub 之类的工具和插件来创建应用程序代码,并简化流程,最大限度地减少糟糕的编码实践和应用程序安全方面的缺陷。
- 构建(Build):在构建阶段,开发人员使用 Gradle 或 Maven 等工具将代码提交到共享存储库。
- 测试(Test):在测试阶段,将构建部署到测试环境中,这样就可以通过使用 Selenium、JUnit 等工具运行不同的测试(如安全性、用户接受度、集成、性能等)来确保应用程序的质量。
- 发布(Release):当构建通过了测试,并准备好了部署到生产环境时,运维团队将会安排发布。
- 部署(Deploy):在部署阶段,基础设施即代码(Infrastructure-as-Code,IaC)使用不同的工具来构建和部署生产环境。
- 运维(Operate):一旦最终用户可以访问该版本了,运维团队将使用 Ansible、Saltstack、CFEngine 或 Chef 等工具进行服务器配置和资源调配。
- 监控(Monitor):顾名思义,在监控阶段,根据收集到的应用程序性能、用户行为等信息来对 DevOps 管道进行监控。通过环境监控,团队可以轻松地识别出影响生产力的瓶颈。
3从敏捷到 DevOps
即使 DevOps 和敏捷测试之间存在细微的差异,使用敏捷的人可能会发现 DevOps 更熟悉,并最终采用它。尽管敏捷的原则在开发和 QA 的迭代中得到了成功的应用,但在运维方面却没有那么成功。这就是 DevOps 的用武之地。
DevOps 现在已经用持续开发取代了持续集成,在持续开发中,团队在短周期内开发应用程序,这样软件就可以随时自动可靠地发布。使用 CD,可以以很高的频率开发、测试和发布软件应用程序。
由于 DevOps 中的流程和环境已标准化,因此持续开发过程能使整个链条中的每个人都受益。由于 DevOps 中的所有流程都是自动化的,因此,开发人员可以专注于设计和编码高质量的应用程序,而不是专注于构建、质量保证和运维流程。
使用持续开发可以极大地缩短代码编写和部署到生产环境的时间,最多可达 4 小时。
简而言之,DevOps 是一种敏捷的扩展,或者可以被称之为“类固醇上的敏捷”。
4DevOps 测试的最佳实践
DevOps 测试工程师需要重新思考软件的 QA 测试策略,以适应从开发到运维的管道阶段。值得庆幸的是,有一些 DevOps 测试最佳实践可以被理解并能被用于任何应用程序的开发中。解释 DevOps 的每个测试最佳实践超出了本文的范围。所以我们总结了 DevOps 测试的每一个最佳实践,并在下面给出了解释。
DevOps 测试文化
DevOps 的测试文化是有所不同的,因为跨职能团队成员共同承担了提供高质量应用程序的责任。质量检查是管道阶段的一个重要方面,涉及所有的团队成员。此外,质量测试不能由一个完全不同的团队在管道的末端进行。因此,团队需要确定测试策略,以控制整个应用程序开发生命周期中测试活动的范围和数量。
为了达到所要求的结果,跨职能团队的每个成员都必须对测试及其结果负责。
DevOps 测试文化应包括以下特征:
- 鼓励围绕测试和测试结果分析进行协作,而不是测试人员和开发人员在代码修复方面进行对抗。
- 测试覆盖率和创建条目需要得到 DevOps 团队的同意。
- 领导者应该将测试视为项目开发的战略部分,而不是将其视为可以降低的成本。他们需要资金和时间预算来为 DevOps 团队想要的开发人员提供测试培训资源、框架、工具、管理并创建评估策略。
- 开发团队应该接受测试创建和结果分析,而运维团队应该计划并执行跨功能测试。
持续的测试策略
传统的瀑布式测试方法是在开发周期接近尾声时由独立的 QA 团队对应用程序中大量的更改进行测试,这种方法无法与 DevOps 配合使用。
随着 DevOps 团队在持续交付管道的所有阶段都测试小的更改,敏捷方法与 DevOps 测试更加兼容了。
虽然敏捷强调了持续测试的重要性以及将持续测试集成到软件工具中的必要性,但它没有定义将测试扩展到部署的方法。DevOps 所需的持续测试策略比瀑布式或敏捷式的更明确。持续测试策略必须要包括管道和部署所有阶段的集成测试。
端到端的测试集成
DevOps 需要跨端到端管道阶段的水平测试集成,以及跨不同级别持续交付基础设施的垂直集成。
下面列出了实现端到端测试集成的最佳实践:
- 在集成之前,使用私有实例对应用程序中的更改进行测试,以确保代码的更改不会破坏分支。能做到这样的测试方法包括:静态代码分析、单元测试、性能测试、回归、扫描和功能测试。
- 在预集成测试阶段,应该创建自动化测试,以便在管道的后续测试阶段继续使用。
- 为了验证预集成测试的测试结果,DevOps 团队应该在提交代码时对代码进行评估。
- 在构建阶段,应该执行测试,以确定集成的构建是否符合验收标准。
- 为了确保构建镜像的性能和功能符合评估标准,必须在代码测试过程中进行性能和功能测试。
- 类似地,在回归、系统测试和交付等其他阶段,也需要进行一组测试,以确保代码和应用程序符合预期的评估标准。
DevOps 测试基础设施
正在测试的应用程序可以具有单体、三层、面向服务或微服务的架构。DevOps 测试实践强调在类似于生产环境的环境中进行测试的重要性,这可以确保一旦部署到生产环境中,测试就可以覆盖应用程序的所有配置。
为此,最佳实践是找到并将基础架构即代码(Iac)、动态基础设施配置工具、云服务和测试即服务(test-as-a-service)包含进来,这些工具比专用基础设施更具成本效益和可行性,并且可以根据运行测试的需要轻松地建立并发布基础设施配置。
DevOps 就绪测试工具
持续交付测试工具必须提供对应用程序进行测试的能力,并提供能够验证测试结果所需的数据。你可以使用的一些工具,如功能测试工具、协议测试工具、API 测试工具、单元测试工具、数据库模拟器、性能 / 负载测试工具和用户界面测试工具等。
测试工具可以是白盒工具、灰盒工具和黑盒工具。测试工具应该能够混合测试工具链和框架,以便用于 DevOps 就绪(DevOps-ready)工具。
这将在垂直或水平方向上增加按需伸缩的弹性,并能匹配工作负载的需求,以及通过持续交付管道测试应用程序更改的能力。可以通过 API 编排、伸缩、调用、控制和监控 DevOps 就绪工具。资源、采用快速失败的测试设计技术、测试框架配置,则加速测试结果的监控以及测试工具的配置。
测试分析
如果对持续测试结果的分析不能跟上测试的速度,不仅会增加要分析的结果数量,而且还会导致无法节省时间、造成大量混乱并忽略有价值的结果,从而减慢 CI/CT 周期。一些可用于匹配测试及其分析速度的技术包括测试结果分析器、仪表板或向框架中添加分析工具。
微服务和容器
从测试的角度来看,在微服务架构中,需要验证每个服务与使用它的其他服务之间的契约。服务间的依赖性和微服务的独立性都应该经过很好的测试。
在网络上运行服务时,还需要验证可靠性和性能等考虑因素。如果微服务受到应用程序更改或相关依赖微服务组的影响,则需要对其进行回归测试。
容器提供了将测试资源打包到特殊容器中的可能性,以实现方便性和不变性,以及测试更改所需的可伸缩性。
数据库 DevOps 测试
在持续交付的整个过程中,制定策略来测试和验证对数据库的任何更改或使用了数据库的应用程序是否按要求执行是至关重要的。此外,必须有可以用于从生产环境中复制数据卷的工具,以确保在部署之前能在生产数据集上进行测试。
DevOps 安全测试
通过制定 DevOps 安全测试策略,可以使应用程序更容易摆脱漏洞、威胁和风险的影响。DevOps 团队可以在开发周期中应用自动化工具和测试,最大限度地减少宕机时间、漏洞和安全威胁。
自动化测试
为了消除持续集成带来的风险,添加能够提供快速应用程序质量反馈的测试自动化是至关重要的。使用 CI 进行自动化测试允许团队测试新代码迭代,并能将错误的可能性降至最低。
5DevOps 测试工具
在软件开发生命周期中使用 DevOps 测试工具为开发和运维团队提供了多项优势。它提供的一些好处包括代码质量改进、快速和持续的反馈,以及加速了有助于增加开发、运维和测试团队的应用程序上市时间。
下面是可以用于 DevOps 测试策略的不同测试工具列表。
单元测试工具
通过单元测试,DevOps 团队可以单独检查应用程序的源代码,以验证其功能。单元测试甚至可以在应用程序的初始开发阶段进行。它依赖于模拟应用程序功能的测试用例。这些测试用例要么通过,要么失败,并向用户提供结果,以便他们调试代码。
有些单元测试工具是专门为给定的编程语言设计的。可以使用的工具有 Mocha(用于 JavaScript)、 EMMA (用于 Java)、Typemock(用于.Net 和 C )、Parasoft(用于 C 和 C )和 SimpleTest(用于 PHP)。
性能测试工具
性能测试是在 DevOps 的后期阶段完成的,即在编写和集成代码时。根据项目的要求,性能测试工具将对应用程序进行压力、负载、容量、卷和恢复测试,以检查应用程序的性能,以及它如何从异常中恢复。
使用工具进行性能测试的目的是在向最终用户发布系统之前,检测崩溃源并修改系统以获得最高效率。可以用于性能测试的工具有 Apache JMeter、k6、Watir、Predator 和 TestComplete。
自动化测试工具
自动化测试工具有助于自动运行测试、管理测试数据并使用测试结果来提高软件的质量。除了减少人为错误外,自动化测试工具还可以支持可伸缩的评估。CI/CD 模型中的自动化工具基于事件来触发测试。
DevOps 团队可以用于自动化测试的工具有 TestProject、Leapwork、Selenium、Tosca 和 Testsigma。
持续测试工具
持续测试是测试应用程序的过程,有助于在 DevOps 管道的每个阶段进行代码、功能和应用程序验证,以检测错误并最大限度地缩短周转时间。
DevOps 团队使用的一些连续测试工具示例包括:AppVerify、Appium、Docker、Bamboo 和 Jenkins。
6总结
DevOps 是为多种业务开发应用程序的理想解决方案,因为它有充分的理由。然而,应用程序的成功和质量完全取决于 DevOps 团队为测试应用程序所制定的策略。
我们希望本文能够帮助你为当前或未来的项目制定 DevOps 测试策略。
原文链接:
https://www.decipherzone.com/blog-detail/devops-testing