第二讲: 软件测试与测试优先的编程
·黑盒测试:对程序外部表现出来的行为进行测试;用于检查代码的功能,不关注内部的实现细节——检查是否符合规约 等价类划分:针对每个输入数据需要满足的约束条件,划分等价类;从等价类中导出测试用例 边界值分析:对等价类划分的一个补充(在等价类划分时将边界值作为等价类之一加入考虑) 测试用例:输入+执行条件+期望结果
·测试覆盖度: (1)笛卡尔积:全覆盖 (2)每个维度的每个取值至少被一个测试用例覆盖一次即可 代码覆盖度: 函数覆盖、语句覆盖、分支覆盖、条件覆盖、路径覆盖 覆盖度标准(100%语句覆盖,90%路径覆盖)
·以注释的形式撰写测试策略: 
·TDD: (1)先写spec (2)再写符合spec的测试用例 (3)写代码、执行测试、有问题再改、再执行测试用例,直到通过它 ·Junit assert xxx: 
第十二讲: 面向正确性与健壮性的软件构造
·健壮性:系统在不正常输入或不正常外部环境下仍能够表现正常的程度——倾向于容错 ·正确性:程序按照spec加以执行的能力(最重要的质量指标)——倾向于直接报错 可靠性 = 健壮性 + 正确性
·Error/Runtime异常 
Error:内部错误,一旦发生,想办法让程序优雅的结束 Exception:异常:自己程序导致的问题,可以捕获,可以处理 (1)将错误信息传递给上层调用者,并报告“案发现场”的信息 (2)Return外的第二种退出途径 (3)若找不到异常处理程序,整个系统完全退出 (4)分为运行时异常和其他异常 运行时异常:程序员在代码中处理不当造成,可避免 其他异常:由外部原因造成,无法完全避免
·Checked异常,Unchecked异常 
Checked异常:必须捕获并指定错误处理器handle,否则编译无法通过  
·Checked异常处理机制 (1)使用throws声明异常 
方法应throws的异常: 该方法调用的其他函数抛出的checked exception 当前方法检测并使用throws抛出的checked exception 若无handler来处理抛出的checked exception,程序就终止执行 
(2)使用throw抛出异常: 1.找到一个能表达错误的Exception类/或者构造出一个新的Exception类 2.构造Exception类的一个实例,将错误信息写入 3.抛出错误(throw) 
4.一旦抛出异常,方法不会再将控制权返回给调用它的client,因此也无需考虑返回错误代码
·自定义异常类  

Finally关键字:无论程序是否碰到异常,finally关键字都将被执行 
·断言 在开发阶段的代码中嵌入,检验某些假设是否成立。若成立则表明程序运行正常,否则表明存在错误 断言即是对代码中程序员所做的假设的文档化,不会影响程序的性能 形式: 
所构造的message将在发生错误时显示给用户,便于快速发现错误所在;实际运行阶段,不再使用断言! 出现AssertionError即表示内部某些假设被违反了 
可使用assert的情况: 内部不变量、表示不变量、控制流不变量(switch-case)、方法的前置、后置条件 断言只检查程序内部的状态是否符合规约,断言一旦false,程序就停止执行,外部错误(不受自己控制)要使用Exception机制去处理
·防御式编程的基本思路: (1)最好的防御就是不要引入bug (2)若无法避免,则将bug限制在最小范围内;限定在一个方法内部,不扩散 (3)Fail fast
|