测试频率决定交付速度,通过快速反馈来提高您的团队敏捷性。
持续集成(CI)在很大程度上影响着团队的敏捷性,无论团队使用何种技术,都会存在适用于他们的代码库的持续集成和自动化测试框架。
1.什么是持续集成?
持续集成(CI)是指尽可能早的将频繁测试更改的代码定期集成到代码仓的主分支中,它是敏捷和DevOps 优异实践的一种。通常每个成员每天至少集成一次,也就意味着每天会发生多次集成。
2.持续集成的好处
通常情况下,使用传统手工测试的团队会在代码更改的几个小时后获得反馈,全面的测试反馈更是在代码被修改后的一天或几天后才能获知,而那时代码已经发生了很多变化,使得缺陷修复就像一次考古探险,开发人员要挖开几层代码才能找到问题的根源,这无疑会带来很多问题,而使用持续集成(CI)会加快代码变更的反馈速度,开发人员在几分钟内就可以快速定位和修复问题。
持续集成让敏捷和DevOps团队快速交付高质量的软件成为可能。-Twitter
3.通过持续构建和自动化测试保障质量
多数开发人员在下载了最新的源代码后却发现它不能编译或存在严重错误,从而影响了生产力。那么可以参考以下两种做法避免这种情况发生:
- 持续构建: 一旦代码发生变化就立即构建项目。理想情况下,每次构建之间的差异只是一个变化集。
- 测试自动化: 通过自动化的验证测试以保障软件质量,可以从用户界面层(稍后会详细介绍)或后端服务层进行软件测试。
持续集成将持续构建与测试自动化结合起来,以确保每个构建都能评估代码库的质量。
为实现利益最大化,团队需要建立机制来确保CI的有效运行,一旦发现故障需要立即暂停开发并解决问题。如果构建是在有问题的状态下进行,那么团队在编写测试和配置自动化方面所投入的所有精力都是徒劳,控制成本投入和保护代码库质量同等重要。
4.CI 中的测试:单元测试、API测试和功能测试
CI 运行有两个主要阶段,名列前茅步确保代码编译,第二步是确保代码按设计工作,最可靠的方法是通过一系列自动化测试来验证产品的各个层面。
4.1.单元测试
单元测试最接近代码中的核心组件,它是确保质量的名列前茅道防线。
- 优点: 易于编写,运行速度快,与代码库的核心结构单元紧密关联。
- 缺点: 单元测试只验证软件的核心组件,无法反映用户的工作流,而用户的工作流往往涉及多个工作组件。
单元测试验证了核心代码是如何运行的,开发人员可以审查单元测试来获得该领域代码的最新运行情况。
4.2.API 测试
模块化设计的软件使得不同应用程序之间的工作清晰分离,而API是不同模块相互通信的外部接口,API测试可以通过模块间的相互调用来验证通信。
- 优点: 通常API测试易于编写且运行速度快,适用于不同应用程序之间的交互。
- 缺点: 对于业务逻辑简单的代码,API 测试效果类似单元测试。
由于 API 是应用程序各部分之间的对外接口,因此它们在版本发布时特别有用,一旦发布版本通过了所有的 API 测试,团队就可以更有信心将其交付给客户。
4.3.功能测试
功能测试适用于整个代码库并验证用户工作流。例如,在 Web 应用程序中, 通过 HTTPUnit 和 Selenium直接与用户界面交互来测试产品。
- 好处: 功能测试模仿用户使用并测试多个组件的互操作性,从而更有可能发现错误。
- 缺点: 比单元测试慢,有时会因为网络延迟或技术栈中某个地方的瞬间中断而出现误报。
团队经常发现,随着他们越来越接近真实的用户工作流程,自动化测试的运行速度反而会降低,HTTPUnit作为一个成熟的Web浏览器会运行更快,而Selenium 更是可以跨多个 Web 浏览器并行运行。尽管会出现这些问题,功能测试仍然非常有价值,因为相比人工测试,它能够更快地提供反馈。
测试人员不应该将自动化测试视为生存威胁,因为自动化测试将帮助他们摆脱重复性的测试任务,也可以将时间花在风险分析、测试计划或培养其他技能上。
5.加速持续集成
在 PingCode,我们努力保持开发人员的创新和代码库的健康,并重视加强开发人员的“内部反馈循环”——指代码构建和获得测试结果所需的时间。
运行自动化测试可以快速累加并得出构建持续时间。一种策略是跨多个服务器并行自动化测试或“构建代理”,这样 CI 服务器实际上同时运行 20个 甚至 200 个测试。借助云技术,CPU 可以随着测试套件的增多轻松扩展以满足开发团队的需求。但CPU不是无限的,充分测试代码的每个区域的同时确保不要冗余,冗余测试会使构建持续时间膨胀并浪费 CPU。持续集成的速度越快,工程师就能越快地处理待办事项中的下一个工作。
6.分支和 CI
许多团队因为合并的痛苦而避免创建分支,但有了像Git这样的版本控制工具,分支和合并都变得很容易。为了确保主要代码行(Git 中的“main”)保持健康,在所有特性分支和版本分支上要运行统一的分支策略来保障持续集成,当分支构建通过后,团队就可以将该代码直接合并到上游。
通过分支、持续集成和测试自动化,团队可以在保证代码质量的同时提高生产力和创新能力。PingCode能够支持集成多种代码托管工具,如Gitlab、Github、Git、Gitee、SVN、Bitbucket,实现工作项关联代码提交、分支、拉取过程,同样还支持工作项集成 Jenkins 等持续集成工具,在工作项详情页中可视化呈现每个任务的进展状态,跟踪构建、部署进度。
而敏捷开发的优异状态就是定期交付工作软件,在不影响独创性的同时将技术债降到最低。