如何测试用户输入

  想象一下这个场景,光标位于某个文本输入框中,它正一闪一闪地等待我们键入值。每个测试人员每天都会多次面对此情形。这时,测试人员会做些什么?该使用什么样的策略来决定使用这个值而不用那个值?需要考虑哪些因素?我一直很吃惊那些测试新手不知道可以从哪里学习这些测试策略。更让我吃惊的是,如果我向10个测试人员询问上述这些问题,我会得到12个不同的答案。是时候把所有这些问题整理编辑起来了,这正是本书想做到的。

  首先,我们必须意识到我们正在测试的软件和其他软件并没有什么不同。测试人员倾向于认为自己测试的软件比较特殊,和其他人的程序完全不一样。事实上并非如此。所有的软件,从操作系统、API函数、设备驱动程序、常驻内存的程序、嵌入式应用、系统代码库,到Web应用程序、桌面应用程序、基于Form的用户界面,甚至游戏软件,它们可能运行于完全不同的环境中,但是它们都会执行四个基本任务,即接收输入、产生输出、存储数据和进行运算。各种输入的产生方式各不相同,把输入传入应用程序的方法也会五花八门。相对某些应用程序而言,其中有些程序可能更注重时效性,但是所有的软件从基本面上来说都是相同的,我在本书中针对的是这些相同的本质。读者从本书中可以获得一些通用的知识,再把它们应用到各自测试的软件上去,也是按照被测试应用程序的特定输入方式来输入数据,以及按照这些应用程序规定的方式和运行环境进行交互。我个人而言,我测试过美国政府的武器系统、实时安全监控软件、反病毒引擎、蜂窝交换机、高层操作系统、底层操作系统、Web应用、桌面应用程序、大型服务器软件、控制台程序、桌面游戏软件,还有很多因为时间久远我已经说不出其名称的软件。但是我这里讲述的概念,对前述软件都适用。我把这个技术的实际应用留给读者自己来尽情发挥。

  合法输入和非法输入

  首先让我们理解正向测试(postive testing)和逆向测试(negative testing)的概念。你是想确认程序可以进行正常工作呢,还是在想办法让它失效?要知道,这两者都需要进行深入测试,对某些应用领域内的程序,逆向测试尤其重要,所以我们必须找到一个可用于分析合法输入和分析不合法输入的策略。

  测试人员解决这个问题时首先想到的是依据开发人员的思路来构造一个非法输入值。开发人员必须要精确地知道什么是合法输入,什么是非法输入。对于他们认为的非法输入值,他们通常会实现一段错误处理(error-handling)代码,用于处理这些情况。他们在哪些地方编写了错误处理代码,具体错误代码是如何实现的,这些都需要测试。

  测试人员应该牢记,大多数开发人员都不喜欢编写错误处理代码。一般没有人认为大家热衷于计算机科学是出于喜欢编写那些出错信息。因为用户使用软件的目的是要求代码必须实现某些功能,所以开发人员更愿意编写功能代码。通常,开发人员会忽视错误处理代码,或者编写时草草了事,因为开发人员是希望可以尽快地编写“真正”的功能代码。正因为开发人员的这种态度,它通常会导致应用程序的这些部分有很多问题,所以测试人员必须重视对这些地方的测试。

  假设开发人员编写了一段功能代码,用于接收一个输入值。他们可能会立刻想到需要检查该输入值是否合法,可能会做如下几件事情。他们可能会暂时停止编写功能代码,转而先实现错误处理代码。他们也有可能先在程序里加一段注释(比如说,“本处需要添加错误处理代码”),然后决定以后再来处理它。在前者的情况下,由于开发人员的思路被多次打断,首先需要从编写功能代码切换到编写错误处理代码,然后还要转换回去。这会干扰开发人员的想法,增加代码出错的可能性。在后者的情况下,则有可能会发生开发人员再也没有回头添加那些错误处理代码的情况,毕竟,开发人员都很忙,不是吗?我曾经不止一次地在已发布的软件代码中发现那些“本处还需要实现……”的注释!