什么是测试
软件测试是提高软件质量的重要手段。
它是执行程序或应用程序的过程,目的是查找bug(error或其他缺陷),并验证软件产品适合使用,确认是否达到可用级别(用户需求)。
它关注系统的某一侧面的质量特性。
即使是最好的测试,也无法达到100%的无错误
residual defect rates 残留缺陷率(每1000行代码):
- 1-10:典型的工业软件。
- 0.1-1:高质量的验证。Java库可能达到这种正确性。
- 0.01-0.1:最好的,安全至上的验证。美国国家航空航天局和像Praxis这样的公司可以达到这个水平。
测试的特征
测试跟其他活动的目标相反:破坏、证错、“负能量”。
再好的测试也无法证明系统里不存在错误。
一个好的测试应该:
能发现错误
不冗余
最佳特性,多种测试方案中最好的
别太复杂也别太简单
测试等级
单元测试:验证一个特定的代码段的功能,通常在函数水平
集成测试:由多个程序员或编程团队创建的两个或两个以上的类,包,组件,系统的联合执行。
系统测试:测试一个完全集成的系统,验证系统满足其要求,在最终的配置上执行软件。
静态与动态测试(Static vs. Dynamic testing)
静态测试:用眼睛看,评审、走查、检查等
动态测试:使用测试用例集进行测试
测试与调试(Testing vs. Debugging)
测试:发现是否存在错误
调试:识别错误根源,消除错误
黑盒测试vs白盒测试
白盒测试可测试内部结构或通过查看源代码。
黑匣子测试将软件视为“黑匣子”,功能,而无需任何内部实现知识,看不到源代码。
为什么软件测试很难
穷举测试是不可行的:可能的测试用例的空间通常太大,无法面面俱到。
随意测试(“尝试一下,看看它是否有效”):不太可能发现bug,偶然测试没有意义。
随机或统计测试对软件不起作用。基于样本的统计数据对软件测试意义不大—软件与产品的巨大差异。
软件行为在离散输入空间中差异巨大:大多数正确,少数点出错;bug出现往往不符合特定概率分布。
测试无统计分布规律可循 。
测试用例
测试用例是什么? 测试用例:输入+执行条件+期望结果
好的测试用例:最可能发现错误,不重复不冗余,最有效,既不简单也不复杂。
测试优先的编程(Test-First Programming):
先写spec,再写符合spec的测试用例,最后写代码、执行测试、有问题再改、再执行测试用例,直到通过它。
不要把测试留到最后!
先写测试会节省大量的调试时间。
越早发现越容易纠正
更深入和更早的理解需求和设计
更早地暴露需求和设计的问题
可确保程序的可测试性
确保每个程序特征的测试都撰写完成
单元测试(Unit Testing)
针对软件的最小单元模型开展测试,隔离各个模块,容易定位错误和调试,隔离测试使模块调试更加容易,当一个模块的单元测试失败时,可以很容易发现该模块中的错误,而不需要在程序中的任何地方找。