软件测试

软件测试（software testing），描述一种用来促进鉴定软件的正确性、完整性、安全性和品质的过程。依照可计算理论（计算机科学的一个支派）一个简单的数学证明推断出下列结果：不可能完全解决所谓“当机”，指任意计算机程序是否会进入无穷循环，或者罢工并产生输出问题。换句话说，软件测试是一种实际输出与预期输出间的稽核或者比较过程。

软件测试的经典定义是：在规定的条件下对程序进行操作，以发现程序错误，衡量软件品质，并对其是否能满足设计要求进行评估的过程。

软件测试有许多方法，但对复杂的产品执行有效测试不仅仅是研究过程，更是创造并严格遵守某些呆板步骤的大事。测试的其中一个定义：为了评估而质疑产品的过程；这里的“质疑”是测试员试着对产品做的事，而产品以测试者脚本行为反应作为回答。虽然大部分测试的质疑过程不外乎回顾、检查，然而“测试”这个词意味着产品动态分析──让产品流畅运行。程式品质可能，而且通常会，随系统不同而有差异；不过某些公认特性是共通的：可靠性、稳定性、轻便性、易于维护、以及实用性。请参照至ISO标准ISO 9126有更详尽的说明。

## 测试的进程

### Alpha测试

Alpha测试通常是阶段性的开发完成后所开始进行，一直持续到进入Beta测试阶段前的阶段。Alpha测试是一种验证测试，在模拟的环境中以模拟的资料来执行。

在这个阶段中，通常是在开发单位由开发人员与测试的测试人员，以模拟或实际操作性的方式进行验证测试。

### Beta测试

在系统测试中通常先进行Alpha测试以验证资讯系统符合使用者以及设计需求所期望的功能。当Alpha阶段完成后，开发过程进入到Beta阶段，由公众参与的测试的阶段。Beta测试可称为确认测试，在一个真实的环境中以实际的资料来执行测试，以确认效能，系统执行有效率，系统复原与备份作业正常，透过测试让资讯系统日后可以更趋完善。

#### 封测与公测

封闭测试（Closed Beta，常简作封测或CB）是软件或服务等产品在开发完成后、将公开上市前的测试过程。相对于公开测试，封闭测试的主要用途是测试软件的功能和检查程式错误等等，因此通常只提供给少数人进行测试。有些公司会要求参与测试者签署保密协定，以避免测试的产品提前外流。MMORPG的封测结束之后，游戏公司常会将角色资料删除，但也有少数不会删除。

公开测试（Open Beta，常简作公测或OB），一般常指软件或服务等产品在正式上市前开放给不特定人试用，虽然原意是希望试用者能够提报bug，但并不是把试用者当做真正的验证人员。由于通常为免费性质，故常常能够吸引到大批的试用者参与，可视为另一种行销策略。另一方面也节省下测试人员的成本，和验证稳定度（对于多人使用的带宽及机器是否能负载，又称压力测试）的时间。

### Gamma测试

Gamma测试是一个很少被提及的非正式测试阶段，该测试阶段对应的是对“存在缺陷”产品的测试。考虑到任何产品都可以被称为“存在缺陷”的产品（测试只能发现产品中存在的问题，不能说明产品不存在问题），因此这个概念存在一定的不确定性。

对Alpha和Beta测试常见的一个误解是“Beta测试＝黑盒测试”。实际上，Alpha和Beta测试对应在软件产品发布之前的Alpha和Beta阶段，而白盒、黑盒和灰盒测试技术是从技术和方法层面对测试的描述，不应该将这两部分概念混淆。

## 测试的方法

软件测试一般分为黑盒测试和白盒测试。

### 黑盒测试

黑盒测试（black-box testing），也称黑箱测试，是软件测试方法，测试应用程序的功能，而不是其内部结构或运作。测试者不需具备应用程序的程式码、内部结构和程式语言的专门知识。测试者只需知道什么是系统应该做的事，即当键入一个特定的输入，可得到一定的输出。测试案例是依应用系统应该做的功能，照规范、规格或要求等设计。测试者选择有效输入和无效输入来验证是否正确的输出。

此测试方法可适合大部分的软件测试，例如整合测试（integration testing）以及系统测试（system testing）。

### 白盒测试

白盒测试（white-box testing，又称透明盒测试glass box testing、结构测试structural testing等）是一个测试软件的方法，测试应用程序的内部结构或运作，而不是测试应用程序的功能（即黑箱测试）。在白盒测试时，以程式语言的角度来设计测试案例。测试者输入资料验证资料流在程式中的流动路径，并确定适当的输出，类似测试电路中的节点。

白箱测试可以应用于单元测试（unit testing）、整合测试（integration testing）和系统的软件测试流程，可测试在整合过程中每一单元之间的路径，或者主系统跟子系统中的测试。尽管这种测试的方法可以发现许多的错误或问题，它可能无法检测未使用部分的规范。

## 测试的类型

