软件构造学习笔记——面向健壮性与正确性的软件构造 第2、12讲

回归测试:一旦程序被修改,重 新执行之前的所有测试

目录

 健壮性和正确性

 Throwable

 Error/Runtime异常、其他异常

    Checked异常的处理机制: – 声明、抛出、捕获、处理、清理 现场、释放资源等

 Checked异常、Unchecked异常

 自定义异常类

 断言的作用、应用场合

 防御式编程的基本思路

 黑盒测试用例的设计 – 等价类划分、边界值分析

 以注释的形式撰写测试策略

 测试覆盖度

 白盒测试


 健壮性和正确性

健壮性:系统在不 正常输入或不正常外部环境下仍能够表现正常的程度

正确性:程序按照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次。


版权声明:本文为m0_51668516原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。