回归测试:一旦程序被修改,重 新执行之前的所有测试
目录
Checked异常的处理机制: – 声明、抛出、捕获、处理、清理 现场、释放资源等
健壮性和正确性
健壮性:系统在不 正常输入或不正常外部环境下仍能够表现正常的程度
正确性:程序按照spec加以执行的能力,是最重要 的质量指标!
正确性倾向于直接报错(error),健壮性则倾向于容错(fault-tolerance)
对外的接口,倾向于健壮;对内的实现,倾向于正确
MTBF 平均故障间隔 时间(平均无故障运行时间),是指相邻两次故障之间的平均工作时间
MTBF用于描述可修复系统的平均无故障运行时间 ,MTTF(故障前平均时间)描述不可修复系统的故障前平均时间
残余缺陷率 每千行代码中遗留的bug的数量
Throwable

Error/Runtime异常、其他异常
Checked异常的处理机制: – 声明、抛出、捕获、处理、清理 现场、释放资源等
Sorts of errors
User input errors 用户输入错误
Device errors 设备错误
Physical limitations 物理限制

运行时异常,是程序 源代码中引入的故障所造成的
非运行时异常,是程序员无法完全控制的外在问题所导致的
Checked异常、Unchecked异常
Errors and Runtime Exceptions are not checked by compiler


– 如果客户端可以通过其他的方法恢复异常,那么采用checked exception; – 如果客户端对出现的这种异常无能为力,那么采用unchecked exception;

程序员必 须在方法的spec中明确写清本方法会抛出的所有checked exception, 以便于调用该方法的client加以处理

自定义异常类

断言的作用、应用场合
断言:在开发阶段的代码中嵌入,检验某些“假设”是否 成立。若成立,表明程序运行正常,否则表明存在错误。
出现AssertionError,意味着内部某些假设被违反了
增 强程序员对代码质量的信心:对代码所做的假设都保持正确


实际运行阶段, 不再使用断言避免降低性能
使用断言的主要目的是 为了在开发阶段调试程序、尽快避免错误
防御式编程的基本思路
最好的防御就是不要引入bug
检查前置条件是防御式编程的一种典型形式
对来自外部的数 据源要仔细检查,例如:文件、网络数据、用户输入等
对每个函数的输入 参数合法性要做仔细检查,并决定如何处理非法输入
类的public方法 接收到的外部数据都应被认为是dirty的,需要处理干净再传递到 private方法——隔离舱
黑盒测试用例的设计 – 等价类划分、边界值分析
等价类划分
基于等价类划分的测试:将被测函数的输入域划分为等价类, 从等价类中导出测试用例。
针对每个输 入数据需要满足的约束条件,划分等价类(如果一组对象间存 在对称、传递和自反的关系,则认为是等价类。)
边界值分析
大量的错误发生在输入域的“边 界”而非中央
笛卡尔积:全覆盖
覆盖每个取值:最少1次即可
以注释的形式撰写测试策略
测试策略(根据什么来选择测试用例)非常重要,需要在程 序中显式记录下来

JUnit测试用例写法
测试覆盖度
代码覆盖度:已有的测试用例有多大程度覆盖了被测程序

测试效果:路径覆盖>分支覆盖>语句覆盖
测试难度:路径覆盖>分支覆 盖>语句覆盖
白盒测试
独立/基本路径测试:对程序所有执行路径进行等价类划 分,找出有代表性的最简单的路径(例如循环只需执行1次),设计测试 用例使每一条基本路径被至少覆盖1次。