选择测试入口

在实际进行驱动编写工作前,第一个重要的步骤是选择一个测试入口,设计测试循环。选择一个好的入口是做好模糊测试的基本要求。一个好的入口有以下的特点:

  • 首先,从功能角度上,这个入口应该接收单一来源的输入,在处理这个输入的过程中,又会用到我们想测的大部分功能。这样才能有效地测到系统的各个方面。

    例如,很多格式的序列化反序列化库,会有一个统一的parse,接受一个输入,将它解析成指定的格式。这个功能内部会调用各种子结构的解析,而对外提供一个统一的入口,这就是一个很好的例子。 反之,要么输入过于复杂,要么功能过于简单,都不适合作为测试的入口。

  • 其次,这个入口的执行过程应该与输入直接相关,相同的输入总是能得到相同的结果,这样才使得外部输入和变异有意义。反之,如果执行过程是随机化的,或者有很复杂的内部状态,每次调用的结果跟输入只是部分有关,那么即使测出了问题,也容易出现无法复现的问题。

    例如,一个排序算法,给定一个输入,总是能得到相同的结果,这就是一个较好的测试入口,反之,一个shuffle算法,每次把输入按照随机顺序输出,就不是一个合适的目标。

  • 最后,对于正常情况下可构造的输入,程序总会有输出,不会崩溃,也不会提前退出。这样才能够区分错误输入导致的业务错误和BUG导致的系统问题。反之,如果遇到业务错误程序也崩溃,那么测试结果中就会出现大量的业务问题,掩盖掉真正的系统问题。

    例如,一个函数如果使用抛异常的方法来代表业务错误,那么在测试入口中一定要catch掉业务错误的异常,否则就会变成未捕捉的异常,导致程序崩溃。

测试入口的选择跟具体的待测对象息息相关。对于复杂的应用、类库,还可能会存在多个测试入口。我们可以通过实际测试工作积累经验,掌握快速识别定位入口的方法。