6,408
社区成员




作者:翁新锋 Hi-Agile资深技术教练、十余年全栈开发
著名质量管理专家戴明提到:“质量没法检测出来,软件产品开发出来后质量就已经确定。”
也就是说,质量是产品与生俱来的,我们可以说,一旦产品开发完成,该软件存在缺陷的总量是一定的。如果总量的缺陷中有一部分可以通过某些措施来预防,那么软件在测试或最终用户使用过程中所暴露出来的缺陷数量就会减少,这就是缺陷预防——减少测试或使用中暴露的缺陷。
缺陷总量一定,那么能提前预防的缺陷越多,则最终在使用时暴露出来的缺陷则越少,软件的质量也越高。软件开发是个历经多个环节的持续过程,提前预防缺陷意味着需要提前发现并修复缺陷,要做到这一点需要在软件进入测试前进行持续的、相应的工作。
下图相信很多人都见过,它揭示了软件缺陷在不同阶段的表现情况。可以看到,大部分缺陷都是早期引入的,同时大部分缺陷都是中晚期发现的,而缺陷发现的越晚,其修复成本将急剧上涨。
下图来源:Applied Software Measuremnet. Capers Jones. 1996引用
由此可见,缺陷越早发现并着手修复,将会大大降低修复成本。正因为如此,软件研发的质量保障工作最为有效的做法是将质量控制活动落实到生产的各个环节中去,而不是通过后期的集中测试和修复,也就是说,要将质量构建到软件产品本身,提高软件产品自身的质量属性,这也就是质量内建(Built-in Quality)。
质量内建作用在开发过程中, 要求软件生命周期之间参与的各个角色都需要实时的对软件的质量负责。 确保软件在交付到下一环节前已经有一定的质量保证。质量内建的过程就是把质量控制向源头不断推进的过程,让预防缺陷替代暴露缺陷。
整体来说,质量内建的核心可以总结为一句话:尽早自验,及时反馈,共建质量,不再只让测试做质量兜底。扩展开来讲以四个方面为主:
传统软件开发会分成分析、设计、开发、测试、发布等几个相对独立的阶段,而测试是其中发生在开发编码完成之后的一个阶段。
测试左移相对来说不再强调独立的测试阶段,而是要将测试活动左移到软件开发生命周期的最早阶段(最左边)——需求阶段,从需求阶段开始做好缺陷预防的工作。
按照质量内建的原则来说,理想情况下肯定是左移越早越好,但如果一时做不到彻底左移,能尽量前移一步也是进步。因此测试活动左移到独立测试阶段左侧进行,我们认为就是左移,并不是必须一步到位要左移到需求阶段。毕竟质量内建不是一蹴而就的事情。
另外,很多人对测试左移有误解,认为左移就是测试人员的事,让测试人员提前介入,在测试前阶段进行部分工作(例如用例设计,需求对齐等)就是左移。事实上,我们强调的不仅仅是测试人员的左移,而应该是测试活动的左移。
总结来说,测试左移既包含了角色的左移(例如开发、测试都提前参与需求的澄清验证),也包含了测试活动的左移(例如开发人员本身进行自我测试)。
快速反馈,也就是频繁持续地反馈,可以理解为一个持续测试的过程。
我们希望缺陷产生后能够快速被捕捉到,并反馈给相关人员。为了减少这个反馈的等待时间,通常需要有自动化的支撑,比如自动化测试、流水线上自动代码扫描等;也可以是一些人工参与的实践环节,比如手动测试、各类评审和验收等。通过这样的一些实践活动尽快地获取相应工作(可能是需求分析、开发等)的反馈,根据反馈结果进行及时的修复、调整、或者优化。
为了保障快速反馈/持续测试实践活动的有效开展,通常需要增加质量门禁,并确保质量门禁的严格执行。这样可以保证问题能被第一时间拦截并反馈到相应人员。
测试右移跟测试左移对应,就是将测试活动从独立测试阶段右移到生产环境。
但因为生产环境的特殊性,测试右移又不是测试活动的简单右移,而是通过一些实践活动获取生产环境下用户行为、日志等质量相关信息,利用这些信息来给前期的需求、开发和测试工作提供反馈,促进相应工作的优化改进。
总结来说就是根据产品的实际运行情况,进行相关信息的归并分析,从而指导整个开发进行预料之外的问题预防。
测试右移在本次交付中无法直接内建质量,但是可以帮助团队后续进行更好地缺陷预防,促进质量内建。
测试左移、快速反馈和测试右移都不是某个单一角色/人员可以做到的,需要不同角色的不同技能和不同视角的输入,质量人人有责,需要全员参与并且能承担起质量职责才行。
软件产品质量是一个系统工程,任何一个环节出现问题都会对产品质量造成影响,为保证没有问题,最终一定会有人替这个环节负重。只要有别人替你负重,就会增加更多的成本,比如额外的确认、沟通、理解原始思路等。达到相同的质量水准,付出成本高,将会被成本低的所取代。最终取代你的一定是全员参与的。因为这样成本最低。
“技术债”用来表述遗留技术问题对当前或未来开发的影响,自提出这一概念以来,它一直是软件开发关注的焦点之一。如今各大企业为了建立持续交付的能力,快速响应市场的变化,纷纷开始提升研发效能,技术债更是不可忽视的关键因素。
技术债一旦产生,都会对软件系统产生或大或小的影响。技术债涉及到的具体内容也非常广泛,一切不合理的设计或妥协都可以称之为技术债,比如:
这些技术债短期都不会表现出明显的问题,但在项目长期迭代过程中,随着技术债不断的增加,软件系统的可维护性会直线下降,随之而来的是质量的下滑,这给后续的产品开发带来了非常大的问题。
以下是技术债务的一些偿还策略:
总之,偿还技术债需要有系统性的策略和计划。通过优先级排序、资源分配、重构代码、培训和知识分享以及持续监控和改进,可以有效地减少技术债的风险和影响。
关于技术债的识别,这里提一下代码扫描工具。它通过扫描源代码以寻找代码中潜在的的技术债务。这类工具使用定量数据来帮助开发人员识别代码库中可能存在技术债务的热点,例如不规范的代码、不良的注释、过高的圈复杂度、存在安全风险的代码等。利用代码扫描工具,可以方便快捷的识别大部分债务问题,同时与DevOps工具平台结合,可以建立质量门禁,对于不满足质量设定要求的代码,通过门禁自动拦截。
这类工具的局限性之一是它们无法帮助您识别跨越代码库多个部分的大中型债务。他们也难以真正确定债务处理优先次序和解决问题所必需的背景信息。尽管有以上局限,但其相对低成本的投入和巨大的收益,是目前极为划算的首选实践之一。
自动化测试是借助于测试工具、测试规范,从而局部或全部代替人工进行测试及提高测试效率的过程。相对于手工测试而言,其主要进步在于自动测试工具的引入。
测试活动的自动化在许多情况下可以获得最大的实用价值,尤其在自动测试的测试用例开发和组装阶段,测试脚本被重复调用,可重用脚本可运行很多次。这样一来,在功能不变的情况下,开发人员实现一次测试用例及脚本,就可以对自己新增或修改的功能代码进行多次快速验证。因此,采用自动测试可以获得很高的回报。
在进行自动化测试的实践过程中,我们需要注意以下几点:
进行测试自动化有以下几点显著收益:
前面说到测试左移是质量内建的主要核心之一。其中开发自测又是最容易落地,且见效最快的一项。开发自测,实际上是偏向于白盒测试,而测试代码覆盖率是一种有效的白盒测试技术,是衡量软件测试工作充分性和完整性的重要指标之一。
简单来说,测试代码覆盖率就是测试过程中已经被执行过的代码占准备测试总代码量的比例和程度,它关注的是在执行用例时,有哪些代码被执行到了,有哪些代码没有被执行到。
一个比较完整的代码覆盖率平台,应该支持以下功能:
以上功能的前三项,一些开源/商业工具有一定程度的支持,几项管理要求的扩展功能在市场上目前很少有相关方面的支持,这一点需要各企业自行开发扩展。上海惠艾信息科技有限公司在这一方面经过一定时间的摸索和部分客户的落地实践,进行相关功能的持续改进和功能优化,目前已形成相对成熟“Hi-CC测试代码覆盖率平台”。
对于一件事情的实施质量,应该有一个共同认可的衡量标准,同样的,质量内建活动本身,也有做的好与不好,这个该如何去判断呢?
这里讲一下评判质量内建实施行为本身的度量准则。从根本上来说,质量内建的目的就是在生产的各个环节能够快速反馈及修正问题,从而使得整个生产过程流畅无阻碍,这也是保证既有完成功能可随时发布的重要前提。所以质量内建做得好的,一定是可以快速反馈质量的。因此如何衡量质量内建的实施状况,主要从快速反馈的四个方面来衡量:
质量内建在企业内部实施,有以下六个目标层次,而这些层次的推进也是质量验证逐步左移的一个过程,大家可以对照一下,看看自己或团队当前属于哪一层次:
第一层次:投产后验证,防止缺陷逃逸至外部市场。
第二层次:UAT测试和投产演练验证,防止缺陷逃逸出研发部门。
第三层次:SIT测试验证,防止缺陷逃逸出测试环境。
第四层次:DEV持续集成验证,防止缺陷逃逸出开发环境。
第五层次:开发本地验证,防止缺陷逃逸出个人开发环境。
第六层次:更好的需求、设计和开发实践,各环节不产生缺陷。
通过以上层次的层层推进,覆盖开发各个环节的相关人员,最终让质量内建的理念根植于每个团队成员心中,不容忍、不产生、不流转一个缺陷,所有人都把问题扼杀在自己的环节内,减少外部检查。质量未知或质量差就停止流动,直到质量变好为止。
原文地址:https://blog.csdn.net/weixin_68153586/article/details/134552958?spm=1001.2014.3001.5502