测试的目的是显示一个程序做了希望做的事情以及在程序投入使用之前发现其中的缺陷。当测试软件时,会使用人造的数据执行程序。要对测试运行的结果进行检查以发现错误、异常现象,或者关于程序的非功能性属性信息。
测试软件时,你在试图做以下两件事情:
1.向开发人员和客户展示软件满足其需求。对于定制化软件,这意味着针对需求文档中的每一个需求都应该至少有一个测试。对于通用的软件产品,这意味着所有将被包含在产品发布中的系统特征都要有测试。你还可以测试特征的组合以检查是否存在不希望出现的特征交互。
2.找出可能导致软件行为不正确、出现不希望的行为,或行为不符合规格说明的输入或输入序列。这些事由于软件中的缺陷(bug)导致的。当你测试软件以发现缺陷时,你将试图根除不希望看到的系统行为,例如系统崩溃、不希望看到的与其他系统的交互、不正确的计算,以及数据损坏等。
上面的第一点是确认测试,你会使用一组反映系统的期望使用方式的测试用例来测试系统是否正确运行。第二点是缺陷测试,设计测试用例来暴露缺陷。缺陷测试中的测试用例可以故意有一些不清楚的地方,并且不需要反映软件在正常情况下是如何使用的。当然,两种方法并没有明确的边界。在确认测试过程中,会发现系统中的缺陷;在缺陷测试过程中,一些测试会显示程序满足其需求。
下图显示了确认测试和缺陷测试之间的区别。将被测试的系统想象成一个黑盒。系统从输入集合I那里接收输入,生成一个输出集合O中的输出。输出中有一些会是错误的。这些错误的输出集合Oe是系统对输入集合Ie中的输入的响应而生成的。缺陷测试中优先考虑的是找到Ie中的输入,因为这些输入揭示了系统中的问题。确认测试包含使用Ie之外的正确输入的测试。这些输入激励系统生成所期望的正确输出。
测试无法显示软件没有缺陷或者软件在每种情形下的行为都与规格说明一致。你所忽视的某一个测试总是有可能进一步发现系统中新的问题。测试是更广阔的软件验证和确认(Verification and Validation,V&V)过程的一部分。验证和确认并不相同,虽然它们经常被混淆。