第 14 章 软件实现与测试
【版权声明与学习说明】
本文系笔者学习《系统分析师教程(第2版)》第14章后,结合个人理解整理的原创学习笔记。文中所有表格、通俗化举例及箭头式总结,均为本人消化后重新归纳表述,不代表原书官方立场。
整理初衷仅为交流学习、备考记录,无意侵犯原作者版权。若您认为存在不当引用,请通过CSDN私信联系,我会第一时间处理。
推荐备考的朋友购买正版教材,尊重知识成果。
软件实现是将设计方案转化为可运行程序的落地阶段,核心是程序设计与编码;软件测试则是贯穿全生命周期的质量保障环节,目的是尽早发现并修复缺陷。本章围绕 “软件实现(怎么编)” 和 “软件测试(怎么查)” 两大核心展开,从实现方法、编码规范,到测试概念、方法、类型、组织管理,再到最终的软件部署,形成完整的 “开发 - 验证 - 交付” 闭环,是确保软件功能达标、质量可靠的关键指南。
14.1 软件实现概述
软件实现的核心任务是程序设计,即将软件设计结果翻译成程序代码,关键在于选择合适的方法、语言和规范,提升代码的可靠性、可维护性和可复用性。
14.1.1 程序设计方法
主流程序设计方法有三种,适配不同开发场景:
结构化程序设计:
- 核心思想:自顶向下、逐步求精,使用单入口、单出口的控制结构;
- 基本控制结构:顺序结构、IF-THEN-ELSE 选择结构、DO-WHILE 循环结构(经典结构化),可扩展 DO-CASE 多分支、DO-UNTIL 循环,或补充 LEAVE/BREAK 结构(修正结构化);
- 优势:程序结构清晰,静态结构与动态执行一致,可读性强。
面向对象程序设计(OOP):
- 核心思想:问题域中有什么事物,程序中就有什么对象,事物间的关系对应对象间的关系;
- 核心机制:支持类、对象、继承、多态、消息通信;
- 优势:显著提升软件可靠性、可维护性和可复用性,是 “OOA-OOD-OOP” 软件工程流程的最终落地环节。
可视化程序设计(VP):
- 核心思想:像 “搭积木” 一样,用工具提供的控件构造应用界面,少写或不写代码;
- 核心概念:表单(程序窗口)、部件(按钮、复选框等构件)、属性(部件的显示 / 状态特征)、事件(对部件的操作,如点击)、方法(事件触发后的响应程序);
- 优势:极大提高开发效率,常用工具如 Eclipse、Visual Studio。
14.1.2 程序设计语言与风格
程序语言的选择:
- 选择原则:优先选能减少测试量、易读易维护的语言,同时考虑用户要求、软件工具、工程规模、程序员知识、可移植性、应用领域等限制。
程序设计风格:
- 核心目标:提升可理解性、可复用性、可扩展性、健壮性;
- 关键要点:
- 可理解性:有意义的标识符、详细注解、清晰的视觉组织、规范的数据说明;
- 可复用性:高内聚、小规模功能、一致的接口、分离接口与实现、避免全局变量;
- 可扩展性:封装实现策略、利用多态、避免多分支语句;
- 健壮性:预防用户误操作、检查参数合法性、先测试后优化。
14.1.3 编码规范
编码规范是团队协作和长期维护的基础,核心涵盖四方面:
- 命名规范:标识符(变量、函数、类名)命名统一、有意义;
- 注释原则:详细但不冗余,说明代码意图而非实现细节;
- 编程风格规则:代码格式化(缩进、换行)、语句构造简洁;
- 版本管理规则:代码提交、分支管理、冲突解决的统一流程;
- 其他规范:函数长度限制、错误处理统一、冗余代码清理、通用开发模式遵循。
14.1.4 代码生成
针对重复性高、有固定规律的代码(如用户认证、权限管理),用代码生成器自动生成,减少重复劳动:
- 实现步骤:准备模板文件→准备关键数据→定义数据置换占位符的合成机制→遍历数据和模板→生成代码文件。
14.1.5 代码重用
代码重用是提高开发效率的关键,需基于高质量代码(无错、不复杂),常用方法:
- 使用函数:抽象重复逻辑为函数,多处调用;
- 使用对象 / 类:封装复杂代码为对象或类,通过继承、多态实现高度复用;
- 使用模块:抽象代码为独立模块,调用即可实现功能;
- 利用算法:解构和分解组合算法,减少重用损耗。
14.2 软件测试概述
软件测试是保障软件质量的核心手段,目的是在软件投入运行前,尽可能发现潜在错误和缺陷,避免后期损失。
14.2.1 软件测试的概念
- 常见误解:测试是证明软件无错、验证软件做了该做的事;
- 正确定义:通过手动或自动方式运行 / 测量软件,检验是否满足需求,找出预期与实际结果的差异,核心是 “找错” 而非 “证对”;
- 发展趋势:测试前移(覆盖需求、设计阶段)、多角色协作、测试职业受重视、独立测试部门成为共识、测试外包全球化。
14.2.2 软件测试的基本问题
核心是验证功能实现与可用性,检查程序错误,最终提高用户体验,降低商业风险,同时度量软件质量,为用户接收软件提供依据。
14.2.3 软件测试的对象及目的
测试对象:源程序 / 目标代码、各阶段文档(需求规格说明、设计文档等)、配置数据;
测试目的:
- 用户视角:发现隐藏错误,判断是否接受产品;
- 开发者视角:验证软件实现所有需求,证明产品无错;
- 测试人员视角:发现并预测错误,评估软件可靠性。
14.2.4 软件测试的原则
- 测试用例必须包含预期输出;
- 程序员避免测试自己的程序(思维定式难发现错误);
- 编写软件的组织不测试自己的软件(缺乏客观性);
- 耐心检查每一个测试结果;
- 测试用例覆盖有效输入和无效 / 意外输入;
- 避免重复设计测试用例(保留并复用);
- 不默认程序无错;
- 不进行穷举测试(成本过高),追求最大覆盖率;
- 测试尽早执行,贯穿全生命周期;
- 测试追溯到需求。
14.3 软件测试方法
软件测试方法按 “被测程序是否可见” 和 “是否执行程序” 分为两大类,各有适用场景。
14.3.1 按照被测程序是否可见分类
黑盒测试(功能测试):
- 核心特点:把程序看作 “黑盒”,不关心内部结构,仅基于需求规格说明书测试功能;
- 测试角度:用户视角,关注输入输出对应关系;
- 可发现错误:功能错误 / 遗漏、输入输出错误、数据结构 / 外部信息访问错误、初始化 / 终止错误;
- 用例设计方法:等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法等;
- 局限性:无法发现规格说明本身的设计错误。
白盒测试(结构测试):
- 核心特点:清楚程序内部逻辑结构,对所有逻辑路径进行测试;
- 测试角度:开发者视角,关注代码逻辑覆盖;
- 覆盖标准(由弱到强):语句覆盖(每条语句至少执行一次)→判定覆盖(每个分支至少执行一次)→条件覆盖(每个条件取所有可能值)→判定 / 条件覆盖→条件组合覆盖→修改条件判断覆盖;
- 测试方法:代码检查法、静态结构分析法、逻辑覆盖法、基本路径测试法等;
- 适用场景:高可靠性要求的软件(军工、航天、工业控制);
- “三步法”:人工设计基本功能测试用例→统计覆盖率,补充未覆盖用例→自动生成大量用例捕捉特殊错误。
灰盒测试:
- 核心特点:介于黑盒与白盒之间,关注输入输出正确性,同时了解部分内部运行状态;
- 优势:增强黑盒测试的效率和错误分析能力;
- 局限性:比白盒测试难发现潜在问题,依赖部分内部知识。
14.3.2 按照是否需要执行被测程序分类
静态测试:
- 核心特点:不运行程序,仅分析源程序语法、结构、接口或文档;
- 测试内容:代码检查(走查、桌面检查)、静态结构分析、代码质量度量;
- 优势:发现缺陷早、降低返工成本、覆盖重点;
- 局限性:耗时长、技术要求高。
动态测试:
- 核心特点:运行被测程序,检查运行结果与预期的差异;
- 组成部分:构造测试用例→执行程序→分析输出结果;
- 常见类型:单元自动化测试、接口自动化测试、UI 自动化测试。
14.4 软件测试类型
软件测试按 “测试对象” 和 “测试阶段” 分类,覆盖软件全生命周期的质量验证。
14.4.1 按测试对象划分
功能测试:
- 核心目标:验证软件功能是否符合需求规格说明;
- 测试步骤:需求分析→编写测试用例→准备测试数据→执行用例→对比结果→提交报告;
- 特点:数据驱动,不关心内部结构。
性能测试:
- 核心目标:测试系统响应时间、稳定性等性能指标;
- 细分类型:
- 负载测试:系统性能达瓶颈后,继续运行观察指标;
- 压力测试:逐步加压,直到系统性能达瓶颈(如 CPU 占 100%);
- 并发测试:增加并发用户数,测试系统并发处理能力;
- 容量测试:测试系统能承受的极限值(如最大并发用户、数据库记录数);
- 可靠性测试:验证软件满足可靠性要求,发现影响可靠性的缺陷。
安全测试:
- 核心目标:验证软件保护机制,防范非法侵入;
- 测试内容:应用程序本身安全性(漏洞、后门)、数据安全性(存储 / 传输加密);
- 专业要求:需掌握网络协议、防火墙、SQL 注入、跨域攻击等知识。
兼容性测试:
- 核心目标:验证软件在不同环境下的协调工作能力;
- 测试内容:不同操作系统 / 版本、与其他软件、数据共享、向前 / 向后兼容。
易用性测试:
- 核心目标:验证软件是否易操作、易理解、易学习;
- 测试方式:对照 “易用性检查表”,按正常缺陷流程管理。
稳定性测试(耐久性测试):
- 核心目标:验证软件长时间运行的稳定性;
- 测试点:长时间运行、反复开启关闭、长时间执行单一业务后切换、长时间闲置后操作、监控内存占用(是否溢出)。
AI 测试:
- 核心特点:需测试算法健壮性、模型评估、模型安全,应对 AI 系统的不确定性和概率性;
- 测试内容:传统测试(性能、安全)+ 独特测试(算法偏差、模型透明度)。
小程序测试:
- 与 App 测试的区别:获取渠道(微信直接打开 vs 下载安装)、测试周期(更短);
- 测试内容:权限测试、UI 测试、功能测试、兼容性测试(不同屏幕适配)、网络 / 接口测试。
14.4.2 按测试阶段划分
单元测试:
- 测试对象:软件中最小可测试单元(如函数、类、窗口);
- 测试人员:开发人员;
- 测试方法:白盒为主,黑盒为辅;
- 测试内容:模块接口测试、局部数据测试、路径测试。
集成测试(子系统测试 / 组装测试):
- 测试对象:模块间的接口;
- 测试阶段:单元测试之后;
- 测试人员:白盒测试工程师或开发工程师;
- 测试层次:模块内集成、子系统内集成、系统集成;
- 测试内容:模块间数据传输、功能冲突。
系统测试:
- 测试对象:整个系统(软件 + 硬件 + 操作人员);
- 测试阶段:集成测试之后;
- 测试人员:黑盒测试工程师;
- 测试内容:功能、界面、可靠性、易用性、性能(压力、负载测试等);
- 典型类型:恢复测试(验证故障恢复能力)、安全测试、压力测试。
验收测试:
- 测试目标:验证软件是否满足用户原始需求,向用户展示可用性;
- 测试阶段:系统测试通过后;
- 测试人员:最终用户或需求方;
- 测试策略:
- 正式验收测试:管理严格,测试用例为系统测试子集;
- 非正式验收测试:无固定用例,测试内容由测试员决定;
- Beta 测试:用户在实际环境测试,开发者不在现场,管理最少。
14.4.3 其他重要测试类型
回归测试:
- 核心目标:修改旧代码后,验证未引入新错误或影响其他代码;
- 常用策略:再测试全部用例(最安全但成本高)、基于风险选择测试、基于操作剖面选择测试、再测试修改部分;
- 优势:自动化回归测试可大幅降低成本。
冒烟测试:
- 核心目标:验证新编译版本的基本可用性,消除表面错误,减少后期测试负担;
- 测试时机:正式测试前(如单元集成前、集成版本形成后、缺陷修正后);
- 特点:注重通过性,轻细节。
14.5 软件测试的组织
软件测试需有规范的流程和管理,确保测试有序、高效,覆盖所有风险点。
14.5.1 测试过程
- 项目需求分析阶段:明确测试范围、预期结果;
- 制订测试计划阶段:确定测试模块、方法、人员安排、目标;
- 设计测试文档阶段:编写测试用例(核心阶段);
- 搭建测试环境阶段:按产品要求配置硬件、软件环境;
- 执行测试阶段:开展单元、集成、系统、验收、回归测试;
- 缺陷管理阶段:收集、跟踪、沟通缺陷,直至修复。
14.5.2 测试管理
配置管理:
- 核心目标:控制测试活动变更,建立基线,记录跟踪变更请求;
- 关键承诺:责任明确、贯穿全测试过程、覆盖所有测试配置项、建立配置库和基线库。
过程管理:
- 核心内容:测试项目启动(确定负责人、获取文档培训)→测试计划(确定范围、策略、风险)→测试设计(制定技术方案、设计用例)→测试执行(搭建环境、执行用例、缺陷跟踪)→结果审查分析(编写测试报告)。
缺陷管理:
- 缺陷分类:按测试种类(界面类、功能类)、严重程度(严重、一般、次要、建议)、优先级(立即解决、高优先级等)、发生阶段(需求、编码等);
- 管理流程:确定优先级→制定修复计划→修复后同步状态。
风险管理:
- 核心流程:风险识别→风险评估→风险应对(规避、转移、减轻、接受)→风险上报;
- 关键策略:高风险(如版本发布前测试不充分)优先规避,低风险可接受。
14.6 软件部署
软件部署是将开发完成的软件交付给用户使用的最后环节,核心是确保软件正常运行并满足用户需求。
14.6.1 部署目标
- 保障软件系统正常运行和功能实现;
- 简化部署操作,提高执行效率;
- 满足用户在功能和非功能属性上的个性化需求;
- 支持软件长期稳定运行,契合用户核心需求。
14.6.2 部署步骤
- 环境准备:在目标机器上安装软件依赖项、配置网络、搭建运行环境(如操作系统、数据库);
- 软件安装:将软件组件复制到指定位置,配置文件权限、注册表项等;
- 数据库和文件配置:对需数据库 / 文件存储的软件,配置数据库连接、初始化数据、设置文件存储路径。