1.1.1 软件测试工作的定义
软件测试这项工作虽然属于计算机科学领域,但它同时需要考虑一些与经济学和心理学相关的因素。例如,在理想状态下,软件的开发商会希望通过软件测试工作能了解软件的所有情况,并证明它是一个“没有错误”的产品,但这个要求在实际生产环境中是无法满足的。首先,从科学的角度来说,大概率是不存在“没有错误”的软件的。其次,即使真的存在“没有错误”的软件,如果软件的测试人员想要证明“没有错误”,也需要在测试中穷举出该软件可能遇到的所有情况,并证明软件对每一种情况的应对都符合设计人员对它的预期。这从经济学角度来讲显然是不现实的,因为即使是十分简单的程序(如某一排序算法)也可能存在成千上万种的执行路径与输入/输出,恐怕没有哪一个软件的开发商能支持这种规模的软件测试工作。所以,如果读者想要真正地做好软件测试这项工作,首先要定义好工作的内容和要达成的目标,解决其中存在的主观愿望与客观成本之间的冲突问题。
而想要正确地定义软件测试的工作内容,读者首先需要对它有正确的理解。如果测试人员一开始就将这项工作定义为“证明软件的运行符合预期的过程”或者“向客户证明软件可靠的过程”,就会出现不符合科学现实的情况,就像前面说的,最终会走向证明软件“没有错误”的道路,成了不可能完成的任务。造成这种主客观冲突的主要根源在于,我们在心理上更倾向于执行具有建设性的任务,如程序员在开发软件时很自然地希望得到项目经理和客户的认可,所以行为上会下意识地去制造软件可靠且符合预期的表象。但软件测试的真正目标在于发现软件中还没有被发现的错误,或者所有人都没有预期到的情况,以便开发人员能继续提升软件的质量。换言之,软件测试本质上是破坏性任务,测试人员要做的实际上是类似于“鸡蛋里挑骨头”的工作。
想要让人们克服心理障碍,转而干“挑刺”工作,首先需要明确目标。具体来说,测试人员不能认为“没有发现错误”的测试是成功的测试,软件测试工作的目标是尽可能地找到软件中可以重现给其开发人员的错误。这就好像病人到医院看病,如果做了大量检查之后什么问题都没有找到,这显然不是一次成功的检查,毕竟只有找到病因,医生才能对症下药。只有怀揣这样的目标,测试人员才能确保自己不会在无意中做一个“老好人”,而会从一开始就铁了心做一个千方百计“刁难”待测软件的“坏人”。
综上所述,软件测试应该被定义成“为了发现错误而执行程序”的工作。