|
本节讨论你可购买到或自己开发的测试工具。在此也无法说出某一种具体产品,因为在你 读到此处时它们可能都过时了。你可查阅最近一些你最喜爱的程序员杂志。 建立“脚手架”以便测试你的子程序 “脚手架”这词来自建筑术语。“脚手架”用于方便工人能到达建筑物的一些地方。软件“脚 手架”的唯一目的是为了能方便地测试代码。一种类型的软件“脚手架”是可被接受测试的高 级子程序调用的低级子程序。这样的子程序可称为“残桩”。残桩的可实现程序由你确定,这取 决于所需的正确程度。它应能: · 不需作任何动作就能马上交还控制。 · 能输出诊断信息,可能是输人参数的反应。 · 能测试反馈给它的数据。
能从交互式输入中的返回值。 · 不论输入如何都能返回一个标准答案。 · 可增加分配给实时子程序的时钟周期。 · 其功能相当于一缓慢、厚实、简单或欠精确的实时子程序。 另一种类型的“脚手架”是调用正在测试中的伪子程序。这称为“驱动”或“测试工具”。 它应能: · 能调用具有固定输入集的子程序。 · 对交互式输入进行提示,并调用有关子程序。 · 从命令行中接收变量(操作系统应能支持这种使用)并调用有关子程序。 · 从文件中读变元,并调用子程序。 · 由预定义输入数据集对有关子程序多次调用。 另一种“脚手架”是虚拟文件,它和实际文件有着相同的构成。一个较小的虚拟文件可提 供许多方便。由于它较小,你可了解它的确切内容并且确信文件本身无错,由于你是特意将其 用作测试的,你可设计其内容以使其间的任何错误是显而易见的。 显然,创建“脚手架”需要付出劳动,如果子程序中的错误已被发现,你还可重新利用“脚 手架”。如果你使“脚手架”,你就可测试子程序而不必担心其受别的子程序的影响。当你使用 一种精妙的算法时,“脚手架”是非常有用的。受测试的代码和其它代码嵌套,使执行每个测试 用例往往易使人墨守成规。“脚手架”允许你直接执行代码。你花在创建“脚手架”的几分钟时 间可节省数小时的调试时间。 你可在一个文件中写入不少子程序,其中含一个 main()“脚手架”的子程序。main()程序 从命令行接受变量输入,并且将传递给正在受测试的子程序,以便于将其和其它子程序集成之 前能运行你自己的子程序。在你集成代码时,可先保留子程序和脚手架代码,然后使用预处理 命令或注释以使脚手架代码失效。由于通过预处理使其失效,脚手架代码并不影响可执行代码, 并且其保留在文件底部,它并不是可见的。留下它并无妨碍。你也可再次使用它,将其移去和 存档是不需花费多少时间的。 结果比较 如果你有自动测试工具检查实际输出和预期输出的不同,回归测试和重复测试就将容易得 多。检查输出的一个简单易行的方法是将实际输出送入一文件中,然后用文件比较工具将实际 输出和已预先存入一文件中的期望数据相比较。如果输出结果不同,你可能发现了一个错误。 测试数据生成程序 你也可编写代码,有选择地运行程序的某一部分。几年以前,作者发明了一个加密算法, 并编写了使用此算法的程序。程序的目的是对文件加密以使只有用正确的口令才能将其解密。 这种算法并不是简单地改变文件的内容,而是将其彻底改变。将一个程序正确解密是重要的, 否则你可能会破坏整个程序。 作者为此设计了一数据生成程序以便能充分地检查程序中的加密和解密部分。它产生一个 随机字符的长度从 0K 到 500K 不等的随机文件。也产生长度从 1 到 255 不等的随机字符串,以将其作为口令。对每一随机用例,数据生成程序产生两个相同随机文件;将其中一个加密。然 后重新初始化自身,再解密加密文件。然后将解密文件和未加密的文件作比较。如果发现有不 同之处,数据生成程序将其打印出来。 作者将测试用例加权以便使文件平均长度为 30K,这比最大长度 500K 要小得多。否则, 文件长度为 0K 到 500K 不等,平均测试文件长度为 250K。较短的平均长度意味着可以测试更 多的文件、口令、文件结束条件和其它案件。所得结果是令人满意的。在运行了 100 个测试用 例后。作者发现了 2 个错误,它们都是由实际中可能不会出现的特殊用例所引起。但是它们终 究是错误,发现它们也是令人兴奋的。然后,作者试运行程序数周,对超过 100,000 个文件进 行了测试而没有发现一个错误。经过对文件内容、长度和口令的测试,作者确信程序是正确的。 以下是作者从中得出的教训: · 设计良好的随机数据生成程序可产生你没有想到的异常数据。 · 随机数据生成程序要比人工更能深入地检查你的程序。 · 随着时间的流逝,你就能精细随机生成测试用例,以便能侧重于实际范围的数据输入。 这意味着着重测试最可能为用户所用的领域,而使这些领域的可靠性最高。 · 模块化设计是有利于测试的。作者能将加密和解密代码抽取出来,并将其各自用于用 户界面代码中,这样,编写测试驱动程序的工作是相当容易的。 · 如果所测试的代码有所变更,你可重新利用测试驱动程序。一旦在作者改正了两个早 期错误后,马上就开始了重新测试的工作。 覆盖监控 Robert Grady 曾报道过没有检查代码覆盖的测试通常只运行了 55%的代码。覆盖监控是一 种跟踪已运行和未运行代码的工具。覆盖监控对系统测试非常有用,因为它可告诉你测试用例 是否运行了所有代码。如果你已运行了所有测试用例而覆盖监控指示还有一些代码未执行, 这时你便可知道你还需增加测试用例。 符号调试程序 符号调试程序是对代码普查和检查的技术补充。调试程序可一行一行调试代码,对变量值 进行追踪,同计算机一样解释代码。在调试程序中对代码单步调试,并观察其工作情况是非常 有用的。对你的代码用调试程序进行普查和让别的程序员对你的代码遂行评审,在许多方面是 相似的。你的人工检查和调试程序有着不同的盲点。你可向前和向后看一看你的高级语言代码 以及汇编代码,以了解高级语言代码是如何翻译成汇编代码的。你也可以查看寄存器和堆栈以 了解变量是如何传递的。你也可查看被你的编译程序所优化的代码以了解各种优化的性能。以 上各种优点和调试的使用目的并无太大的联系,是确诊已发现的错误,但是对调试的创造性使 用会产生许多和调试初始特性大不相同的好处。 系统的测试 另外一些测试支持工具是用来测试系统的。许多人都听到过一个程序的 99%能正常工作但最少 1%老是错误的故事。问题一般在于未初始化某一个变量,而且使用它是困难的,因为 99%的 未初始化变量其值为 0。 这类测试工具应有如下能力: · 存储器填充。你应确保不存在任何未初始化变量。有些测试工具在你运行程序之前 将特定存储单元设置为随意的某个值,以使未初始化变量不致被设置 [1] [2] 下一页
|