5个步骤实现软件质量的快速提升
每个人都希望软件质量更高,速度更快。对现代软件开发团队的要求是巨大的——从竞争和市场压力的增加,功能和复杂性的增加,到对产品质量、安全性和可靠性的更高期望。敏捷开发方法常常受到追捧,因为它能更快地响应变化,更好地实现客户需求。
但是,敏捷和DevOps经常被当作一种用更少的资源更快地完成软件的方法来销售,尽管这并不是其目的。现实中,有多达70%的IT项目失败或达不到目标,聪明的开发团队正在寻求改进他们的开发实践,这样他们不仅可以成功地完成一个项目,还可以为未来的迭代和产品创建一个可重复的流程。在这篇文章中,我们将讨论如何实现敏捷和迭代方法所需的敏捷性,同时不仅仅是实现最终产品,而是实现满足并超越质量和安全目标的产品。
持续测试是高速质量的答案
事实证明,测试既是问题,也是更快实现更好质量的解决方案。在敏捷过程中,为了创建合理的功能片段来设计和实现,许多开发步骤可以被收缩;然而,整合新功能是有风险的,测试的范围也不明确。正如我在之前的一篇文章中谈到的,测试是软件团队在采用敏捷方法时陷入困境的关键原因之一。团队失去了他们所追求的敏捷性,因为他们在测试方面陷入了过多或不足的困境。
持续测试被认为是采用DevOps和敏捷开发的软件团队所面临的问题的解决方案。维基百科对持续测试的定义是:“......作为软件交付管道的一部分,执行自动化测试的过程,以获得与软件发布候选版本相关的业务风险的即时反馈。”尽管定义简单明了,但实施持续测试并随着时间的推移对其进行优化是另一回事,这也是我今天要在这里重点讨论的。
把你的冰激凌锥变成金字塔
理想的测试金字塔定义了在一个项目中投入时间和精力的最佳位置。在理想的金字塔中,你将宝贵的时间和精力投入到金字塔基础的一套全面的单元测试中,而这套单元测试由API和服务测试支持,在金字塔的顶端,则是数量少得多的系统和基于GUI的测试。
然而,这个金字塔经常被倒置成我们所说的冰激凌锥。团队在脆而复杂的系统级GUI测试上花费了太多的时间和精力,这些测试需要完全的功能来实现和集成——导致在SDLC的早期阶段无法连续执行测试。实现成功的持续测试的关键是融化冰激凌锥,专注于创建自动化的单元和API测试,这些测试可以在开发人员实现新功能时持续执行。
用持续测试实现高速质量的五个步骤
1. 建立单元测试的基础
通过自动化创建、执行和维护测试的过程,建立单元测试的基础。只有让单元测试的工作更容易创建和维护,开发团队才会对所有组件采用全项目的单元测试。
在测试创建和执行以及管理方面都采用测试自动化,将当前的单元测试套件扩展到合理的范围内,将产品的代码尽可能多的包含在内。
2. 避免依赖以UI为中心的晚期周期测试
避免依靠后期周期性的、脆性的、以UI为中心的测试,那最终只会是最耗时、最昂贵的诊断和修复。与其专注于自动化所有的手动测试场景,不如投资于单元和API测试的坚实基础,以确保与UI沟通的架构首先是稳固的。
虽然系统级测试仍然很重要,也是必须的,但它不应该是第一位的。它也不是发现关键架构、性能和安全问题的时候。软件团队可以通过建立一个坚实的单元和API测试基础来减少对这些UI和系统测试的依赖。通过遵循这里的其他建议,在系统级测试开始之前,大部分系统应该已经得到了很好的验证。
还请确保使用静态分析来分析整个代码库,包括遗留代码和第三方代码,以帮助检测测试可能错过的错误和安全漏洞。静态分析对于执行项目编码标准也很重要。
3. 理解整个测试金字塔的代码覆盖率
了解整个金字塔上下的代码覆盖率,以及对需求/用户故事的可追溯性,因为如果没有它,开发团队就不会真正知道什么已经测试过,什么还没有测试。此外,不了解测试覆盖率意味着不知道在金字塔的每一个层次上要测试什么,这意味着即使是微小的变化也需要如此多的测试,从而使整个过程陷入僵局。请看我之前关于基于变更的测试的文章。
4. 用服务虚拟化左移
利用应用依赖性的服务虚拟化,以便在开发生命周期的更早阶段进行自动API测试。提高自动化程度和更早发现错误是成功的关键。更早推动API测试有助于发现系统的关键方面,如性能和架构的合理性。这也是安全测试的一个重要阶段。
5. 利用变更影响分析加速敏捷发展
在每次构建的基础上,通过变更影响分析加速敏捷开发,以了解每个新迭代所带来的风险细节。变更影响分析提供的分析是使测试只专注于绝对需要测试的内容的关键,而不是采用其他方式的猎枪方法。
只有通过智能的、基于数据的决策,真正的持续测试才是可行的。让开发团队专注于最低限度的测试集,以确保在每次迭代时都有适当的覆盖率,是让敏捷开发方法重获“敏捷”的关键。
改进之路
毫不奇怪,最好的开始方式是回顾测试金字塔,然后评估项目目前的状况。是否有一个坚实的自动化单元测试基础,并在每个构建的基础上运行?是否尽可能多地使用自动化测试产品API?是否使用了虚拟化?测试是否依赖于一套复杂的手动UI测试,而这些测试在系统即将完成之前无法运行?改进的路径是基于建立一个适当的测试金字塔、自动化以及数据收集和分析。
现代软件开发团队面临的众多压力,使得我们很难按时按规格构建产品。新的开发方法(如敏捷开发)帮助团队专注于为客户构建正确的东西,但项目仍然会迟到和容易出错,测试是继续困扰现代开发方法的一个关键方面。要想获得显著的改进,请采用坚实的自动化单元测试基础,并通过服务虚拟化尽早、频繁地执行API测试。而且不要忘记,利用高级软件测试分析的数据来推动测试管理,测试结果会有很大的改善。