用户输入测试(3)

上一篇 / 下一篇  2011-03-16 12:36:20

输入检查

  输入检查属于应用程序代码主线的一部分,通常通过类似IF(如果)、THEN(那么)、ELSE(否则)结构的语句来实现(或者是CASE、SELECT结构,或者是查找表(lookup table)的方式,这和具体使用的编程语言相关)。它们会接受一个输入值,如果输入值合法,那么接着运行处理它,否则就产生一条错误消息并中止处理。实现了输入检查后会报警,通常就是显示一条错误信息,该信息会描述当前状况,并准确地表示当前的输入值出现了不合法的情况。

  这里,使用探索式测试法的测试人员必须牢牢抓住显示的错误信息,我的建议是必须仔细阅读每一条错误信息,检查该信息是否写错了,错误信息还可以透露出开发人员编程时的一些想法。错误信息一般会指出当前输入值被认定为非法值的根本原因以及如何修改让它变成合法输入值。这就可以给我们很多启发,比如还有哪些输入值可以触发其他一些错误信息,或者是哪些输入值实际上应该导致错误出现而软件却没有报错。

  输入检查和异常处理(下文会详述)的根本差别在于代码的位置,当程序从外部接收到输入值后,一般紧接着就是输入检查的代码。读入输入值的代码之后会紧跟着一个IF语句,用于检查输入值是否合法。所以显示出的错误信息会非常精确,例如,“不允许输入负数”就是一条精确的错误信息,它告诉用户当前输入值哪里出了问题。如果错误信息比较笼统,往往表示这里使用的是异常处理的方式。接下来让我们看看什么是异常处理。

  异常处理代码

  异常处理代码就像错误检测,但是它不是对每一个输入值进行检测,异常处理代码把整个例程(routine)当成一个整体看待,检测其上发生的任何一个错误。错误处理代码会位于程序的结尾部分,或者位于一个单独的文件中,如果在软件运行的过程中出现任何被指定的错误,该段代码会进行处理。这意味着如果违背了输入规则,异常处理代码会接手处理,但是如果软件发生了其他某些错误,比如发生了违规内存存取(memory violation)等情况,异常处理代码也会进行处理。从本质上而言,异常处理代码可以处理各种各样的软件失效状况,不单单局限于非法输入。

  这也表明,由异常处理代码产生的错误信息相对于由特定的输入检查产生的错误信息来说,一般都更笼统、含糊。因为该程序中任何一行代码都有可能引发一个异常,发生异常的原因也五花八门,所以异常处理代码无法知道到底哪里出了问题,问题的实质是什么。除了报告说“发生了一个错误”,异常处理代码也没有更好的处理办法。

  如果测试人员看见这样一个空泛的通用出错信息,我的建议是接着反复测试同一段函数,继续使用刚才引发异常的输入数据,或者是稍微修改一下,看看会不会导致出错。尝试运行其他一些要调用该函数的测试用例,看看会发生什么情况。接连不断地引发异常很可能会让程序彻底失效。

  非法输入应该被忽略,或者应该触发出错信息(出错信息可以显示在一个弹出式对话框中,也可以被输出到错误日志文件,或者是显示在界面的某个特定保留区域)。应该按照规格说明书所定义的来正常处理合法的输入,产生合理的结果。如果你观察到的和前述情形有任何不同,表明你已找到了一个有效的软件缺陷。

常规输入还是非常规输入?

  输入分为常规输入和非常规输入。一个常规输入表示没有特定的格式或含义,可以直接使用于被测试软件。常规输入就是那些开发人员计划中的输入,也是真实用户经常使用的输入值。非常规输入只在那些比较特殊的情况下才会发生,或者完全是由于某个机缘巧合才会发生。比如,一个用户想在文本框内输入大写的字母C,他可能想使用Shift+c来键入该字符,但是他不小心按下了Ctrl+c键。Shift+c是一个常规输入,代表大写字符C。但是Ctrl+c就有完全不同的含义,比如在Windows系统中,它可以表示复制(Copy)或取消(Cancel)。在一个输入框内键入Ctrl+c或其他某些特殊字符可能会导致某些意想不到的情况,甚至引发一些不希望发生的状况。

  所有和Ctrl、Alt、Esc按键组合的字符都算得上是特殊字符,比较明智的做法是在应用程序里测试某些这样的特殊字符,如果发生不合要求的情况就要把它当成软件缺陷上报。测试人员可以安装最终用户可能会使用的那些特殊字体,使用这种方法来测试不同国家的语言。某些字体,在处理Unicode或某些多字节字符集时,如果它没有被正确地本地化,不能支持当地的语言时,就会发生软件失效的情况。测试人员可以从产品的文档出发,看看该软件支持那些语言,然后安装那些所支持语言的语言包和字体库,这样就可以开始测试那些特殊字符了。

  还有一些特殊字符与软件运行的平台相关。每一个操作系统、编程语言、浏览器和运行时环境都有一些特定的保留词,它们具有特殊的含义。Windows就有一些保留的设备名称,例如LPT1、COM1、AUX等。如果一个输入框期待测试人员输入一个文件名,但是如果键入的是这些保留词,程序往往会挂起或彻底崩溃。根据软件运行平台的不同,在输入框中键入的特殊字符有可能由运行平台来决定它的含义,也有可能由当前软件来决定。明确回答该问题的唯一方法是找出那些相关的特殊字符,然后使用它们作为测试输入值。

  默认输入或用户提供的输入?

  如果在一个空白的文本字中不输入任何东西,可以算是一个最简单的测试。但是对测试人员来说是简单,对被测软件则并不简单。事实上,测试人员不输入任何东西并不意味着软件就不需要花功夫去处理这些情况。

  不管是在空白字段中不输入字符或是给某个API传递一个NULL参数,它们都需要软件在默认(default)的情况下运行下去。通常这些默认的情况要么被忽视,要么没经过深思熟虑。在单元测试(unit testing)中,它们也常常被忽视,所以手工测试就成为最后一道防线。

  开发人员必须处理这些空白的输入,因为他们知道并不是所有的用户都会提供输入。用户在输入时会跳过这些字段,他们可能根本没有看见该字段,或者没有意识到这些字段是需要输入的。如果程序有很多数据输入字段(比如一个Web表单要求用户输入姓名、送货地址和其他一些私人信息),显示出的错误信息还会根据哪些字段没有填而变化。这一点在测试中也很重要,不能忽视。

  除了测试不输入任何值,还有很多其他东西可以测试。如果一个表单含有一些预先设置好的值,我在这里把这些值称为开发人员设置的默认值。比如,在一个打印表单中的打印页数字段,默认值就可能是“全部”。默认值反映的是开发人员认为的一个正常用户最有可能使用的数值。测试人员需要检验开发人员所做的这些假定,必须保证开发人员在选择这些默认值时没有犯任何错误。


TAG:

 

评分:0

我来说两句

日历

« 2024-05-13  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 15040
  • 日志数: 23
  • 建立时间: 2010-11-05
  • 更新时间: 2012-02-18

RSS订阅

Open Toolbar