软件测试面临的问题
有一句格言是这样说的,“如果没有事先做好准备,就意味着做好了
失败的准备。”如果把这个隐喻应用在软件测试方面,就可以这样说“没有测试到,就意味着测试失败了”。软件出现故障的代价是巨大的:比如,烤箱或洗碗机不
能正常运作,产品就可能会失去顾客;医疗器械出现故障,病人就可能会失去生命。很多组织想通过严格的开发流程和静态分析来提高软件质量,但还是无法保证软
件应用程序一定不会出现问题。
本文并不是说能提供什么妙方,来开发出完全没有问题的软件。而是来探讨什么样的开发策略能够帮助提高软件质量。

 
图1:修复产品中存在的问题所花的费用远比在软件开发初期发现问题高得多
(Capers Jones, 《软件评估、基准测试与最佳实践》, 艾迪森维斯理出版社, 2000)
 
“hockey stick”图表(图1)
是软件开发历史上最常用到的图表。该图表说明,修复已部署的应用程序中存在的问题所需的费用,远比在代码开发阶段对这些问题进行修复所花的费用高。而众所
周知的是,严格的测试流程对于整个软件开发过程是大有裨益的,因此很多公司都尽力想办法度量测试的完整性。但是很多时候,有些组织在努力提高软件质量时,
提出的第一个问题却是“这会对时间安排及开发人员的工作量造成什么影响”,而不是“我们应该怎样度量测试的完整性。”

有软件开发组织在提高软件质量方面需要做的第一步便是:明白现在在测试的是什么。度量现有测试完整性的一个最简单的方法就是在测试过程中增加代码覆盖率分
析。代码覆盖率度量可以运用在整个开发生命周期中,并且不需要投入大量的时间和金钱,也不会对项目的时间安排造成负面影响。通过组织现有的测试流程,代码
覆盖率分析能够获得可用的测试有效性数据。

代码覆盖率分析是什么,它为什么重要?
代码覆盖率分析是指在应用程序的测试过程中,将程序的源代码与生成追踪数据的“面包屑”交织起来。这些数据经过后期处理,会显示哪些源代码在某次或某组测试过程中被执行了。代码覆盖率分析可帮助开发人员解答一些关键问题,如:

  • 是否该应用程序的所有部分都已经过测试
  • 是否有不应该存在于该程序中的死码

自动化的代码覆盖率分析非常重要,因为它有以下优势:

  • 可以轻松融入正常的软件开发过程中
  • 不影响正在进行的测试程序和进程
  • 选项可灵活部署,以涵盖测试的所有阶段

度量测试完整性的重要性

一点似乎是不言而喻的,即:程序中没有经过严格测试的部分最容易存在问题。除非能够发现那些未经充分测试的地方,否则就没有办法真正提高软件质量。比较典
型的例子就是,有些组织在第一次使用代码覆盖率分析的时候,会很惊讶地发现在当前测试程序下,只有70%的程序代码被执行了。有可能剩下的30%的代码是
非关键功能,是错误处理,或边缘情况,但是也有可能这些未经测试的代码是程序的关键部分,只是开发测试程序的团队忽略了这些代码。
如果没有度量,就无法估量测试的有效性。而覆盖率分析则是度量测试完整性的最好的方法。

测试原有的代码库(Legacy Code Base)

乎所有的应用都会用到旧有代码(legacy
code),但是要理解这些代码的功能、预期效果、质量却比较困难。如果对那些没有相关测试架构的旧代码进行修改或重构,肯定会破坏正在使用的一些功能。
那么应该如何提高原有代码库的质量呢?第一步就应该是在系统测试或功能性测试过程中加入代码覆盖率分析。如果在测试的同时进行覆盖率分析,就可以将程序中
经过充分测试的部分与测试不足的部分分离开。开发人员可以很有把握地对那些经过充分测试的部分进行修改,但如果是对测试不足的部分进行修改,则需要非常谨
慎。

一旦得到了测试结果,在新功能开发完成之后,就可以根据覆盖率信息增加对新功能的测试。这样经过一段时间之后,代码库就会得到充分测试,质量也会提高,而且便于维护。

