软件构造学习笔记(2)
第二讲 软件测试与测试优先的编程
1.综述
1.1 测试
什么是软件测试:
软件测试是提高软件质量的重要手段(非唯一、决定性手段),是一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程,也是一种实际输出与预期输出之间的审核或者比较过程。软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
软件测试只能提高正确性,最好的测试也无法保证100%的无错误。
注意测试和调试的区别:测试目的是发现是否存在错误;而调试是识别错误根源,消除错误。
大体分类:
单元/集成/系统测试;静态/动态测试;黑盒/白盒测试;回归测试。
1.2 测试用例
测试用例 = 输入 + 执行条件 + 期望输出
好的测试用例的特点:
1、尽可能发现错误;
2、不重复;
3、不冗余;
4、最有效;
5、既不简单也不复杂。
1.3 软件测试的困难
无法暴力枚举出所有情况,靠偶然测试没意义,基于样本的统计数据对软件测试意义不大(软件与物理产品的巨大差异),因此软件测试在本质上是十分困难的。
2.测试的分类
2.1 按范围分
单元测试:对单个类、或单个类中的方法进行测试。(课程中教授了Junit在单元测试中的应用)
集成测试:对多个类或、多个包或多个个组件等一起执行。
系统测试:不同的系统上测试。
回归测试:一旦程序被修改,重新执行之前的所有测试。
2.2 按静态/动态分
静态测试:在程序不运行时进行测试。
动态测试:在程序运行时跑测试用例。
2.3 按结构分
黑盒测试:用于检查代码的功能,不关心内部实现细节。
白盒测试:要考虑内部实现细节,一般较早执行。
3.测试用例的设计
3.1 测试优先
先设计spec,再设计符合spec的测试用例,然后设计代码、执行测试、有问题再改、再执行测试用例,直到通过它。写测试用例,就是理解、修正、完善spec设计的过程.先设计测试能够节省大量的调试时间。
3.2 黑盒测试
黑盒测试关键在于检查程序是否符合规约,完全从函数规约导出测试用例,它不考虑函数内部实现。目的是用尽可能少的测试用例,尽快运行,并尽可能大的发现程序的错误。
3.2.1 等价类划分
将被测函数的输入域划分为等价类,从等价类中导出测试用例。
每个等价类代表着对输入约束加以满足/违反的有效/无效数据的集合。
基于的假设:相似的输入,将会展示相似的行为。故可从每个等价类中选一个代表作为测试用例即可,从而可以降低测试用例数量。

3.2.2 边界值分析
大量的错误发生在输入域的“边界”而非中央,因此需要对边界着重设计测试用例。
边界值分析方法是对等价类划分方法的补充。
3.3 白盒测试
与黑盒测试完全从函数spec导出测试用例、不考虑函数内部实现不同,白盒测试要考虑内部实现细节,根据程序执行路径设计测试用例。白盒测试一般较早执行。
独立/基本路径测试:对程序所有执行路径进行等价类划分,找出有代表性的最简单的路径(例如循环只需执行1次),设计测试用例使每一条基本路径被至少覆盖1次。
3.4 覆盖度测试
3.4.1 代码覆盖度
已有的测试用例有多大程度覆盖了被测程序,通常用百分比衡量。
代码覆盖度越低,测试越不充分;但要做到很高的代码覆盖度,需要更多的测试用例,测试代价高。
3.4.2 常见覆盖类型
语句覆盖:每⼀条语句至少执行一次
分支覆盖:判定中每个条件的所有可能结果至少出现一次,并且每个判定本身的所有可能结果也至少出现一次
路径覆盖:每条可能执行到的路径至少执行一次
3.4.3 测试效果和难度
测试效果:路径覆盖 > 分支覆盖 > 语句覆盖
测试难度:路径覆盖 > 分支覆盖 > 语句覆盖
浙公网安备 33010602011771号