软件构造学习笔记(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 测试效果和难度
测试效果:路径覆盖 > 分支覆盖 > 语句覆盖
测试难度:路径覆盖 > 分支覆盖 > 语句覆盖

posted @ 2022-06-12 23:35  TongL_Roy  阅读(39)  评论(0)    收藏  举报