第七章 实现


实现包括:编码和测试

编码:把软件设计结果翻译成程序。
测试:检测程序并改正错误的过程。


白盒测试和黑盒测试的定义

白盒测试(也称结构测试)

如果知道软件内部工作过程,可以通过测试来检验软件内部动作是否按照规格说明书的规定正常进行,这种测试称为白盒测试。

黑盒测试(也称功能测试)

如果已经知道软件应该具有的功能,可以通过测试来检验是否每个功能都能正常使用,这种测试称黑盒测试。也称功能测试。


软件测试的步骤

1. 模块测试(测试编码和详细设计的错误)

模块测试又称单元测试,它把每个模块作为单独的实体来测试。

2. 子系统测试(测试模块接口)

子系统测试是把警告单元测试的模块放在一起形成一个子系统来测试。

3. 系统测试

系统测试是把经过测试的子系统装配成一个完整的系统来测试。
子系统测试测试和系统测试,通常称为集成测试。

4. 验收测试

验收测试把软件系统作为单一的实体进行测试(利用用户的实际数据测试)。

5.平行运行

平行运行是同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。


单元测试-计算机测试(驱动程序和存根程序)

单元测试集中检测软件的设计的最小单元—模块。单元测试和编码属于软件工程的同一阶段。一般方法是:

  • 首先通过编译系统检查并改正程序中所有的语法错误;
  • 然后用详细设计模块说明为指南,对重要的控制路径进行测试,以便发现模块内部的错误。
  • 通常,单元测试使用白盒测试技术。

测试重点

  1. 模块接口

应该对穿过模块接口的数据流进行检测,以保证正确的输入和输出。

  1. 局部数据结构

这是错误的主要来源,应该设计相应的测试用例,以便发现数据结构方面的错误。

  1. 重要的执行路径

由于不可能进行穷尽测试,因此选择测试路径是非常关键的。

  1. 出错处理通路和边界条件

代码审查

计算机测试

由于软件模块不是一个独立的系统,不能独立运行,要依靠其他模块调用,或需要调用其他模块。因此,必须要为测试的单元开发驱动程序或存根程序。

1.驱动程序

相当于一个“主程序”,用来把测试数据传送给被测试的模块,并打印有关结果。

  1. 存根程序

用来代替被测试模块所调用的模块,相当于“虚拟子程序”。


集成测试:非渐增测试和渐增式测试

集成测试是组装软件的系统化技术,它将经过单元测试的模块联系在一起进行测试。

由模块组装成程序时有两种方法:

1. 非渐增式测试方法

先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序。

2. 渐增式测试方法

每次增加一个待测试模块,把它同已经测试好的那些模块结合起来进行测试,反复进行直到完成所有模块测试的方法。
使用渐增式测试方法把模块结合到软件系统中去时,有自顶向下和自底向上两种集成方法。


确认测试:Alpha和Beta测试

Alpha测试

用户在开发者的场所进行测试,并且在开发者的指导下进行,测试在受控环境中进行,开发者记录发现的错误和问题;

Beta测试

用户在一个或多个客户场所进行测试,不受开发者控制,测试者记录发现的问题和错误,定期将问题报告发送给开发者。


白盒测试技术

1. 语句覆盖

设计的测试用例能使程序中每条语句至少执行一次。

2. 判定覆盖

判定覆盖是指:选取足够的测试用例,使得程序中每个判断的可能结果都至少执行一次,也就是说使程序的每个判断分支至少通过一次。

3. 条件覆盖

条件覆盖是指:选择足够的测试用例,使得程序中每个判定表达式的每个条件都取到各种可能的结果。

条件覆盖通常比判定覆盖强,但是条件覆盖不一定包含判定覆盖。

4. 判定/条件覆盖

选取足够的测试用例使得同时满足判定覆盖和条件覆盖的要求。

5. 条件组合覆盖

选取足够的测试用例,使得每个判定表达式中条件的各种可能的组合都至少出现一次。

如果从对程序路径的覆盖程度分析,可以提出下面一些逻辑覆盖标准:

6. 点覆盖

选取足够多的测试用例,使得程序执行路径至少经过程序图中每个节点一次。

7. 边覆盖

边覆盖是指:选取足够多的测试用例,使得程序执行路径至少经过程序图中每条边一次。

8. 路径覆盖

路径覆盖是指:选取足够多的测试用例,使得程序的每条可能路径都至少执行一次。


黑盒测试:等价划分、边界值检测和错误推测


调试:蛮干法、回溯法和原因排除法(对分查找、归纳和演绎法)