【构建之法】第13章-软件测试

本章重点:

  • 各种测试方法和测试的设计方法

1 基本名词解释及分类

基本名词解释:

  • Bug:软件的缺陷;
  • Test Case:测试用例,描述了一个完整的测试过程,包括测试环境、输入、期望的结果等;
  • Test Suite:测试用例集,即一组相关的测试用例。

Bug可以分解为:

  • 症状(Symptom):即从用户的角度看,软件出了什么问题;
  • 程序错误(Fault):即从代码的角度看,代码的什么错误导致了软件的问题;
  • 根本原因(Root Cause):错误根源,即导致代码错误的根本原因。

一个关于Bug的完整例子:

  • 症状:用户报告,一个Windows应用程序有时会在启动时报错,继而不能运行;
  • 程序错误:有时候一个子窗口的handle为空,导致程序访问了非法内存地址,此为代码错误;
  • 根本原因:代码并没有确保创建子窗口(在CreateSubWindow()内部才做)发生在调用子窗口之前(在OnDraw()时调用),因此子窗口的handle变量有时会在访问时处于未赋值状态(为空),导致出现上面提到的代码错误。

1.1 按测试设计的方法分类

分类 说明
黑箱 指的是在设计测试的过程中,把软件系统当作一个“黑箱”,无法了解或使用系统的内部结构及知识。一个更准确的说法时行为测试设计(Behavioral Test Design),即从软件的行为,而不是从内部结构出发来设计测试。
白箱 指的是在设计测试的过程中,设计者可以“看到”软件系统的内部结构,并使用软件的内部结构和知识来选择测试数据即具体的测试方法。“白箱”并不是一个精确的说法,因为把箱子涂成白色,同样也看不见箱子里的东西。有人建议用“玻璃箱”来表示。

注意:所谓的黑箱/白象,是指软件测试设计的方法,不是软件测试的方法!注意“设计”二字。

1.2 按测试的目的分类

1.2.1 功能测试

下表所示的测试类别中,测试的范围由小到大,测试者也由内到外 - 从程序开发人员(单元测试)到测试人员,到一般用户(Alpha/Beta测试)。

测试名称 测试内容
单元测试(Unit Test) 在最基本的功能/参数上验证程序的正确性
功能测试(Functional Test) 验证模块的功能
集成测试(Integration Test) 验证几个互相有依赖关系的模块的功能
场景测试(Scenario Test) 验证几个模块能否完成一个用户场景
系统测试(System Test) 对于整个系统功能的测试
Alpha/Beta Test 外部软件测试人员(Alpha/Beta测试员)在实际用户环境中对软件进行全面的测试

1.2.2 非功能测试

一个软件除了基本功能之外,还有很多功能之外的特性,这些叫非功能需求(Non-functional Requirement),或者服务质量需求(Quality of Service Requrement)。这一般在软件的基本功能开发完成后来做这些非功能测试。

测试名称 测试内容
压力测试(Stress/Load Test) 测试软件在负载情况下能否正常工作
效能测试(Performance Test) 测试软件的效能
可访问性测试(Accessibility Test) 测试软件是否向残疾用户提供了足够的辅助功能
本地化/全球化测试(Localization/Globalization Test) /
兼容性测试(Compatibility Test) /
配置测试(Configuration Test) 测试软件在各种配置下能否正常功能
易用性测试(Usability Test) 测试软件是否好用
软件安全性测试(Security Test) /

1.2.3 按测试的时机和作用分类

在开发软件的过程中,不少测试起着“烽火台”的作用,它们告诉我们软件开发的流程是否顺畅。

测试“烽火台”:

测试名称 测试内容
冒烟测试(Smoke Test) 测试不通过,则不能进行下一步工作
构建验证测试(Build Verification Test) 验证构建是否通过基本测试
验收测试(Acceptance Test) 全面考核某方面的功能/特性

另一些测试名称,则是说明不同的测试方法。

不同的测试方法:

测试名称 测试内容
“回归”测试(Regression Test) 对一个新的版本,重新运行以往的测试用例,确认新版本相比已知版本有无“退化”(Regression)
“探索式”的测试(Ad hoc/Exploratory Test) 随机进行的、探索性的测试
Bug大扫荡(Bug Bash) 全体成员参加的找“小强”活动
伙伴测试(Buddy Test) 开发人员(伙伴)作为测试人员测试特定模块

2 各种测试方法

//

3 实战中的测试

实战中的测试是在项目的稳定阶段执行的。团队在这一阶段的核心任务是:在满足最低接受条件的前提下,提高各个部分的质量。

3.1 似是而非的测试概念

  • 测试在项目的最后进行就可以了;
  • 测试就得根据规格说明书(Spec)来测,所以是很机械的;
  • 测试人员当然也写代码,但是质量不一定要很高;
  • 测试的时候尽量用Debug版本,便于发现Bug;
  • 如果所有的人都关心质量,就没有必要有独立的测试团队。

3.2 测试工作中的文档

在计划阶段,我们就要制定测试计划(Test Plan),特别是测试总纲。

然后还要写测试设计说明书(TDS)测试用例(Test Case)程序错误报告(Bug Report)测试报告(Test Report)。它们之间的关系如下图所示:
【构建之法】第13章-软件测试
测试计划和测试总纲主要说明产品是什么,要做什么样的测试,时间安排如何,谁负责什么方面,各种资源在哪里,等等。

注意:我们不是为了写文档而写文档,写文档的目的是要解决问题。然而,到底这些文档会解决什么问题呢?

文档 作用
测试设计说明书(TDS) 正如开发人员有功能设计说明书,测试人员也要有测试设计说明书,告诉测试人员要如何设计测试。
测试用例(Test Case) 有了TDS,我们就可以按照TDS的描述,对每一个功能点进行实际的测试了。
具体地说,测试用例描述了如何设置测试前的环境、如何操作、预期结果是什么。
一个功能的所有测试用例合称为这个功能的测试用例集(Test Suite)。
错误报告(Bug Report) 一份好的错误报告,至少要满足:标题、描述、补充材料、严重程度及功能区域等
测试修复,关闭缺陷报告(Resolve,Test and Close a Bug) /
测试报告(Test Report) 用于报告各个功能测试的结果,这就是测试报告;
对于某一功能,我们要收集下列数据:
-有多少测试用例通过?
-有多少测试用例失败?
-有多少测试用例未完成?
-发现多少测试用例之外的Bug?

4 运用测试工具

//