软件工程测试
1. 软件测试概述
通俗地说,软件测试是为了发现错误而执行程序的过程。
软件测试:根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。
1.1 测试的目的
通俗地说,软件测试是为了发现错误而执行程序的过程。 软件测试的目的绝不是为了证明软件的正确性,而是为了尽可能多地发现软件中的错误、排除错误,从而将一个高质量的软件交付给用户使用。
Grenford J.Myers就软件测试目的提出以下观点:
- 测试是程序的执行过程,目的在于发现错误;
- 一个好的测试用例在于能发现至今未发现的错误;
- 一个成功的测试是发现了至今未发现的错误的测试。
1.2 测试的原则
- 应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。
- 测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成。
- 应由第三方人员从事测试工作。
- 在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。
- 注意测试中的错误群集现象。
- 严格执行测试计划,排除测试的随意性。
- 妥善保存测试计划、测试用例、出错统计和最终分析报告。
1.3 测试的方法
如果已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
如果已知产品的内部工作过程,可以进行测试证明每种内部动作是否按设计规格要求正常进行。
软件测试一般也常用这样的两种方法,前者称为黑盒测试,后者称为白盒测试。
黑盒测试
黑盒测试也称功能测试,是通过测试来检测每个功能是否都能正常使用。
它把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。
白盒测试
白盒测试是对软件的过程性细节做细致的检查,又称为结构测试。
它把测试对象看做一个打开的盒子或透明的盒子,允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。
1.4 测试的步骤
软件测试采用“自底向上”的方法,即从小规模测试开始逐步进行大规模测试。
首先重点测试单个程序模块,然后重点转移到正在集成的模块组,接着对整个系统进行测试,最后由用户进行系统的验收测试。
软件测试一般分为四个阶段:单元测试、 集成测试、系统测试和验收测试。
单元测试
单元测试是指对软件中的最小可测试单元进行检查和验证。此测试步骤容易发现编码和详细设计阶段的错误。
集成测试
集成测试是把软件单元按照软件概要设计规格说明组装子系统或系统,测试子系统或系统的工作是否达到或实现相应技术指标及要求。着重测试模块之间的接口,即模块之间的通信是否正常等等。
系统测试
系统测试是将经过集成测试的软件作为计算机系统的一部分,与系统中其他部分结合起来,在实际运行环境下进行一系列严格有效的测试,以发现软件潜在的问题,保证系统的正常运行。
验收测试
验收测试是针对用户需求、业务流程进行的正式的测试,以确定系统是否满足验收标准,由用户或其他授权机构决定是否接受系统。
1.5 软件测试V模型
软件测试的四个阶段与前期开发的各个阶段的对应关系,即软件测试V模型:
2. 黑盒测试
2.1 黑盒测试概述
黑盒测试着眼于程序外部结构,不考虑内部逻辑结构,主要针对软件界面和软件功能进行测试。
黑盒测试主要是为了发现以下错误:
- 是否有功能错误,是否有功能遗漏。
- 是否能够正确地接收输入数据并产生正确的输出结果。
- 是否有数据结构错误或外部信息访问错误。
- 是否有程序初始化和终止方面的错误。
2.2 等价类划分法
等价类划分法是一种典型的黑盒测试方法,是把程序的输入分为若干类(子集),然后每一类中选取少数代表性数据作为测试用例,每一类的代表性数据在测试中的作用等价于这一类中的其他值。
等价类划分法:解决如何选择适当的子集,使其尽可能多地发现错误。
步骤:划分等价类(列出等价类表)和选取测试用例。
2.3 等价类划分法案例
某一软件的注册用户名规定“必须是未注册过的5到16位英文字母或数字的字符串”,用等价类划分的方法得到上述规格说明的输入有效等价类和无效等价类表。
2.4 边界值划分法
边界值分析法是对等价类划分方法的补充。
测试工作经验:大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。所以针对各种边界情况设计测试用例,可以查出更多的错误。
边界:对于输入等价类和输出等价类而言,稍高于其边界值及稍低于其边界值的一些特定情况,所以边界值分析是通过选择等价类边界的测试用例进行测试的。
设计测试用例应当选取正好等于、刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据。
2.5 边界值划分法案例
某一软件的注册用户名规定“必须是未注册过的5到16位英文字母或数字的字符串”,采用等价类划分与边界值分析法相结合完成测试用例。
2.6 黑盒测试案例
采用等价类划分与边界值分析法相结合完成读者密码的测试用例设计。
读者密码规定“必须是6到12位英文字母、数字和特殊符号(空格除外)的组合,至少包含两种”。
建立输入数据的有效等价类表
建立输入数据的无效等价类表
基于边界值分析法设计测试用例
3. 白盒测试
3.1 白盒测试概述
白盒测试清楚盒子内部的东西以及里面是如何运作的,白盒测试目的:
- 保证程序中所有关键路径都被测试到,防止系统投入使用后用户发现系统问题。
- 便于衡量测试的完整性,即有没有把某个功能点的所有可能情况都测试到。
- 可以测试到程序中所有的真分支、假分支。
- 检查局部数据结构的有效性。
- 检查程序的异常处理能力。
- 检查代码是否遵循编码规范。
白盒测试的方法总体上分为静态白盒测试和动态白盒测试两大类。
静态白盒测试
静态白盒测试是一种不通过执行程序而进行测试的技术,其关键功能是检查软件的表示和描述是否一致,有无冲突或者歧义,包括检查文档内容、界面、代码规范等。
动态白盒测试
动态白盒测试将程序在受控的环境下使用特定的测试用例进行正式的运行,它显示了一个系统在检查状态下是正确还是不正确,最重要的动态测试技术是路径和分支测试。
3.2 静态白盒测试
静态白盒测试也称为人工测试,这种测试不实际运行被测系统本身,检查和审查代码的设计、结构,也称为结构分析,它能够尽早发现程序中30%-70%的缺陷,并为黑盒测试人员提供测试思路。
静态白盒测试一般包括代码检查、桌前走查和代码审查。
- 代码检查:程序员自行设计测试用例,对源代码、详细设计进行仔细检查,并记录错误、不足之处等。
- 桌前走查:测试人员先阅读相应的文档和源代码,然后人工输入测试数据,沿着程序的逻辑走查运行一遍,跟踪走查运行的进程来发现程序的错误。
- 代码审查:审查人员首先仔细阅读软件的有关资料,根据错误类型清单填写检测表,提出根据错误类型要提出的问题。
3.3 动态白盒测试
动态白盒测试的另一个常用名称是结构测试,因为软件测试员可以查看并使用代码的内部结构,从而设计和执行测试。
它根据程序的内部逻辑来设计测试用例,对程序模块的所有独立的执行路径至少执行一次,对所有逻辑判定的“真”、“假”取值至少测试一次,在循环的边界执行循环体,测试内部数据结构的有效性等等。
一般采用逻辑覆盖的白盒测试技术,即考察用测试数据运行被测程序时对程序逻辑的覆盖程度。
3.4 白盒测试案例
进行各种逻辑覆盖的白盒测试,即设计相应的测试用例。
流程图中包含3条不同的路径: P1(ab)、P2(acd)、P3(ace)
4. 单元测试
单元测试又称为模块测试,是针对软件设计的最小单位—程序模块进行正确性检验的测试工作,目的在于发现各模块内部可能存在的各种差错。它需要从程序内部结构出发设计测试用例,多个模块可以平行地独立进行。
单元测试主要在5个方面对被测模块进行检查:
- 模块接口测试
- 局部数据结构测试
- 重要路径测试
- 错误处理测试
- 边界测试
5. 集成测试
是单元测试的逻辑扩展,也叫做组装测试,是测试和组装软件的系统化技术。
集成测试采用的方法是测试软件单元的组合能否正常工作,以及与其他组的模块能否集成起来工作。最后,还要测试构成系统的所有模块组合能否正常工作。
6. 系统测试
系统测试是将已经集成好的软件系统,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素结合在一起,在实际运行的环境下,对计算机系统进行一系列的组装测试和确认测试。
验收测试是相关的用户和独立测试人员根据测试计划和结果对系统进行测试和接收。
常用策略:正式验收测试、Alpha 测试、Beta 测试。
6.1 Alpha测试
Alpha测试(α测试),是由某用户在开发环境下进行,或公司内部用户在模拟实际操作环境下进行。开发者坐在用户旁边,随时记下错误情况和使用中的问题。
6.2 Beta 测试
Beta 测试(β测试),是由软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,由用户记下遇到的所有问题。