5.1.2  考虑可测试性需求

本节讨论站在测试角度本身可测试性需求的问题。可测试性需求需尽早发现,否则到了项目后期,会陷入一种欲罢不能的状态。甚至对于一些需求,由于它很重要,但由于又不可测,犹如一把悬在空中的镜,想把它拿下来,但由于悬得太高,只能"望洋兴叹"。

可测试性(Testability),简单地说,是指软件可以被完全有效测试的程度。这一概念的解释早在1990年的IEEEstd.610.12中给出。Freedman在1991年提出把可测试性定义为可控制性(Domain-controllable)和可观察性(Domain-observable)的集合,随着时间的推移这一概念不断丰富完善。目前软件可测试性要求主要包含可观察性(即可见性)、可控制性、可操作性、简单性和稳定性等。由于前二者更具代表性,下面主要介绍它们的特性与使用场景。

1.可见性

指被测软件的状态、数据输出、资源利用和其他影响能被准确地测试到,以决定测试是否通过。

可见性,并不限制在UI界面中能看到数据或状态的输入与输出。一些软件由于工作本身服务于底层,如主机与客户端的通信、后台数据库的处理,这些数据的中间处理过程在UI层并不可见,此时存在一种可测试性的问题。当然解决类似问题的方法很多,如增加日志记录是一种常用且很好的方式。通过日志记录的内容,测试人员可以很清楚软件的中间处理过程。我们熟悉的Windows操作系统自带的日志记录便是一个例子(用鼠标右键单击"我的电脑",在弹出的快捷菜单中选择"管理"命令,打开"系统工具"文件夹,选择"事件查看器"), 如图5-4所示是日志记录的片段。

图中的这些信息都是操作系统自动记录的,只要你设置好相关条件,系统会按你的要求在后台默默无闻地记录下所有相关信息。通过它可以了解系统的"喜怒哀乐"和"一言一行",虽然都是一些流水账,但我们既可以从中品尝到成功的喜悦,也可以找到失败的原因,实在是一个忠实的系统助手。类似地,对我们所测试的软件,同样可以提出这方面的测试需求,把需要的数据、操作记录通过日志形式记录下来,需要时进行分析,这无论对测试人员还是开发人员无疑都是福音。

2.可控性

指能向被测软件输入预期的数据,或修改它的状态,如一个应用程序有事件触发的阈值,能够设置和重新设置那些阈值可简化测试。

测试过程中,常会遇到一些测试环境难于模拟,但实际情况又有可能发生的场景,如运行在某特殊仪器上的监控软件,由于不同的环境温度对仪器的工作有影响,要求当仪器检测到正常工作范围外(超高温或超低温)的温度时,进行不同警戒的报警。而这种关于环境温度的用户场景,测试人员不好实际模拟,环境温度的变化也难于控制。存在一个可控性的测试需求,需要开发一个特殊测试工具与软件接口方可解决这个问题。

关于可控制性的测试需求,在我们实际工作中会经常遇到,如模拟成千上万用户同时访问某一网站,同时点击"登录"等。在相关的压力、性能的测试上更是如此。

下面是微软的一位测试架构工程师David Catlett 讲述他们是如何测试上百个调制解调器的案例。

【案例】如何测试上百个调制解调器?

在测试Microsoft Windows NT远程访问服务器(RAS)时,我们需要利用有限的资源对调制解调器的拨号服务器进行可伸缩性测试。我们碰到了一个可测试性的问题,为了能准确地模仿真实的用户部署,我们需要测试上百台调制解调器同时连接拨号服务器的情况,而现有的资金和实验室基础设施只能测试十几个调制解调器。测试团队想出了一个办法,用软件来模拟调制解调器,并将其与以太网相连,我们称之为RASETHER。使用这个测试工具终被证明是一个很好的办法。因为它是人们第一次在一个网络里创建另一个专有网络。如今,这个技术被称为虚拟专用网络或者VPN。起初为了Windows NT调制解调器服务器的可伸缩性测试而设计的测试工具变成了一个巨大的商业成功,并且成了用户进入公司网络的重要工具。

3.可操作性

指软件易操作、贴近用户。在软件上市前,进行用户体验测试是一个不错的做法。当然,软件可操作性高,被测试的效率也会更高。

4.简单性

指提交测试的模块或组件和应用程序越简单,测试起来越容易(测试成本也更低)。

5.稳定性

一般而言,测试的软件改动越小,质量越稳定。但是,软件的稳定性,与需求变更的控制,开发周期,测试发现严重Bug的时间早与晚等都有关系。

在研发阶段,由于需求的变化、代码的变更,软件的可测试性在开发的整个过程都有可能发生,所以发现可测试性需求,时机是无限制的。但下面的几个早期阶段,显得特别重要,分别是产品需求设计、软件需求设计、设计需求评审阶段,即代码还没出来之前。测试人员要认识到可测试性,需要他们清楚了解软件设计,评审现有的设计文档和阅读代码。但常常,测试人员因为害怕他们的请求会被拒绝而不愿意提出可测试性需求。

软件的可测试性被提出以后,一方面它可以逐步成为软件度量的重要标准,成为衡量软件产品质量优劣的一个重要尺度;另一方面,软件的设计人员也可通过新的设计方法,逐步将这一标准应用于从软件分析开始的一系列软件过程,提高软件质量。不论是哪一方面,合理并有效的可测试性分析对软件的开发过程都起着重要的作用。而且这种分析在软件生产过程中,开始得越早,越能节省软件开发投入,并提高效能。