如果不重构代码库,代码库就会变得难以管理;但是如果不进行完整测试,则无法完成重构工作。

聚焦测试资源

些软件应用程序可能不需要达到100%的覆盖率。因为这些程序的关键度可能比较低,或者只有一小部分功能是经常使用的。即便是这样,还是要知道该程序中哪
些部分已经经过测试,哪些部分尚未经过测试。因为这有利于将测试资源聚焦在那些能够产生最大效益的地方,并可提供重要的测试信息,如测试的有效性指标。毕
竟,如果用户不能在地址栏输入URL的话,那么即使IE浏览器里的高级选项功能再强大,对用户而言也是没有意义的。

什么应该被测试与测试本身同等重要。

将覆盖率分析应用到整个生命周期

盖率分析的一大优势就是它可以应用在整个开发生命周期中(从最初开发人员进行的单元测试,直到最后测试人员进行最终版本的测试)。在所有情况下,覆盖率分
析的目标都是评估测试活动的有效性。如果在每个测试阶段都进行覆盖率分析,并在每次发布之前将所有的分析结果合并到一个报表中,那么当集成开始时会碰到的
问题就会减少,而且不会影响发布日期,最后客户可能会碰到的问题也将大大减少。

采用覆盖率分析的商业案例
虽然很多人都认同制造出高质量的产品是一个很好的目标,但高品质的交付成本也会相应变高。而且,高品质的产品需要花费更多的时间和金钱。在涉及到业务目标的时候,每个商人都会对这些开销进行评估。

我们认为,使用覆盖率分析能够带来切实、重大的商业利益,包括:

  • 提高用户体验
  • 使代码库易于维护
  • 增强竞争优势

提高用户体验

多记录记载,
在过去的30年里,基础工业领域发生了质量革命。奇怪的是,与拥挤的市场中的其它产品不一样,软件不需要和同类产品遵守同样严格的质量标准(高安全性软件
除外)。实际上,产品交付的时候,其软件存在缺陷是一个很普遍的问题,客户已经知道在产品停止运作的时候重启就行了。但是如果软件存在问题,常常出现故
障,会降低品牌价值。公司小心翼翼精心建立的声誉,可能因为某次不合格的产品发布就瓦解了。如今的客户比以往任何时候都强大,他们现在可以用社交媒体工
具,即时对产品做出评论,提出反馈,迅速反映出产品的质量问题。
利用覆盖率分析评估测试的完整性,就能保证在客户使用产品之前,程序中所有的功能已经通过了测试,而客户不会是第一个来执行程序中的某个功能的。

使代码库易于维护

在软件应用程序越来越大,生命周期越来越长,这就意味着现在建立的代码可能会要用很长一段时间,而且随着程序的拓展,会运用在很多环境中。开发组织一定要
有信心,确定自己的代码库是经过充分测试的。因为只有这样,在团队开发新的应用的时候,才能保证新功能不会破坏已有的功能,整个系统能够实现预期效果。
代码覆盖率分析会暴露测试过程中的漏洞。通过不断发现漏洞和解决问题,一段时间之后,测试的完整性和软件的质量都会得到提高。

增强竞争优势
2012
年,IBM公司发起了“全球首席执行官(CEO)调查”活动,有400多位业务主管和IT高管参与其中,研究哪些因素影响各个组织在当前市场中的竞争力。
各位执行官将科技归结为影响组织竞争力的最重要的外部因素,还有超过50%的首席执行官认为软件开发是获得竞争优势的关键驱动因素。(如图2)

 
图2:高品质的软件开发是获得市场竞争优势的关键驱动因素(来源IBM)

在软件开发生命周期中,如果添加了新功能或者对问题进行了修复,一个自动化的、完整的、可重复的测试流程则有助于减少回归次数。这样就可以减短发布周期,加快投放市场的速度。在如今这个竞争激烈的环境下,上市的时间直接关系到产品会处于行业主导地位还是失败地位。在这个软件越来越普及的市场,在开发过程中将软件质量放在第一位,是非常明智的经营策略。

