软件可测试性概述
摘要:没有尽善尽美的东西,也没有完全完美的行为,任何一个小小的失误都会导致现实的偏差。在软件开发过程中,难免会有失误,或缺陷等不完美的地方。这种问题虽然不能根除,但可以尽可能减少。所以为了提高软件质量,软件开发增添了重要的一环——软件测试。
关键字:软件开发;软件测试;可测试性。
Abstract:No perfect thing, no perfect behavior, any small mistake will lead to the deviation of reality. In the process of software development, there will inevitably be mistakes, or defects and other imperfections. Although this problem cannot be eradicated, it can be reduced as much as possible. So software testing is an important part of the software development process.
Key:software development;software test;Testability.
- 1. 可测试性定义和特征
1.1. 可测试性概念
1.1.1. 可测试性(Testability)的概念提出于上个世纪70年代。当时,由于一些硬件电路系统膨胀到一定的量级,对其测试就显得异常复杂。于是,众学者纷纷提出对硬件电路的可测试性度量法方法,于是形成了可测试分析研究分支。到上世纪90年代,逐渐把硬件的可测试分析研究应用到软件上。然而,软件可测试性并没有统一的定义,下面是几种可测试性定义:
1.1.2. IEEE标准的定义
① 为一个系统或构件建立测试标准并通过执行 测试来确定该标准满足的难易程度。
② 对每个声明的需求建立一个测试标准并通过 执行测试来确定该标准被满足的难易程度
1.1.3. Gao定义
1.1.4. 根据一定测试准则对软件进行测试,实现准则充分覆盖所需最小测试用例数量,并将可测试性描述为可理解性、可观察性、可控性、可跟踪性和测试支持能力的综合
1.1.5. Jeffrey等人对软件可测试性进行两种不同但又相近的定义
① 任意给定输入,测试过程中揭示程序中存在的故障的可能性。
② 如果一个软件存在故障,在下一次测试时,软件失败的可能性,即软件可测试性是揭示程序中潜在故障的容易程度。
1.1.6. 软件可测试性
1.1.7. 是指在一定的时间和成本前提下,进行测试设计、测试执行以发现软件缺陷、隔离和定位软件故障的能力。
1.2. 可测试性特征
1.2.1. Bach 在给出了一个软件的可测试性应具有如下特征:
①可操作性:如果设计的软件存在很少缺陷或 基本没有缺陷话,那么在进行测试时的效率就会很高。
②可观察性:可观察性好的软件产品测试时可以容易地观察到测试结果。
③可控制性:能够从软件产品的输入来控制它 的各种输出,软件硬件状态和变量能够直接由测试工程师控制。从而使软件的自动测试工作变得更容易。
④可分解性:软件可以分解为独立的模块,能够被独立地测试。
⑤简单性: 软件在满足需求的基础上要尽量简单。
⑥稳定性:软件的变化很少,保持稳定的状态。
⑦易理解性:软件的设计易于理解。
- 2. 可测试性的意义
2.1. 可测试性的目的
软件开发的一切辅助性行为最终都是为了减少开发的成本尽可能保证利益,而单纯测试的目的又有一下方面:
① 在给定的产品中尽可能多地发现错误(或bug)。
② 演示一个给定的软件产品与它的需求规格匹配。
③ 使用最小的成本和努力来验证软件的质量。
④ 生成高质量的测试用例,执行有效的测试,并发布正确和有用的问题报告。
2.2. 可测试性的重要性
可测试性是软件测试的难易程度,为什么要软件测试?有什么重要意义呢?
测试很重要,因为软件错误可能很昂贵甚至很危险,一个bug越长越不被发现,它就可能带来更大的隐患。此外,如果测试团队错过了准确详尽地捕捉或识别风险和软件问题,会导致一些灾难发生,那么就需要付出昂贵的代价来检测bug,所以软件漏洞或是Bug可能会导致货币和人员的损失,历史上太多这样的例子,下面我们就来看看这些经典的事例。
2015年4月,伦敦彭博终端由于软件漏洞宕机,导致金融市场上超过30万交易商受到影响。迫使政府推迟30亿英镑的债务出售。
日产尼桑汽车由于安全气囊感应探测器的软件故障,召回超过100万辆汽车。据报道,由于此软件故障导致两起事故。
星巴克咖啡由于POS系统的软件故障无法处理交易,因此被迫关闭了美国和加拿大约60%的商店。
亚马逊的一些第三方零售商看到他们的产品由于软件故障价格全部被降至1英磅,由此导致惨重损失。
Windows 10中的漏洞,此问题使用户能够通过win32系统中的缺陷脱离安全沙箱。
2015年,F-35战斗机成为软件漏洞的受害者,导致其无法正确检测目标。
1994年4月26日,中国航空公司空中客车A300因软件故障而坠毁,造成264人无辜死亡
1985年,加拿大的Therac-25放射治疗机由于软件Bug而发生故障,向患者提供了致命的辐射剂量,造成3人死亡,3人严重受伤。
1999年4月,一个软件漏洞导致12亿美元的军事卫星发射失败,这是历史上最昂贵的事故。
1996年5月,一个软件问题导致美国一家大型银行823名客户的银行账户被记入9.2亿美元。
2018年6月27日,阿里云出现大规模故障,原因为上线自动化运维系统触发未知Bug,导致部分产品访问链接不通,影响时间约半小时,不知道云中的程序猿们年终奖是否会泡汤。
- 3. 如何提高软件可测试性
既然软件测试十分重要,那么我们就应该尽可能的去提高软件的可测试性。如何提高呢?从以下方面:
3.1. 可测试性本身性质:
1.坚持测试驱动设计(测试先行)的方法。
2.尽量做到每个操作对应一个函数,使函数小型化。
3.数据的显示与控制分离
4.可控制性设计
5.可分解性设计
6.稳定性设计
7.易理解性设计
8.可观察性设计
9.测试驱动和桩的设置
10.适合增量式开发的可测试性设计
11.提供统一的操作执行面板
3.2 可测试性编码
1.注释需要详尽。特别对于接口,要描述清楚功能、实现及参数;
2.使用模块化方法,编码低耦合、高内聚;
3.为集成测试与系统联调准备调测开关及相应打印函数,并且要有详细的说明;
4.为单元测试选择恰当的测试点,并仔细构造测试代码、测试用例,同时给出明确的注释说明。测试代码部分应作为(模块中的)一个子模块,以方便测试代码在模块中的安装与拆卸(通过调测开关);
5.使用断言来发现软件问题,提高代码可测试性;
6.用断言来检查程序正常运行时不应发生但在调测时有可能发生的非法情况;
7.为测试自动化工具提供所需要的特定“钩子(hook)”;
8.对于每个功能,提供访问、修改“状态”变量的接口,包括提供查询、修改上层软件、软硬件接口、底层硬件状态的接口及打印;
9.提供查询系统状态的接口。比如内存使用、程序使用进程数等;
10.对于测试因为环境等因素而可能无法测试的功能,提供接口模拟软件实现该功能的过程;
11.对于修改功能,提供修改功能参数单位的接口,以便于进行如软件性能等的测试;
12.出错及异常处理保存记录,记录具有详细的属性,并且格式统一、意义明确;
13.在程序异常时,除了保留日志,还需要提供观察、恢复的外部方法;
14.对全局变量、特殊结构,提供查询的方法。
3.3 可测试性调试与定位
1.对于程序中所涉及到的变量尽可能的在调试过程中可以查询及修改;
2.在整个软件系统执行过程中为每个关键业务或相对独立的业务设定一个调试点,便于系统集成和问题范围的定位;
3.在设定好的调试点处对处理的业务输出数据和全局数据进行可视化输出,便于测试结果的分析。
3.4 测试所需文档
1.需求规格说明书
2.概要设计说明书
3.详细设计说明书
4.系统功能清单
5.系统运行环境搭建指导书
6.系统操作指导书
参 考 文 献:
[1]Jeffrey M Voas,Kelth W Miller.Software Testability[J],The New Verification.IEEE Software,1995,12(3):17-28.
[2]Gao Jerry. A component testability model for verification and measurement[C].The 29th Annual Internation Computer Software and Application Conference. IEEE Computer Society, 2005:211 -218.
[3]Jeffrey M Voas,Keith W Miller.A Design Phase Semantic Metric for Software Testability[M].The 4th Annual Oregon Workshop on Software Metrics.Oregon,Silver Falls,1992:175-179.
[4]Bach James.Heuristics of software Testability[M].James Bach of Satisfic.Inc.1999:23 -25.
[5]甄晓丽.基于语义的软件可测试度量的研究与应用[D].南京:南京航空航天大学,2007:10-12.
[6]Vince.《软件可测试性设计》
[7]林锐.《高质量C++/C编程指南》
[8]林锐.《软件工程思想》