第二章
认可“测试”的价值,搞清楚“测试优先”的哲理;学会用等价划分和边界值分析方法为模块设计测试用例;可用工具度量一组测试用例对代码的“覆盖度”;各种各样的测试,都有些初步了解
大纲:
测试用例;测试优先的编程/测试驱动开发;单元测试;使用JUnit进行自动化单元测试;* 白盒测试;覆盖度;* 集成测试;* 回归测试;在程序中文档化测试策略
黑盒测试 :等价类划分 ,边界值分析。
确保程序正确性/健壮性的最普遍的手段:测试
方法:1 设计测试用例;2 用JUnit写测试程序;3 自动化测试过程。
1软件测试
即使是最好的测试,也无法达到100%的无错误
测试跟其他活动的目标相反:破坏、证错、“负能量”
再好的测试也无法证明系统里不存在错误
好的测试的标准:能发现错误;不冗余;最佳特性;别太复杂也别太简单。
测试等级:(等级反向代表回归测试)
单元测试:指验证特定代码段功能的测试,通常在功能级别。
集成测试:由多个程序员或编程团队创建的两个或多个类、包、组件、子系统的组合执行。
系统测试:测试一个完全集成的系统以验证系统是否满足其要求,从而在最终配置中执行软件。
针对外部质量因素的诸多测试:安装测试;兼容性测试;健全性测试;回归测试;验收测试;Alpha 测试/Beta 测试;性能/负载/可扩展性测试;可用性测试;可访问性测试;安全测试等等
静态测试是在没有实际执行程序的情况下进行的。隐式。编译器(预编译器)检查语法和数据流、编程工具检查源代码结构
动态测试描述了对代码动态行为的测试,它实际上是用一组给定的测试用例执行编程的代码。典型:使用调试环境执行。
测试:发现是否存在错误,这是本章内容
调试:识别错误根源,消除错误
白盒测试:对程序内部代码结构的测试
黑盒测试:对程序外部表现出来的行为的测试
测试困难的原因:穷举+暴力=不可能;靠偶然测试没意义;基于样本的统计数据对软件测试意义不大—软件与产品的巨大差异;软件行为在离散输入空间中差异巨大;大多数正确,少数点出错;bug出现往往不符合特定概率分布;无统计分布规律可循
2测试用例
测试用例:输入+执行条件+期望结果
好的测试用例的标准:最可能发现错误;不重复、不冗余;最有效;既不简单也不复杂
3测试优先编程
4单元测试
针对软件的 最小单元模型开展测试,隔离各个模块,容易定位错误和调试
由于组件不是独立程序,因此通常必须为每个单元测试开发驱动程序和/或存根软件。
驱动程序:一个“主程序”,它接受测试用例数据,将这些数据传递给(被测试的)组件,并打印相关结果。
存根:用于替换从属(由被测试组件调用)的模块。
– 存根使用从属模块的接口,可以进行最少的数据操作,打印输入验证,并将控制权返回给正在测试的模块
5使用 JUnit 进行自动化单元测试
JUnit 单元测试被编写为@Test注释前面的方法;
setUp() 或@Before: 准备测试,完成初始化;
tearDown() 或@After: 清理测试环境
6黑盒测试
黑盒测试:用于检查代码的功能,不关心内部实现细节
检查程序是否符合规约
用尽可能少的测试用例,尽快运行,并尽可能大的发现程序的错误
6.1分区方法选择测试用例
基于等价类划分的测试:将被测函数的输入域划分为等价类, 从等价类中导出测试用例。
针对每个输入数据需要满足的约束条件,划分等价类。
每个等价类代表着对输入约束加以满足/违反的有/无效数据的集合
基于的假设:相似的输入,将会展示相似的行为。故可从每个等价类中选一个代表作为测试用例即可,从而可以降低测试用例数量
根据指南定义等价类:
– 如果输入条件指定了范围,则定义一个有效等价类和两个无效等价类。
– 如果输入条件需要特定值,则定义一个有效和一个无效等价类。
– 如果输入条件指定集合的成员,则定义一个有效和一个无效等价类。
– 如果输入条件是布尔值,则定义一个有效类和一个无效类。
需要考虑输入数据的特殊情况;考虑输入的上限;
6.2边界
大量的错误发生在输入域的“边界”而非中央
边界值分析方法是对等价类划分方法的补充
某些边界值是“特殊情况”,需要特殊处理;程序的行为在边界的地方可能发生“突变”
在等价类划分时,将边界作为等价类之一加入考虑
笛卡尔积:全覆盖:多个划分维度上的多个取值,要组合起来,每个组合都要有一个用例;测试完备,但用例数量多,测试代价高
覆盖每个取值:最少1次即可:每个维度的每个取值至少被1个测试用例覆盖一次即可;测试用例少,代价低,但测试覆盖度未必高。
7*白盒测试
黑盒测试完全从函数spec(规范)导出测试用例,不考虑函数内部实现
白盒测试要考虑内部实现细节:根据程序执行路径设计测试用例,白盒测试一般较早执行
使用白盒测试方法,您可以导出测试用例
– 保证模块内的所有独立路径都已至少锻炼一次
– 对真假两面进行所有合乎逻辑的决定,
– 在其边界和操作范围内执行所有循环,
– 练习内部数据结构以确保其有效性。
一种典型的白盒测试方法称为独立/基本路径测试:独立/基本路径测试:对程序所有执行路径进行等价类划分,找出有代表性的最简单的路径(例如循环只需执行1次),设计测试用例使每一条基本路径被至少覆盖1次。
8测试覆盖度
代码覆盖度:已有的测试用例有多大程度覆盖了被测程序
测试效果:路径覆盖>分支覆盖>语句覆盖
测试难度:路径覆盖>分支覆盖>语句覆盖
实际当中,根据预先设定的覆盖度标准,逐步增加测试用例的数量,直到覆盖度达到标准(例如语句覆盖100%、路径覆盖90%)。
9自动化测试和回归测试
只是“测试用例的自动执行”,并非“自动生成测试用例”
回归测试:一旦程序被修改,重 新执行之前的所有测试
一旦发现bug,要马上写一个可重现该bug的测试用例,并将其加入测试库
10记录测试策略
测试策略(根据什么来选择测试用例)非常重要,需要在程序中显式记录下来
目的:在代码评审过程中,其他人可以理解你的测试,并评判你的测试是否足够充分
总结
测试优先编程。在编写代码之前先编写测试。
系统地选择测试用例的划分和边界。
用于填写测试套件的白盒测试和语句覆盖。
尽可能隔离地对每个模块进行单元测试。
自动回归测试以防止错误再次出现。
安全无bug。测试是在你的代码中发现错误,而测试优先编程是在你引入它们之后尽快找到它们。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!