再见了我的温柔,第七章简直长得死了🐎!

软件测试基础

软件测试的目标

软件测试是为了发现程序中的错误而执行软件的过程

软件测试的准则

■所有测试都应该能追溯到用户需求;

■应该远在测试开始之前就制定出测试计划;

■把Pareto原理应用到软件测试中;

■应该从“小规模”测试开始,并逐步进行“大规模”测试;

■穷举测试是不可能的;

■为了达到最佳的测试效果,应该由独立的第三方从事测试工作。

软件测试方法

黑盒测试(功能测试)

不考虑软件内部结构,把软件当成一个黑盒子,进行程序接口的测试

白盒测试(结构测试)

把软件当做一个透明的盒子,测试者完全知道软件的结构和处理算法,按照程序内部的逻辑测试,检测程序中的主要执行通路是否都能按预定要求正确工作。

img

软件测试步骤

1. 模块测试(单元测试)

■保证每个模块作为一个单元能正确运行;

■发现的往往是编码和详细设计的错误。

2. 子系统测试(集成测试)

■把经过单元测试的模块放在一起形成一个子系统来测试;

■着重测试模块的接口。

3. 系统测试

■把经过测试的子系统装配成一个完整的系统来测试;

■发现的往往是软件设计中的错误,也可能发现需求说明中的错误;

■不论是子系统测试还是系统测试,都兼有检测和组装两重含义,通常称为集成测试

4. 验收测试(确认测试)

■把软件系统作为单一的实体进行测试;

■它是在用户积极参与下进行的,而且可能主要使用实际数据(系统将来要处理的信息)进行测试;

■发现的往往是系统需求说明书中的错误。

5. 平行运行

■同时运行新开发出来的系统和将被它取代的旧系统;

■比较新旧两个系统的处理结果;

■可以在准生产环境中运行新系统而又不冒风险;

■用户能有一段熟悉新系统的时间;

■可以验证用户指南和使用手册之类的文档;

■能够以准生产模式对新系统进行全负荷测试,可以用测试结果验证性能指标。

软件测试与开发过程的关系

image-20200809073138656

测试阶段的信息流程

img

单元测试

单元测试的测试重点

  • 模块接口

  • 局部数据结构

  • 重要的执行通路

  • 出错处理通路

  • 边界条件

代码审查

由审查小组正式进行测试称为代码审查;

可查出30%~70%的逻辑设计错误和编码错误;

审查小组组成:

■组长

■程序的设计者

■程序的编写者

■程序的测试者

一次审查会上可以发现许多错误,可以减少系统验证的总工作量。

计算机测试

驱动程序和存根程序

必须为每个单元测试开发驱动程序和(或)存根程序。

驱动程序是一个“主程序”,它接收测试数据,传送给被测试的模块,并且印出有关的结果。

存根程序代替被测试的模块所调用的模块。它使用被它代替的模块的接口,可能做最少量的数据操作,印出对入口的检验或操作结果,并且把控制归还给调用它的模块。

驱动程序和存根程序代表开销,通常并不把它们作为软件产品的一部分交给用户。

集成测试

非渐增式测试和渐增式测试

非渐增式测试,把所有模块单个分别测试后,再组装在一起测试,缺点,出错时,不方便定位错误位置;

渐增式测试,先测试一个模块,再把另一个模块与他合起来组成新的模块测试,这样出错时,方便定位错误位置;

所以普遍采用渐增式测试法

渐增式测试又分为自顶向下的测试法和自底向上的测试法

自顶向下测试法

从主控制模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来。

