1.1软件测试基础
测试为软件工程师带来了很有趣的意外。在软件过程的早期,软件工程师试图由抽象概念到具体实现来建立软件,现在来了测试,工程师创建测试用例试图“摧毁”已经建立的软件。事实上,在软件工程过程中,测试可以看成(至少心理上)摧毁性的而不是建设性的。
软件开发者就其本性而言是建设者,测试要求开发者放弃刚开发的软件是正确的观念,并克服发现错误时的心理矛盾。Beizers[BEI90]如下描述了这种情况:
如果我们真正擅长编程,就应当不会有错误,但这只是一个神话。如果我们真的很认真,如果每个人都使用结构化方法,自顶向下设计而且使用决策表,如果程序是用SQUISH写的,如果我们有合适的银弹,就不会有错误了,这样,神话就不存在。因为我们并不擅长所做的事,所以有错误,如果不擅长,就应当感到内疚。因此,测试和测试用例设计是对失误的承认,它注入了一针内疚剂。测试的枯燥是对我们错误的处罚,为什么处罚?为了人?为什么内疚?为了没能达到人类的完美境界?为了没有区别另一个程序员所想的和所说的?为了没有心灵感应?为了没有解决人类四千年来尚未解决的相互通信问题?
测试真的应当注入内疚感?测试真的是摧毁性的?这些问题的回答是“不!”,然而,测试的目标可能和我们所期待的不同。
1.1.1测试目标
Glen Myers[MYE79]在他的软件测试著作中陈述了一系列关于测试目标的规则:
1.测试是一个为了寻找错误而运行程序的过程。
2.一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例。
3.一个成功的测试是指揭示了迄今为止尚未发现的错误的测试。
上述目标蕴含了一个观点上的戏剧性变化,他们转向通常的观点,即一个成功的测试是指没有找到错误的测试。我们的目标是设计这样的测试,它们能够系统地揭示不同类型的错误,并且耗费最少时间与最小工作量。
如果成功构造了测试(根据上述目标),则能够在软件中揭示错误。测试的第二个好处在于它证实了软件依据规约所具有的功能及其性能需求,此外,构造测试时的数据收集提供了软件可*性以及软件整体质量的一些信息。但是,有一件事测试无法完成:
测试无法说明错误不存在,它只能表示软件错误已经出现。
在构造测试时必须牢记这一点。