第七章:软件构造的健壮性
第五节:测试和测试优先编程
问题一:测试的概述
测试:
1.是确保程序正确性/健壮性最普遍的手段
2.发现程序中的错误,提高程序正确性的信心
3.提高软件质量的重要手段
4.确认是否达到可用级别(用户需求)(spec)
5.关注系统的某一侧面的质量特性
步骤:
1.设计测试用例
2.用JUnit写测试程序
3.自动化测试过程
问题二:测试的按等级的划分
- 单元测试(Unit testing)
- 集成测试(Integration testing)
- 系统测试(System testing)
- 验收测试(Acceptance Testing)
- 回归测试(Regression testing):一旦程序被修改,重新执行之前的所有测试。
问题三:测试优先编程(TDD)
TDD的过程:1.先写spec
2.再写符合spec的测试用例(写测试用例就是理解、修正、完善你的spec设计过程)
3.写代码、执行测试、有问题再改、在执行测试用例、直到通过它
问题四:单元测试(Unit Testing)
含义:针对软件的最小单元模型开展测试,隔离各个模块,容易定位错误和调试
问题五:用JUnit进行自动测试
问题六:黑盒测试与白盒测试
1.black-box testing(黑盒测试)
- 含义:对程序外部表现出来的行为的测试(用于检查代码的功能,不关心内部实现细节)
- 示意图:
2.White-box testing(白盒测试)
- 含义:对程序内部代码结构的测试(根据程序执行路径设计测试用例)
- 示意图:
问题七:黑盒测试中选择测试用例
1.基于等价类划分选择测试用例
定义:将被测函数的输入域划分为等价类,从等价类中导出测试用例。
- 针对每个输入数据需要满足的约束条件,划分等价类
- 每个等价类代表着对输入约束加以满足/违反的有效/无效数据的集合
- 基于的假设:相似的输入,将会展示相似的行为。故可从每个等价类中选一个代表作为测试用例即可,从而可以降低测试用例数量
2.边界值分析
- 边界值分析方法是对等价类划分方法的补充
- 在等价类划分时,将边界作为等价类之一加入考虑
- 不仅要考虑边界,还要考虑边界的两侧
选用边界值分析的原因:
- 大量的错误发生在输入域的“边界”而非中央
- 程序员经常犯一些大小差1的错误
- 某些边界值是“特殊情况”,需要特殊处理
- 程序的行为在边界的地方可能发生“突变”
3.选取测试用例的两种方式
1.笛卡尔积:全覆盖(Full Cartesian product)
定义:多个划分维度上的多个取值,要组合起来,每个组合都要有一个用例
特点:测试完备,但用例数量多,测试代价高
2.覆盖每个取值:最少1次即可(Cover each part)
定义:每个维度的每个取值至少被1个测试用例覆盖一次即可
特点:测试用例少,代价低,但测试覆盖度未必高。
问题八:代码覆盖度的概述
含义:代码覆盖度:已有的测试用例有多大程度覆盖了被测程序
代码覆盖度的方式:
- 函数覆盖
- 语句覆盖
- 分支覆盖
- 条件覆盖
- 路径覆盖
(测试效果:路径覆盖>分支覆盖>语句覆盖)
(测试难度:路径覆盖>分支覆盖>语句覆盖)
问题九:记录测试策略(Documenting Testing Strategy)
含义:测试策略(根据什么来选择测试用例)非常重要,需要在程序中显式记录下来
目的:在代码评审过程中,其他人可以理解你的测试,并评判你的测试是否足够充分