![0262ZE)6@{(7WC9F`XDEFCQ.png](https://i.loli.net/2020/08/09/s1PvHcU2EF3phgz.png)

在把附属于主控制模块的那些模块组装到程序结构中去时,或者使用深度优先的策略,或者使用宽度优先的策略。

■深度优先:先组装在软件结构的一条主控制通路上的所有模块。

■宽度优先:沿软件结构水平地移动,把处于同一个控制层次上的所有模块组装起来。

把模块结合进软件结构的过程由下述4个步骤完成:

第一步,对主控制模块进行测试,测试时用存根程序代替所有直接附属于主控制模块的模块;

第二步,根据选定的结合策略(深度优先或宽度优先),每次用一个实际模块代换一个存根程序(新结合进来的模块往往又需要新的存根程序);

第三步,在结合进一个模块的同时进行测试;

第四步,为了保证加入模块没有引进新的错误,可能需要进行回归测试(即,全部或部分地重复以前做过的测试)。

从第二步开始不断地重复进行上述过程,直到构造起完整的软件结构为止。

自底向上集成

用下述步骤可以实现自底向上的结合策略:

第一步,把低层模块组合成实现某个特定的软件子功能的族;

第二步,写一个驱动程序(用于测试的控制程序),协调测试数据的输入和输出;

第三步,对由模块组成的子功能族进行测试;

第四步,去掉驱动程序,沿软件结构自下向上移动,把子功能族组合起来形成更大的子功能族。

上述第二步到第四步实质上构成了一个循环。

回归测试:在集成测试的范畴中,回归测试是指重新执行已经做过的测试的某个子集,以保证上述这些变化没有带来预期外的副作用

确认测试

确认测试的概念

确认测试也称为验收测试,它的目标是验证软件的有效性。

确认测试的范围

确认测试必须有用户积极参与,或者以用户为主进行。

使用用户界面输入测试数据并且分析评价测试的输出结果。

通常在验收之前由开发单位对用户进行培训。

验证与确认的概念

验证是指的是保证软件正确地实现了某个特定要求的一系列活动

确认指的为了保证软件确实满足了用户需求而进行的一系列活动

image-20200809085217627

软件配置复查

确认测试的一个重要内容是复查软件配置。

复查的目的是保证软件配置的所有成分都齐全,质量符合要求,文档与程序完全一致,具有完成软件维护所必须的细节,而且已经编好目录。

Alpha 和Beta测试

Alpha测试由用户在开发者的场所进行,并且在开发者对用户的“指导”下进行测试。Alpha测试是在受控的环境中进行的。

Beta测试由软件的最终用户们在一个或多个客户场所进行。开发者通常不在Beta测试的现场,因此,Beta测试是软件在开发者不能控制的环境中的“真实”应用。

白盒测试技术

逻辑覆盖

image-20200809090920574

语句覆盖

含义:选择足够多的测试数据,使被测程序中每个语句至少执行一次。

特点:语句覆盖对程序的逻辑覆盖很少。语句覆盖只关心判定表达式的值,而没有分别测试判定表达式中每个条件取不同值时的情况。语句覆盖是很弱的逻辑覆盖标准。

判定覆盖

含义:不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次。

条件覆盖

含义:不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果。

特点:条件覆盖通常比判定覆盖强,因为它使每个条件都取到了两个不同的结果,判定覆盖却只关心整个判定表达式的值。但也有反例,如第二组测试用例。

判定覆盖不一定包含条件覆盖,条件覆盖也不一定包含判定覆盖。

判定/条件覆盖

含义:使得判定表达式中的每个条件都取到各种可能的值,每个判定表达式也都取到各种可能的结果。

条件组合覆盖

含义:要求选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次。

特点:条件组合覆盖是前述几种覆盖标准中最强的。满足条件组合覆盖标准的测试数据,也一定满足判定覆盖、条件覆盖和判定/条件覆盖标准。

但是,条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到。

从对程序路径的覆盖程度分析的逻辑覆盖标准。

点覆盖

含义:选取足够多的测试数据,使得程序执行路径至少经过流图的每个结点一次。

特点:由于流图的每个结点与一条或多条语句相对应,因此点覆盖标准和语句覆盖标准是相同的。

边覆盖

含义:选取足够多测试数据,使得程序执行路径至少经过流图中每条边一次。

特点:通常边覆盖和判定覆盖是一致的。

路径覆盖

含义:选取足够多测试数据,使程序的每条可能路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次)。

基本路径法

1)计算环形复杂度

2)列出路径覆盖

黑盒测试技术

等价划分法

边界值分析

错误推测

调试

调试的概念

调试是在测试发现错误之后排除错误的过程。

软件错误的外部表现和它的内在原因之间可能并没有明显的联系。

调试就是把症状和原因联系起来的尚未被人深入认识的智力过程。

区分测试与调试

调试是在测试发现错误之后排除错误的过程

调试过程

调试方法

软件可靠性

image-20200809151645084