功能测试｜按照测试软件的各个功能划分进行有条理的测试，在功能测试部分要保证测试项覆盖所有功能和各种功能条件组合。

系统测试｜对一个完整的软件以用户的角度来进行测试，系统测试和功能测试的区别是，系统测试利用的所有测试数据和测试的方法都要模拟成和用户的实际使用环境完全一样，测试的软件也是经过系统集成以后的完整软件系统，而不是在功能测试阶段利用的每个功能模块单独编译后生成的可执行程序。

极限值测试｜对软件在各种特殊条件，特殊环境下能否正常运行和软件的性能进行测试。特殊条件一般指的是软件规定的最大值，最小值，以及在超过最大、最小值条件下的测试。特殊环境一般指的是软件运行的机器处于CPU高负荷，或是网络高负荷状态下的测试，根据软件的不同，特殊环境也有过不同。

性能测试｜性能测试是对软件性能的评价。简单的说，软件性能衡量的是软件具有的响应及时度能力。因此，性能测试是采用测试手段对软件的响应及时性进行评价的一种方式。根据软件的不同类型，性能测试的侧重点也不同。

### 压力测试与性能测试

压力测试常常和性能测试相混淆。它们主要不同点是，压力测试要求进行超过规定性能指标的测试。例如一个网站设计容量是100个人同时点击，压力测试就要是采用120个同时点击的条件测试。

压力测试的通常判断准则：

- 系统能够恢复。
- 压力过程中不要有明显性能下降。

## 测试的阶段

### 单元测试

单元测试是对软件组成单元进行测试，其目的是检验软件基本组成单位的正确性，测试的对象是软件设计的最小单位：函数。

并且使用假资料测试不同状况下功能使用情况，单元测试还有助于开发人员编写更好的代码。

单元测试是基于code的:可读性、可测试性，它们与开发代码的构建方式密切相关。因此开发人员最清楚哪些测试最有意义。

### 整合测试

整合测试也称综合测试、组装测试、联合测试，将程序模块采用适当的集成策略组装起来，对系统的接口及集成后的功能进行正确性检测的测试工作。其主要目的是检查软件单位之间的接口是否正确，集成测试的对象是已经经过单元测试的模块。

### 系统测试

系统测试主要包括功能测试、界面测试、可靠性测试、易用性测试、性能测试。

功能测试主要针对包括功能可用性、功能实现程度（功能流程&业务流程、数据处理&业务数据处理）方面测试。

### 回归测试

回归测试(regression test)指在软件维护阶段，为了检测代码修改而引入的错误所进行的测试活动。回归测试是软件维护阶段的重要工作，有研究表明，回归测试带来的耗费占软件生命周期的1/3总费用以上。

与普通的测试不同，在回归测试过程开始的时候，测试者有一个完整的测试用例集可供使用，因此，如何根据代码的修改情况对已有测试用例集进行有效的复用是回归测试研究的重要方向，此外，回归测试的研究方向还涉及自动化工具，面向对象回归测试，测试用例优先级，回归测试用例补充生成等。

- 测试原有功能
- 测试新加入的功能是否有side effect

## 测试过程示例

### 软件测试活动

- 验收测试
- 系统测试
- 集成测试
- 单元测试
- 回归测试
- 性能测试
- 压力测试
- 安全测试
- 安装测试
- 可用性测试
- 稳定性测试
- 易用性测试
- 移植测试

## 代码覆盖率

代码覆盖率原本是种白箱测试活动。目标软件通过特殊选项或者函式馆编译并且/或者在特殊环境（程式里每个函式都被映射回源代码里函式起点）下执行。这个过程允许开发员与品管员检视系统中在正常情况下极少或从未被读写的部分（例如：例外处理之类）并且帮助测试员确认最重要的情况（函式点）都被测过了。

测试员可检视代码覆盖率测试结果来设计测试个案、相对应的输入或者设定组以增加重要函式的代码覆盖率。两种测试员常用的代码覆盖率形式：陈述式覆盖率（或称行覆盖率）以及路径覆盖率（或称边覆盖率）。行覆盖率回报到测试完成时，执行过哪些行，或者内存大小。边覆盖率回报到测试完成时，哪些分支，或者程式决定点被执行过。正如覆盖率的“率”字所言，这两个都以百分比为单位。

通常代码覆盖率的工具与函式馆要求的效能、内存、或者其他资源开销不为正常的软件营运接受。因此它们通常只存在实验室里。又，你可能会想到软件里的许多类无法一一通过这些代码覆盖率测试，虽然代码覆盖程度可通过分析但不是直接测试。

有些瑕疵也会受这些工具的影响。个别来说某些竞态条件（race condition）或者类似的对即时（real time）敏感度高的操作几乎不可能在代码覆盖率测试环境下侦知；相反的这类的瑕疵只会带来更多的测试码开销。

## 自动化的测试

自动化测试是使用软件工具和既定程序，对软件所进行的测试活动。