关于软件构造最后一部份(PPT2、12)的复习

发布时间 2023-05-26 02:13:16作者: (^O^)在?

零、第二章一些言论

测试跟其他活动的目标相反:破坏、证错、“负能量”,再好的测试也无法证明系统里不存在错误

静态测试vs 动态测试:靠眼睛看vs 撸起袖子使劲干

测试优先的编程,先写测试会节省大量的调试时间

一、健壮性和正确性

健壮性:系统在不正常输入或不正常外部环境下仍能够表现正常的程度——对自己的代码要保守,对用户的行为要开放

正确性:程序按照spec加以执行的能力,是最重要的质量指标!

正确性倾向于直接报错(error),健壮性则倾向于容错(fault-tolerance)

二、Throwable、Error

包含异常和错误,错误:程序员通常无能为力,一旦发生,想办法让程序优雅的结束;异常:你自己程序导致的问题,可以捕获、可以处理

既然Error我们无能为力,那就转向关注我们能处理的Exception

P.S:一些错误类型:输入错误、设备错误、物理限制……

三、各种异常区分

1、运行时异常与其他异常——运行时异常:由程序员在代码里处理不当造成;其他异常:由外部原因造成

2、Checked and unchecked exceptions:编译器可帮助检查你的程序是否已抛出或处理了可能的异常

Unchecked异常也可以使用throws声明或try/catch进行捕获,但大多数时候是不需要的,也不应该这么做

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

异常类型大致如下图:

四、Checked异常的处理机制、自己的异常类

要么捕获(catch);要么抛(throws)

对于try—catch—finally,finally的内容无论如何都会被实现

抛出时要在方法后用throws xxx来声明,应遵守LSP原则且在规约中写明,一旦抛出异常,方法不会再将控制权返回给调用它的client,因此也无需考虑返回错误代码

可以编写自己的异常类,继承excption类

对于异常,尽量在自己这里处理,实在不行就往上传——要承担责任!

catch里面也可以抛出异常——更改exception的类型,更方便client端获取错误信息并处理

五、断言、防御性编程

最好的防御就是不要引入bug

尽量使用不变量、尽量避免表示泄露

断言:在开发阶段的代码中嵌入,检验某些“假设”是否成立。若成立,表明程序运行正常,否则表明存在错误。

——assert 表达式 : 信息;如果不满足条件就发出异常,后面的代码也不会运行(assertionerror)

断言表达式:约定俗成:参数顺序为(期望值,实际处理结果)eg:assertEquals(100,方法结果)

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

等价类划分:等价类满足自反,对称,传递

输入有效/无效等价类,还要测试约束条件,特殊情况

每个等价类里取一个数据出来作为测试用例,划分必须完备且无交集

边界值分析:假设大量错误发生在输入域的边界而非中央,作为等价类划分的一种补充

七、其余的一些点:注释的形式撰写测试策略、JUnit测试用例写法、测试覆盖度