软件测试:基础概念一
软件测试的定义和分类
一、软件测试的定义
软件测试的定义可以从不同角度理解,但核心思想是一致的。
1. 经典定义:
软件测试是使用人工或自动化的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。
2. 通俗理解:
软件测试就像软件的“体检”和“质检”过程。我们通过执行设计好的步骤(测试用例),来发现软件中存在的缺陷(Bug),从而对软件质量进行评估。
3. 更全面的理解(目的与价值):
- 首要目的: 发现缺陷,这是最直接的活动。
- 深层目的:
- 提升信心: 通过测试提供质量信息,让用户、开发和管理层对软件的质量建立信心。
- 预防缺陷: 通过早期参与需求、设计评审等活动,预防缺陷被引入到代码中。
- 支持决策: 为项目管理者提供“软件是否可以发布”的决策依据。
- 保护业务: 避免因软件缺陷导致经济损失、品牌损害或安全事故。
一个常见的误解是“测试的目的是证明软件没有错误”。 恰恰相反,测试的目的是为了尽可能地发现软件中存在的错误。成功的测试在于发现了迄今未被发现的缺陷。
二、软件测试的分类
软件测试的分类方式多种多样,可以从不同角度划分。理解这些分类有助于我们组织测试活动,确保测试的全面性。下图清晰地展示了软件测试的核心分类维度:下面我们将对上图中的各个分类进行详细解读。
1. 按测试阶段划分(测试级别)
这是最经典的分类,对应软件开发的V模型。
- 单元测试:
- 对象: 软件的最小可测试单元,通常是函数、方法、类。
- 执行者: 开发工程师。
- 目的: 验证代码逻辑的正确性。
- 集成测试:
- 对象: 将多个单元模块组合在一起后的组件或系统。
- 执行者: 开发工程师或测试工程师。
- 目的: 检验模块之间的接口和交互是否正确。
- 系统测试:
- 对象: 完整的、集成好的软件系统。
- 执行者: 测试工程师。
- 目的: 在模拟真实环境的情况下,验证整个系统是否满足需求规格说明书的要求。这是测试工程师的核心工作。
- 验收测试:
- 对象: 完整的软件系统。
- 执行者: 最终用户或客户(Alpha/Beta测试),也可以是测试人员代表用户(UAT,用户验收测试)。
- 目的: 确认软件是否满足合同或用户要求,决定是否可以被“接受”并上线。
2. 按测试方法划分(是否查看内部代码)
- 黑盒测试:
- 比喻: 把软件当成一个黑色的盒子,看不到内部结构。
- 方法: 只关心软件的输入和输出是否正确,不关心程序内部如何实现。
- 基础: 需求规格说明书。
- 执行者: 主要是测试工程师。
- 白盒测试:
- 比喻: 把软件当成一个透明的玻璃盒子,可以看到内部。
- 方法: 基于软件的内部代码、逻辑结构来设计测试用例。
- 目的: 测试代码路径、条件分支、循环等是否正确。
- 执行者: 主要是开发工程师(如单元测试)。
- 灰盒测试:
- 方法: 介于黑盒和白盒之间。既关注外部的输出表现,也会利用一些内部知识(如代码结构、日志)来辅助设计测试用例。
- 典型例子: 集成测试、渗透测试。
3. 按测试手段划分
- 手动测试:
- 描述: 由测试人员手工操作软件,逐条执行测试用例,观察结果。
- 优点: 灵活,适用于易用性、探索性测试、界面UI测试。
- 缺点: 效率低,易出错,难以覆盖所有场景。
- 自动化测试:
- 描述: 利用脚本和工具自动执行测试用例,并将结果与预期结果进行比较。
- 优点: 效率高,可重复,适合回归测试、性能测试、大数据量测试。
- 缺点: 前期投入大,无法替代人类的直觉和探索性思维。
4. 按测试内容/目的划分(测试类型)
- 功能测试:
- 目的: 验证软件的功能是否按照需求正常工作。这是最基础的测试。
- 例子: 测试登录功能、支付功能、搜索功能。
- 非功能测试:
- 目的: 验证软件的性能、可靠性等非功能特性。
- 主要类型包括:
- 性能测试: 压力测试(极限负载)、负载测试(正常到峰值负载)、稳定性测试(长时间运行)。
- 安全测试: 验证软件能否防止未授权访问和数据泄露。
- 兼容性测试: 在不同浏览器、操作系统、设备上是否正常工作。
- 易用性测试: 检验软件是否易于使用、符合用户习惯。
- 可靠性测试: 检查软件在指定条件下无故障运行的能力。
5. 其他常见分类
- 回归测试: 当软件被修改后(如修复Bug、增加新功能),重新执行之前的测试用例,以确保修改没有引入新的缺陷或破坏现有功能。这是自动化测试的主要应用场景。
- 冒烟测试: 在对新版本进行大规模测试前,先进行一轮“通关测试”,验证软件的基本核心功能是否正常,如果失败则版本被打回。目的是确保版本具备可测性。
- 探索性测试: 同时进行测试设计、测试执行和学习,依赖于测试人员的经验、直觉和创造力,旨在发现那些通过脚本无法发现的、隐蔽的缺陷。
总结
软件测试是一个多维度的、系统的质量保障活动。一个完整的测试策略会综合运用上述多种分类方法。例如,一个项目可能会:
- 在单元测试阶段由开发进行白盒测试。
- 在系统测试阶段由测试工程师进行黑盒的功能测试和兼容性测试。
- 使用自动化测试手段来执行大量的回归测试。
- 在发布前进行手动的探索性测试和验收测试。
理解这些定义和分类,是成为一名合格软件测试工程师的基础。
软件的生命周期
好的,这是一个非常核心的概念。软件生命周期 是指一个软件产品从“概念提出”到“最终退役”的整个过程中所经历的一系列阶段。它也被称为 SDLC。
理解软件生命周期对于测试人员至关重要,因为测试活动是贯穿整个生命周期的重要组成部分,而不仅仅是编码之后的一个独立环节。
目前最广泛接受的模型是敏捷开发 和在其基础上衍生的 DevOps。它们强调迭代、协作和持续交付。为了帮助您更直观地理解软件生命周期中不同模型的特点,下图对比了传统瀑布模型与现代敏捷/DevOps模型的流程差异:
下面,我们以一个完整的软件生命周期为例,详细讲解每个阶段及其中的测试活动:
软件生命周期的六个主要阶段
1. 需求分析阶段
-
目标: 深入理解用户和市场的需求,明确软件“做什么”,并形成详细的需求规格说明书。
-
主要活动: 市场调研、用户访谈、编写需求文档、评审需求。
-
测试人员的活动:
-
参与需求评审: 从测试角度审查需求的可测试性、完整性和清晰度。这是预防缺陷的黄金阶段!
-
初步制定测试计划: 开始思考整体的测试策略、范围和资源。
2. 设计阶段
-
目标: 将需求转化为具体的、可执行的技术方案,解决“怎么做”的问题。包括软件架构、数据库设计、接口设计等。
-
主要活动: 架构设计、UI/UX设计、编写设计文档。
-
测试人员的活动:
-
参与设计评审: 检查设计是否存在漏洞,是否满足需求。
-
编写测试用例: 根据需求和设计文档,开始设计详细的测试用例和测试场景。这是测试设计的核心阶段。
3. 实现(编码)阶段
-
目标: 开发人员根据设计文档,编写出实际的程序代码。
-
主要活动: 编写代码、代码版本管理(如Git)、进行单元测试。
-
测试人员的活动:
-
准备测试环境: 搭建和维护测试环境。
-
准备测试数据: 设计并生成测试所需的各种数据。
-
开发/编写自动化测试脚本: 为接下来的测试执行做准备。
-
执行冒烟测试: 当有可测试的版本构建出来时,首先进行冒烟测试,确保基本功能正常,版本具备可测性。
4. 测试阶段
-
目标: 系统地验证软件是否满足需求,并尽可能多地发现缺陷。
-
主要活动: 这是测试人员最核心的阶段。
-
执行测试用例: 包括功能测试、界面测试、兼容性测试等。
-
性能测试、安全测试(可能由专项测试工程师完成)。
-
提交和跟踪缺陷: 在缺陷管理工具中记录Bug,并跟踪其修复过程。
-
回归测试: 修复Bug或增加新功能后,确保原有功能不受影响。
-
测试人员的活动: 全面展开测试执行、缺陷管理和回归验证工作。
5. 部署与维护阶段
-
目标: 将软件发布给用户使用,并在运行期间提供持续支持。
-
主要活动: 软件部署上线、用户培训、运维监控。
-
测试人员的动:
-
验收测试: 配合业务方或用户进行上线前的最终验证。
-
线上验证: 软件发布到生产环境后,进行快速验证,确保部署成功。
-
支持用户反馈: 协助复现和验证用户在实际使用中遇到的问题。
6. 退役阶段
-
目标: 当软件不再有价值或被新系统取代时,让其平稳下线。
-
主要活动: 数据迁移、通知用户、停止服务。
-
测试人员的活动: 可能会参与新老系统数据迁移的验证测试。
软件生命周期模型
需要注意的是,上述阶段的顺序和关系不是一成不变的,这就形成了不同的软件开发模型,也称为软件生命周期模型。测试活动需要适应不同的模型。
- 瀑布模型:
-
特点: 阶段间有严格的顺序,如同瀑布流水,只能逐级下落。前一阶段完成后,才能进入下一阶段。
-
测试的位置: 测试作为一个独立的、后期的阶段,在编码完成后才开始。
-
缺点: 无法灵活响应需求变更,风险通常在后期才暴露。
- V模型:
-
特点: 是瀑布模型的改进,强调了测试与开发的对应关系。每个开发阶段(左半V)都对应一个测试级别(右半V)。
-
对应关系: 需求分析 -> 验收测试设计;系统设计 -> 系统测试设计;详细设计 -> 集成测试设计;编码 -> 单元测试。
-
优点: 测试活动提前,结构清晰。
- 敏捷模型:
-
特点: 当前最主流的模型。它将一个大项目拆分成一系列小的、可交付的迭代(通常为1-4周)。每个迭代都包含需求、设计、编码、测试等所有活动,并产生一个可工作的软件增量。
-
测试的位置: 测试贯穿每一个迭代周期,与开发紧密协作。测试人员需要全程参与,提倡测试左移,即尽早开始测试活动(如评审需求)。
-
优点: 高度灵活,能快速响应变化,持续交付价值。
总结:测试人员的视角
对测试人员来说,理解软件生命周期意味着:
-
测试不是项目末尾的一个阶段,而是全过程的质量保障活动。
-
要积极参与前期的需求和分析会议(测试左移),从源头提升质量。
-
在不同的生命周期模型(尤其是敏捷)中,测试人员需要具备更强的协作和适应能力。
-
软件生命周期在DevOps文化中进一步演变为一个无限循环,强调开发、测试和运维的深度融合,实现持续集成、持续测试和持续部署。
软件测试的工作流程
软件测试的工作流程是一个系统化的过程,它贯穿于整个软件开发生命周期,而不仅仅是在编码完成后才进行。其核心目标是尽早、持续地发现缺陷,确保软件质量。
下面我们来详细解析每一个阶段的具体工作内容。
软件测试工作流程详解
阶段一:需求分析与评审
这是测试活动的起点,目标是从源头确保质量。
- 主要活动:
- 参与需求评审会: 测试人员与产品经理、开发、架构师等一起评审需求文档(如PRD)。
- 分析测试需求: 深入理解需求,明确“要测试什么”?包括功能、性能、安全性、兼容性等。
- 找出需求歧义/漏洞: 从测试角度提出疑问,确保需求是清晰、准确、完整且可测试的。
- 输出物: 评审意见、对需求的理解笔记、初步的测试点。
阶段二:测试计划与策略制定
根据需求分析结果,规划测试活动,回答“怎么测”、“需要什么资源”、“花多长时间”等问题。
- 主要活动:
- 确定测试范围与目标: 明确本次测试要覆盖哪些功能,不覆盖哪些功能。
- 制定测试策略: 确定测试级别(单元、集成、系统、验收)、测试类型(功能、性能、安全等)、测试工具、以及回归测试的范围。
- 资源与进度安排: 分配测试人员角色,规划测试环境,制定详细的时间表。
- 评估风险: 识别可能影响测试进度的风险(如需求变更、环境不稳定等),并制定应对措施。
- 输出物: 《测试计划》文档。
阶段三:测试设计与开发
这是将测试策略具体化的过程,准备“测试武器”。
- 主要活动:
- 编写测试用例: 根据需求文档和设计文档,设计详细的测试用例,包括正常流程、异常流程、边界值等。通常会使用测试用例管理工具(如TestLink、XMind、Excel)。
- 评审测试用例: 组织开发、产品或其他测试人员对测试用例进行评审,确保用例的有效性和覆盖率。
- 准备测试数据脚本: 创建测试所需的数据,开发自动化测试脚本(如果需要)。
- 搭建测试环境: 准备与生产环境尽可能一致的独立环境(测试环境/预发布环境)。
- 输出物: 《测试用例》、测试数据、自动化测试脚本、已搭建好的测试环境。
阶段四:测试执行
这是将测试用例付诸实践的阶段,核心是发现和记录缺陷。
- 主要活动:
- 执行测试用例: 按照测试用例的步骤执行,并记录实际结果。测试通常分为多轮:
- 冒烟测试: 对核心功能进行快速验证,通过后才进入详细测试。
- 系统测试/集成测试: 全面执行测试用例。
- 回归测试: 在开发修复缺陷后,验证缺陷已修复,且没有引入新的问题。
- 提交与跟踪缺陷: 在缺陷管理工具(如Jira、禅道)中清晰、准确地提交Bug,并跟踪其状态(新建->打开->已修复->关闭)。
- 进行探索性测试: 在测试用例之外,基于经验和直觉进行非正式的测试,以发现更隐蔽的缺陷。
- 执行测试用例: 按照测试用例的步骤执行,并记录实际结果。测试通常分为多轮:
- 输出物: 测试执行记录、缺陷报告。
阶段五:测试评估与报告
在测试活动尾声或一个里程碑点,对测试结果和产品质量进行评估。
- 主要活动:
- 评估测试覆盖率: 检查测试用例对需求的覆盖程度。
- 分析缺陷数据: 分析缺陷的数量、严重等级、分布模块、修复趋势等。
- 编写测试报告: 总结测试活动,包括测试范围、资源消耗、发现的缺陷分析、遗留的风险,并给出明确的结论:当前版本是否达到发布标准?
- 输出物: 《测试报告》。
阶段六:测试结束活动
在产品发布后,进行收尾工作。
- 主要活动:
- 归档测试资产: 将测试用例、脚本、文档等进行整理和归档,便于后续版本复用。
- 总结经验教训: 组织复盘会议,讨论本次测试过程中的优点和不足,为后续项目改进流程。
不同开发模式下的流程差异
- 瀑布模型: 以上流程在瀑布模型中体现得最为典型,每个阶段顺序进行,文档要求严格。
- 敏捷模型(Scrum/Kanban): 测试流程被融入到每个短周期(Sprint)中。
- 测试人员全程参与每个Sprint的规划、评审和站会。
- 测试设计与执行与开发编码几乎同步进行(测试左移)。
- 强调自动化测试,以支持快速迭代和持续集成/持续交付(CI/CD)。
总结
软件测试工作流程是一个闭环的、不断改进的质量保障活动。它不仅仅是“找Bug”,更是一套贯穿项目始终的预防、保证和评估体系。一个成熟的测试流程能够显著提升软件质量,降低项目风险,并最终赢得用户信任。
软件测试点分析
这是一个非常核心且能体现测试工程师功力的问題。功能测试点分析是测试设计的基石,它的核心目的是确保无遗漏、无重复地覆盖所有功能需求。
下面我将通过一个完整的流程、方法和实际案例,来详细讲解如何分析功能测试点。
一、核心思路与原则
在开始分析前,要牢记三个核心原则:
- 基于需求:一切测试点的来源都是需求规格说明书(PRD)、设计文档、用户故事等。测试人员首先是“需求专家”。
- 多维度覆盖:不要只盯着“正常情况”,要从正常、异常、边界、数据、场景等多个角度思考。
- 代表用户:始终从用户的角度思考,用户会怎么用?可能会怎么误操作?
二、功能测试点分析流程与方法(四步法)
我们可以遵循一个从宏观到微观的系统化流程。
第一步:需求消化与理解
这是测试点分析的基础,目标是将需求“吃透”。
- 活动:
- 通读需求文档:至少读两遍,第一遍了解全局,第二遍深入细节。
- 参与评审:积极参与需求评审会议,从测试角度提出疑问。
- 识别测试范围:明确“测什么”和“不测什么”。例如,一个新功能可能依赖另一个系统,需要明确接口由谁测试。
- 输出:对需求的理解笔记、疑问列表、初步的功能模块划分。
第二步:提取测试点
这是核心分析环节,需要使用多种方法从不同维度“挖掘”测试点。以下是几种最常用且有效的方法,推荐组合使用。
方法1:功能交互分析法(基于输入-处理-输出模型)
这是最基础的方法,将每个功能单元看作一个黑盒。
- 输入:有哪些可输入的地方?(文本框、下拉框、文件上传、按钮点击等)
- 正常值:输入符合规则的数据。
- 边界值:输入刚超出的值(如长度限制为6,测5,6,7)。
- 等价类:将输入数据划分为若干组,每组选一个代表测试即可(如年龄:无效类“abc”,无效类“-1”,有效类“18”,有效类“65”)。
- 特殊字符:输入
!@#$%、空格、null、超长字符串等。 - 非法值/错误格式:输入不符合预期格式的数据。
- 处理:系统做了什么?
- 操作:点击按钮、链接后,系统是否有正确的反馈(如提示、页面跳转、数据更新)。
- 状态变化:一个操作是否导致了对象状态的正确改变(如订单状态从“待支付”变为“已支付”)。
- 业务规则:复杂的逻辑判断(如满100元包邮、不同会员等级折扣不同)。
- 输出:系统返回了什么?
- 界面显示:结果是否正确显示?格式是否正确?
- 数据持久化:数据是否正确地保存到了数据库?
- 外部交互:是否正确地调用了其他系统接口并处理了返回值?
方法2:业务场景分析法(基于用户旅程)
这种方法能发现功能串联起来后才会出现的问题,非常贴近用户真实使用情况。
- 核心:描绘一个典型用户的完整操作流程。
- 技巧:
- 正常流:最核心、最顺利的“完美路径”。
- 备选流:正常流程中的一些分支(如登录时选择“忘记密码”)。
- 异常流:各种出错和中断的情况(如支付时网络断开、提交时session过期)。
方法3:UI/UX元素遍历法
确保界面上每一个可交互元素都被覆盖到。
- 内容:按钮、链接、输入框、下拉菜单、图标、图片、提示信息、页面标题、排版布局等。
- 测试点:每个元素是否显示正常?点击是否有正确响应?是否易于使用?
方法4:质量特性分析法
从非功能需求角度思考其对功能的影响。
- 安全性:输入SQL注入/XSS脚本是否有防护?权限控制是否生效?
- 兼容性:在不同浏览器、操作系统、设备上功能是否正常?
- 易用性:操作流程是否符合常识?提示信息是否清晰?
第三步:整理与分类
将挖掘出的测试点进行归纳,避免重复和混乱。
- 按功能模块分类:如“用户登录模块”、“商品搜索模块”、“订单支付模块”。
- 按测试类型分类:如“正常功能”、“异常测试”、“边界测试”、“UI测试”。
- 使用工具:Excel、XMind(思维导图)、专业的测试管理工具(如Jira、TestRail)。
第四步:评审与完善
- 活动:与产品经理、开发工程师或其他测试同事一起评审测试点。
- 目标:查漏补缺,确保测试点的准确性和完整性,剔除无效的测试点。
三、实战案例:分析“用户登录”功能测试点
假设我们要测试一个标准的用户名密码登录功能。
1. 功能交互分析
- 输入 - 用户名/密码输入框:
- 正常:输入正确的用户名和密码。
- 边界:用户名长度边界(如最小3位,最大20位)。
- 等价类:输入错误用户名/正确密码;输入正确用户名/错误密码;两者都错误。
- 特殊值:用户名为空、密码为空、两者都为空;输入空格;输入SQL注入语句(
' or '1'='1)。
- 处理 - 点击“登录”按钮:
- 业务规则:连续输错3次密码,账号是否被锁定一段时间?是否需要验证码?
- 输出:
- 成功:跳转到指定页面(如首页),Session/Cookie是否正确设置。
- 失败:提示信息是否清晰、友好(如“用户名或密码错误”而非“登录失败”)。
2. 业务场景分析
- 正常流:输入正确信息 -> 成功登录 -> 跳转首页。
- 备选流:点击“忘记密码” -> 进入密码重置流程。
- 异常流:登录过程中刷新页面;登录成功后点击浏览器回退按钮。
3. UI/UX元素遍历
- 用户名/密码输入框的placeholder文字是否正确?
- “登录”按钮在未输入时是否为禁用状态?
- 是否支持按回车键登录?
- 密码是否以掩码形式显示?
4. 质量特性分析
- 安全性:传输是否加密(HTTPS)?密码是否在后台加密存储?错误提示是否会暴露用户是否存在(应统一提示“用户名或密码错误”)?
- 兼容性:在不同浏览器(Chrome、Firefox)上是否正常?
通过以上方法的组合,你就可以得出一份非常全面、细致的“用户登录”功能测试点清单了。
总结一下,功能测试点分析是一项系统性的思维活动,关键在于:熟读需求、多维度发散、结构化整理、团队化评审。 随着经验的积累,这个过程会变得越来越熟练和高效。

浙公网安备 33010602011771号