理想的覆盖率分析工具
如果由开发人员来为这个测试工具提供信息会怎么样?他们无疑会列出很多特点,但是如果浓缩一下,可以概括出以下关键特点:

  • 便于与现有的构架和测试步骤融合

-  很方便地生成完整版的应用系统

  • 几乎不影响现有的测试活动

- 测试人员不会发现正在进行覆盖率度量

  • 支持各个阶段的测试

- 各类测试都有统一的覆盖率视图是极为重要的

  • 趋势报告

- 报告代码库是如何扩展的,以及代码覆盖率是否同步

  • 与多种编译器结合

- 所有的编译器都有一个特定的扩展符支持相应的语言语法,这是一定要支持的。

  • 与需求管理工具结合

- 如果有正式的需求,那么测试和覆盖率要与需求映射

  • 完整的命令行界面

- 通过脚本来获取数据和报告是实现自动化的关键

  • 可扩展以支持庞大的代码

- 将代码覆盖率的度量存储在关系数据库中是实现可扩展性的关键

选择合适的测试工具对于开发高质量的应用程序而言是极为重要的。

结论
开发高质量的软件应用程序是一个循序渐进的过程,没有什么妙招来快速提高质量,既没有自动化的解决方案,也没有其他捷径来实现这一目标。工程师和管理团队在努力开发高质量的应用程序时,要记住以下几条基本策略:

  • 如果没有度量,就无法估量测试有效性,而覆盖率分析则是度量测试完整性的最好的方法。
  • 如果不重构代码库,代码库就会变得难以管理;但是如果不进行完整测试,则无法完成重构工作。
  • 什么应该被测试与测试本身同等重要。
  • 利用覆盖率分析评估测试的完整性,就能保证在客户使用产品之前,程序中所有的功能已经通过了测试,而客户不会是第一个来执行程序中的某个功能的。
  • 代码覆盖率分析会暴露测试过程中的漏洞。通过不断发现漏洞和解决问题,一段时间之后,测试的完整性和软件的质量都会得到提高。
  • 在这个软件越来越普及的市场,在开发过程中将软件质量放在第一位,是非常明智的经营策略。
  • 选择合适的测试工具对于开发高质量的应用程序而言是极为重要的。

结论:要保证软件的质量,就要进行完整、有效的测试,而度量测试完整性最好的方法就是进行覆盖率分析。



VectorCAST - 通过确保测试的完整性控制产品质量的更多相关文章

  1. Testing - 测试基础 - 理解

    理解 目的 测试就是要找到关键信息,有关项目和产品的关键决策都是根据这些信息做出. 对产品质量做出总体评估. 找出并报告团队所有可能会对产品价值产生消极影响的问题(但并不意味着能发现所有问题). 重心 ...

  2. Testing - 软件测试知识梳理 - 理解测试

    理解 目的 测试就是要找到关键信息,有关项目和产品的关键决策都是根据这些信息做出. 对产品质量做出总体评估. 找出并报告团队所有可能会对产品价值产生消极影响的问题(但并不意味着能发现所有问题). 重心 ...

  3. 手机APP测试

    注:以下内容来自网络: 一.手机APP测试类型 1.1 接口协议测试 在APP客户端开发设计时,一般服务端会提供相应的接口协议文档,接口协议文档的质量,决定了APP的开发进度.此部分的测试,应首先检测 ...

  4. ASP.NET Core 中文文档 第四章 MVC(4.5)测试控制器逻辑

    原文: Testing Controller Logic 作者: Steve Smith 翻译: 姚阿勇(Dr.Yao) 校对: 高嵩(Jack) ASP.NET MVC 应用程序的控制器应当小巧并专 ...

  5. BVT & BAT (版本验证测试和版本验收测试)

    BVT & BAT 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.BVT: (Build Verification Test ) BVT的概念: BVT(版本验证测试)是在所有开发 ...

  6. [翻译]写给精明Java开发者的测试技巧

    我们都会为我们的代码编写测试,不是吗?毫无疑问,我知道这个问题的答案可能会从 “当然,但你知道怎样才能避免写测试吗?” 到 “必须的!我爱测试”都有.接下来我会给你几个小建议,它们可以让你编写测试变得 ...

  7. 【Android测试】【第十八节】Espresso——环境搭建

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5604642.html 前言 首先还是老规矩,看看官方文档吧 ...

  8. 用maven搭建 testNG+PowerMock+Mockito测试框架

    单元测试是开发中必不可少的一部分,是产品代码的重要保证. Junit和testNG是当前最流行的测试框架,Junit是使用最广泛的测试框架,有兴趣的话自己baidu一下. testNG基于Junit和 ...

  9. 敏捷开发 and 敏捷测试

    名词解释 agile: 敏捷的:灵活:敏捷开发. scrum: 扭打,混打:并列争球:参加并列争球. sprint:  冲刺,全速跑. backlog: 积压的工作:积压待办的事务. retrospe ...

