首要记住的是,软件错误不同于硬件的错误。桥梁、建筑物和其他工程建筑可能由于劣质的材料、差强的设计、构件的老化而失败。但是循环在上百次的迭代后不会老化,参数不会从一个构件到另一个构件传递中丢失。如果一段特殊的代码没有恰当的工作,如果一个劣质的硬件不是错误的根源,我们可以确信代码中存在错误。由此,许多软件工程师拒绝用 bug 这个词来描述软件错误。把错误叫做 bug 意味着在代码与代码之间已经使开发者无法控制此错误。在搭建软件中,我们运用软件工程经验来控制代码的质量。
在开发一个大的系统时,测试通常涉及许多步骤。首先,每个程序组件要孤立与系统其他组件进行自我测试。已知的这样的测试有模块测试,组件测试或单元测试,这种测试校验组件在设计中期望的输入条件下功能正常。单元测试尽可能在一个受控的环境下进行。因此测试小组输入一些预定的数据给组件测试,观察输出情况和产生的数据。另外,测试小组要检查内部数据结构,输入和输出数据的逻辑和边缘条件。当组件的集合进行了单元测试时,下一步是确保组件间的接口正确定义和处理。集成测试是一个确保系统各组件按照系统描述和设计需求统一工作的过程。一旦我们确信组件按照设计的要求工作,我们测试系统保证它实现预期的功能。功能测试评估一个系统是否能够作为一个完整的系统实现需求分析中描述的功能。结果是一个功能系统。
你可能仅考虑了你的程序是解决问题的一种方法;你并没有考虑问题的本身。如果这样,你的测试数据仅选择了某些用例中正确的结果,忽略了错误的存在。在这种方式下写出和演示的程序仅代表你的编程技巧。因此,心理上你可能认为对于你程序的批评是对你的能力的批评。测试你的程序正确工作是你对老师展示能力的一种方法。然而,当你为客户开发一个系统时,他们不关心系统在特定条件下的正确工作。相反,他们关心的是系统能够在任何条件下工作。所以作为一个开发者你的目标是尽可能的消除过多的错误,不管错误在那里发生,由谁产生。惨痛的教训不允许在开发过程中发现错误。因此,许多软件工程师采纳了一种叫做忘我编程的态度,这种态度要求程序被看作大系统的组件,是谁编写的并不重要。当错误发现或失败产生,忘我的开发小组关心的是纠正错误,不是给那一位开发者带来耻辱。