输入检查
输入检查属于应用程序代码主线的一部分,通常通过类似IF(如果)、THEN(那么)、ELSE(否则)结构的语句来实现(或者是CASE、SELECT结构,或者是查找表(lookup table)的方式,这和具体使用的编程语言相关)。它们会接受一个输入值,如果输入值合法,那么接着运行处理它,否则就产生一条错误消息并中止处理。实现了输入检查后会报警,通常就是显示一条错误信息,该信息会描述当前状况,并准确地表示当前的输入值出现了不合法的情况。
这里,使用探索式测试法的测试人员必须牢牢抓住显示的错误信息,我的建议是必须仔细阅读每一条错误信息,检查该信息是否写错了,错误信息还可以透露出开发人员编程时的一些想法。错误信息一般会指出当前输入值被认定为非法值的根本原因以及如何修改让它变成合法输入值。这就可以给我们很多启发,比如还有哪些输入值可以触发其他一些错误信息,或者是哪些输入值实际上应该导致错误出现而软件却没有报错。
输入检查和异常处理(下文会详述)的根本差别在于代码的位置,当程序从外部接收到输入值后,一般紧接着就是输入检查的代码。读入输入值的代码之后会紧跟着一个IF语句,用于检查输入值是否合法。所以显示出的错误信息会非常精确,例如,“不允许输入负数”就是一条精确的错误信息,它告诉用户当前输入值哪里出了问题。如果错误信息比较笼统,往往表示这里使用的是异常处理的方式。接下来让我们看看什么是异常处理。
异常处理代码
异常处理代码就像错误检测,但是它不是对每一个输入值进行检测,异常处理代码把整个例程(routine)当成一个整体看待,检测其上发生的任何一个错误。错误处理代码会位于程序的结尾部分,或者位于一个单独的文件中,如果在软件运行的过程中出现任何被指定的错误,该段代码会进行处理。这意味着如果违背了输入规则,异常处理代码会接手处理,但是如果软件发生了其他某些错误,比如发生了违规内存存取(memory violation)等情况,异常处理代码也会进行处理。从本质上而言,异常处理代码可以处理各种各样的软件失效状况,不单单局限于非法输入。
这也表明,由异常处理代码产生的错误信息相对于由特定的输入检查产生的错误信息来说,一般都更笼统、含糊。因为该程序中任何一行代码都有可能引发一个异常,发生异常的原因也五花八门,所以异常处理代码无法知道到底哪里出了问题,问题的实质是什么。除了报告说“发生了一个错误”,异常处理代码也没有更好的处理办法。
如果测试人员看见这样一个空泛的通用出错信息,我的建议是接着反复测试同一段函数,继续使用刚才引发异常的输入数据,或者是稍微修改一下,看看会不会导致出错。尝试运行其他一些要调用该函数的测试用例,看看会发生什么情况。接连不断地引发异常很可能会让程序彻底失效。
非法输入应该被忽略,或者应该触发出错信息(出错信息可以显示在一个弹出式对话框中,也可以被输出到错误日志文件,或者是显示在界面的某个特定保留区域)。应该按照规格说明书所定义的来正常处理合法的输入,产生合理的结果。如果你观察到的和前述情形有任何不同,表明你已找到了一个有效的软件缺陷。