软件测试(Software testing)
什么是测试?
软件测试是提高软件质量的重要手段,来确认是否达到可用级别(满足用户需求),关注系统的某一侧面的质量特性。测试跟其他活动的目标相反,其目的是:破坏、证错。即使是最好的测试,也无法达到100%的无错误,有错误残留率的概念。
什么是好的测试?
A good test has a high probability of finding an error 能发现错误
A good test is not redundant 不冗余
A good test should be “best of breed” 最佳特性
A good test should be neither too simple nor too complex 别太复杂也别太 简单
静态测试和动态测试
静态测试通常是隐式的,作为校对,以及编程时工具/文本编辑器检查源代码结构或编译器(预编译器) 检查语法和数据流作为静态程序分析。通俗来说就是用眼睛看。
动态测试可能会在程序执行过程中开始,测试代码的特定部分并应用于离散函数或模块。典型的技术是使用存根/驱动程序或执行 从调试器环境。
黑盒测试和白盒测试
白盒测试:对程序内部代码 结构的测试
黑盒测试:对程序外部表现出来的行为的测试
测试优先编程(Test-first Programming)
测试开始的时间应该尽量早,并且要频繁地测试。当你有一大堆未经验证的代码时,不要把测试工作留到最后。把测试工作留到最后只会让调试的时间更久并且调试过程更加痛苦,因为你的代码将会充斥着bug。反之,如果你在编码的过程中就进行测试,情况就会好的多。
在测试优先编程中,测试程序先于代码完成。编写一个函数应该按如下步骤进行:
- 为函数写一个规格说明。
- 为上一步的规格说明写一些测试用例。
- 编写实际代码。一旦你的代码通过了所有你写的测试用例,这个函数就算完成了。
规格说明描述了这个函数的输入输出行为。它确定了函数参数的类型和对它们的所有约束(例如sqrt
函数的参数必须是非负的)。它还定义了函数的返回值类型以及返回值和输入之间的关系。你已经在这门课中对许多问题都查看并使用过规格说明。在代码中,规格说明包括了函数签名和一些描述函数功能的注释。我们将会在接下来的几节课里讨论更多关于规格说明的问题。
先完成测试用例的编写能够让你更好地理解规格说明。规格说明也可能存在问题——不正确、不完整、模棱两可、缺失边界情况。先尝试编写测试用例,可以在你浪费时间实现一个有问题的规格说明之前发现这些问题。