随机推荐

  1. [hdu6991]Increasing Subsequence

    令$f_{i}$​​表示以$i$​​为结尾的极长上升子序列个数,则有$f_{i}=\sum_{j<i,a_{j}<a_{i},\forall j<k<i,a_{k}\not\i ...

  2. [luogu4318]完全平方数

    首先,我们肯定要用到二分答案. 这道题目就是统计第k个μ不是0的数,线性筛显然会炸飞的,但当二分出一个数而统计有多少个小于等于他的合法数时,就可以容斥一下,即:1^2的倍数都不合法,2^2的倍数都不合 ...

  3. [loj3176]景点划分

    不妨设$a\le b\le c$,那么相当于要找到两个大小至少为$a$和$b$的连通块(连通块可以通过删除度最小的点变小) 以一个点为根建出dfs树并对以下情况分类讨论: 1.存在一个节点满足$\ma ...

  4. [bzoj1263]整数划分

    观察样例,令f(n)表示n拆分的答案,猜想$f(n)=3f(n-3)$,当$n\le 4$时$f(n)=n$取3的原因是因为对于给定的$x+y$,当$4<x+y$,显然有$3^{x+y-3}$最 ...

  5. [JS高程]JavaScript中的RegExp对象

    目录 1. RegExp 1.1 表示格式: 1.2 匹配模式: 1.3 RegExp 实例属性 1.4 RegExp 实例方法 1.4.1 exec() 1.4.1.1 基本用法 1.4.1.2 e ...

  6. 消息抽象层设计和实现-OSS.DataFlow

    前面已经介绍了消息生产消费中间类库(OSS.DataFlow)的简单使用,这篇主要介绍内部的设计实现.主要内容包含: 1. 消息生产消费的抽象设计. 2. 具体使用示例 一. 消息生产消费的抽象设计. ...

  7. 【AWS】通过对等网络打通VPC访问

    参考 什么是 VPC 对等? - Amazon Virtual Private Cloud 目的 有些服务,比如内网ALB,不公开的RDS仅允许VPC内部访问.如遇到跨账号.跨区域访问,则需要在两个v ...

  8. Hive处理Json数据

    Json 格式的数据处理 Json 数据格式是我们比较常用的的一种数据格式,例如埋点数据.业务端的数据.前后端调用都采用的是这种数据格式,所以我们很有必要学习一下这种数据格式的处理方法 准备数据 ca ...

  9. JOI 2020 Final 题解

    T1. 只不过是长的领带 大水题,把 \(a_i,b_i\) 从小到大排序. 发现最优方案只可能是大的 \(a_i\) 跟大的 \(b_i\) 匹配,小的 \(a_i\) 与小的 \(b_i\) 匹配 ...

  10. 洛谷 P4272 - [CTSC2009]序列变换(堆)

    洛谷题面传送门 u1s1 在我完成这篇题解之前,全网总共两篇题解,一篇使用的平衡树,一篇使用的就是这篇题解讲解的这个做法,但特判掉了一个点,把特判去掉在 BZOJ 上会 WA 一个点. 两篇题解都异常 ...