《系统分析师教程(第2版)》笔记——第 14 章 软件实现与测试

《系统分析师教程(第2版)》笔记——第 14 章 软件实现与测试

第 14 章 软件实现与测试

【版权声明与学习说明】
本文系笔者学习《系统分析师教程(第2版)》第14章后,结合个人理解整理的原创学习笔记。文中所有表格、通俗化举例及箭头式总结,均为本人消化后重新归纳表述,不代表原书官方立场。
整理初衷仅为交流学习、备考记录,无意侵犯原作者版权。若您认为存在不当引用,请通过CSDN私信联系,我会第一时间处理。
推荐备考的朋友购买正版教材,尊重知识成果。

软件实现是将设计方案转化为可运行程序的落地阶段,核心是程序设计与编码;软件测试则是贯穿全生命周期的质量保障环节,目的是尽早发现并修复缺陷。本章围绕 “软件实现(怎么编)” 和 “软件测试(怎么查)” 两大核心展开,从实现方法、编码规范,到测试概念、方法、类型、组织管理,再到最终的软件部署,形成完整的 “开发 - 验证 - 交付” 闭环,是确保软件功能达标、质量可靠的关键指南。

14.1 软件实现概述

软件实现的核心任务是程序设计,即将软件设计结果翻译成程序代码,关键在于选择合适的方法、语言和规范,提升代码的可靠性、可维护性和可复用性。

14.1.1 程序设计方法

主流程序设计方法有三种,适配不同开发场景:

  1. 结构化程序设计:

    • 核心思想:自顶向下、逐步求精,使用单入口、单出口的控制结构;
    • 基本控制结构:顺序结构、IF-THEN-ELSE 选择结构、DO-WHILE 循环结构(经典结构化),可扩展 DO-CASE 多分支、DO-UNTIL 循环,或补充 LEAVE/BREAK 结构(修正结构化);
    • 优势:程序结构清晰,静态结构与动态执行一致,可读性强。
  2. 面向对象程序设计(OOP):

    • 核心思想:问题域中有什么事物,程序中就有什么对象,事物间的关系对应对象间的关系;
    • 核心机制:支持类、对象、继承、多态、消息通信;
    • 优势:显著提升软件可靠性、可维护性和可复用性,是 “OOA-OOD-OOP” 软件工程流程的最终落地环节。
  3. 可视化程序设计(VP):

    • 核心思想:像 “搭积木” 一样,用工具提供的控件构造应用界面,少写或不写代码;
    • 核心概念:表单(程序窗口)、部件(按钮、复选框等构件)、属性(部件的显示 / 状态特征)、事件(对部件的操作,如点击)、方法(事件触发后的响应程序);
    • 优势:极大提高开发效率,常用工具如 Eclipse、Visual Studio。

14.1.2 程序设计语言与风格

  1. 程序语言的选择:

    • 选择原则:优先选能减少测试量、易读易维护的语言,同时考虑用户要求、软件工具、工程规模、程序员知识、可移植性、应用领域等限制。
  2. 程序设计风格:

    • 核心目标:提升可理解性、可复用性、可扩展性、健壮性;
    • 关键要点:
      • 可理解性:有意义的标识符、详细注解、清晰的视觉组织、规范的数据说明;
      • 可复用性:高内聚、小规模功能、一致的接口、分离接口与实现、避免全局变量;
      • 可扩展性:封装实现策略、利用多态、避免多分支语句;
      • 健壮性:预防用户误操作、检查参数合法性、先测试后优化。

14.1.3 编码规范

编码规范是团队协作和长期维护的基础,核心涵盖四方面:

  1. 命名规范:标识符(变量、函数、类名)命名统一、有意义;
  2. 注释原则:详细但不冗余,说明代码意图而非实现细节;
  3. 编程风格规则:代码格式化(缩进、换行)、语句构造简洁;
  4. 版本管理规则:代码提交、分支管理、冲突解决的统一流程;
  5. 其他规范:函数长度限制、错误处理统一、冗余代码清理、通用开发模式遵循。

14.1.4 代码生成

针对重复性高、有固定规律的代码(如用户认证、权限管理),用代码生成器自动生成,减少重复劳动:

  1. 实现步骤:准备模板文件→准备关键数据→定义数据置换占位符的合成机制→遍历数据和模板→生成代码文件。

14.1.5 代码重用

代码重用是提高开发效率的关键,需基于高质量代码(无错、不复杂),常用方法:

  1. 使用函数:抽象重复逻辑为函数,多处调用;
  2. 使用对象 / 类:封装复杂代码为对象或类,通过继承、多态实现高度复用;
  3. 使用模块:抽象代码为独立模块,调用即可实现功能;
  4. 利用算法:解构和分解组合算法,减少重用损耗。

14.2 软件测试概述

软件测试是保障软件质量的核心手段,目的是在软件投入运行前,尽可能发现潜在错误和缺陷,避免后期损失。

14.2.1 软件测试的概念

  • 常见误解:测试是证明软件无错、验证软件做了该做的事;
  • 正确定义:通过手动或自动方式运行 / 测量软件,检验是否满足需求,找出预期与实际结果的差异,核心是 “找错” 而非 “证对”;
  • 发展趋势:测试前移(覆盖需求、设计阶段)、多角色协作、测试职业受重视、独立测试部门成为共识、测试外包全球化。

14.2.2 软件测试的基本问题

核心是验证功能实现与可用性,检查程序错误,最终提高用户体验,降低商业风险,同时度量软件质量,为用户接收软件提供依据。

14.2.3 软件测试的对象及目的

  1. 测试对象:源程序 / 目标代码、各阶段文档(需求规格说明、设计文档等)、配置数据;

  2. 测试目的:

    • 用户视角:发现隐藏错误,判断是否接受产品;
    • 开发者视角:验证软件实现所有需求,证明产品无错;
    • 测试人员视角:发现并预测错误,评估软件可靠性。

14.2.4 软件测试的原则

  1. 测试用例必须包含预期输出;
  2. 程序员避免测试自己的程序(思维定式难发现错误);
  3. 编写软件的组织不测试自己的软件(缺乏客观性);
  4. 耐心检查每一个测试结果;
  5. 测试用例覆盖有效输入和无效 / 意外输入;
  6. 避免重复设计测试用例(保留并复用);
  7. 不默认程序无错;
  8. 不进行穷举测试(成本过高),追求最大覆盖率;
  9. 测试尽早执行,贯穿全生命周期;
  10. 测试追溯到需求。

14.3 软件测试方法

软件测试方法按 “被测程序是否可见” 和 “是否执行程序” 分为两大类,各有适用场景。

14.3.1 按照被测程序是否可见分类

  1. 黑盒测试(功能测试):

    • 核心特点:把程序看作 “黑盒”,不关心内部结构,仅基于需求规格说明书测试功能;
    • 测试角度:用户视角,关注输入输出对应关系;
    • 可发现错误:功能错误 / 遗漏、输入输出错误、数据结构 / 外部信息访问错误、初始化 / 终止错误;
    • 用例设计方法:等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法等;
    • 局限性:无法发现规格说明本身的设计错误。
  2. 白盒测试(结构测试):

    • 核心特点:清楚程序内部逻辑结构,对所有逻辑路径进行测试;
    • 测试角度:开发者视角,关注代码逻辑覆盖;
    • 覆盖标准(由弱到强):语句覆盖(每条语句至少执行一次)→判定覆盖(每个分支至少执行一次)→条件覆盖(每个条件取所有可能值)→判定 / 条件覆盖→条件组合覆盖→修改条件判断覆盖;
    • 测试方法:代码检查法、静态结构分析法、逻辑覆盖法、基本路径测试法等;
    • 适用场景:高可靠性要求的软件(军工、航天、工业控制);
    • “三步法”:人工设计基本功能测试用例→统计覆盖率,补充未覆盖用例→自动生成大量用例捕捉特殊错误。
  3. 灰盒测试:

    • 核心特点:介于黑盒与白盒之间,关注输入输出正确性,同时了解部分内部运行状态;
    • 优势:增强黑盒测试的效率和错误分析能力;
    • 局限性:比白盒测试难发现潜在问题,依赖部分内部知识。

14.3.2 按照是否需要执行被测程序分类

  1. 静态测试:

    • 核心特点:不运行程序,仅分析源程序语法、结构、接口或文档;
    • 测试内容:代码检查(走查、桌面检查)、静态结构分析、代码质量度量;
    • 优势:发现缺陷早、降低返工成本、覆盖重点;
    • 局限性:耗时长、技术要求高。
  2. 动态测试:

    • 核心特点:运行被测程序,检查运行结果与预期的差异;
    • 组成部分:构造测试用例→执行程序→分析输出结果;
    • 常见类型:单元自动化测试、接口自动化测试、UI 自动化测试。

14.4 软件测试类型

软件测试按 “测试对象” 和 “测试阶段” 分类,覆盖软件全生命周期的质量验证。

14.4.1 按测试对象划分

  1. 功能测试:

    • 核心目标:验证软件功能是否符合需求规格说明;
    • 测试步骤:需求分析→编写测试用例→准备测试数据→执行用例→对比结果→提交报告;
    • 特点:数据驱动,不关心内部结构。
  2. 性能测试:

    • 核心目标:测试系统响应时间、稳定性等性能指标;
    • 细分类型:
      • 负载测试:系统性能达瓶颈后,继续运行观察指标;
      • 压力测试:逐步加压,直到系统性能达瓶颈(如 CPU 占 100%);
      • 并发测试:增加并发用户数,测试系统并发处理能力;
      • 容量测试:测试系统能承受的极限值(如最大并发用户、数据库记录数);
      • 可靠性测试:验证软件满足可靠性要求,发现影响可靠性的缺陷。
  3. 安全测试:

    • 核心目标:验证软件保护机制,防范非法侵入;
    • 测试内容:应用程序本身安全性(漏洞、后门)、数据安全性(存储 / 传输加密);
    • 专业要求:需掌握网络协议、防火墙、SQL 注入、跨域攻击等知识。
  4. 兼容性测试:

    • 核心目标:验证软件在不同环境下的协调工作能力;
    • 测试内容:不同操作系统 / 版本、与其他软件、数据共享、向前 / 向后兼容。
  5. 易用性测试:

    • 核心目标:验证软件是否易操作、易理解、易学习;
    • 测试方式:对照 “易用性检查表”,按正常缺陷流程管理。
  6. 稳定性测试(耐久性测试):

    • 核心目标:验证软件长时间运行的稳定性;
    • 测试点:长时间运行、反复开启关闭、长时间执行单一业务后切换、长时间闲置后操作、监控内存占用(是否溢出)。
  7. AI 测试:

    • 核心特点:需测试算法健壮性、模型评估、模型安全,应对 AI 系统的不确定性和概率性;
    • 测试内容:传统测试(性能、安全)+ 独特测试(算法偏差、模型透明度)。
  8. 小程序测试:

    • 与 App 测试的区别:获取渠道(微信直接打开 vs 下载安装)、测试周期(更短);
    • 测试内容:权限测试、UI 测试、功能测试、兼容性测试(不同屏幕适配)、网络 / 接口测试。

14.4.2 按测试阶段划分

  1. 单元测试:

    • 测试对象:软件中最小可测试单元(如函数、类、窗口);
    • 测试人员:开发人员;
    • 测试方法:白盒为主,黑盒为辅;
    • 测试内容:模块接口测试、局部数据测试、路径测试。
  2. 集成测试(子系统测试 / 组装测试):

    • 测试对象:模块间的接口;
    • 测试阶段:单元测试之后;
    • 测试人员:白盒测试工程师或开发工程师;
    • 测试层次:模块内集成、子系统内集成、系统集成;
    • 测试内容:模块间数据传输、功能冲突。
  3. 系统测试:

    • 测试对象:整个系统(软件 + 硬件 + 操作人员);
    • 测试阶段:集成测试之后;
    • 测试人员:黑盒测试工程师;
    • 测试内容:功能、界面、可靠性、易用性、性能(压力、负载测试等);
    • 典型类型:恢复测试(验证故障恢复能力)、安全测试、压力测试。
  4. 验收测试:

    • 测试目标:验证软件是否满足用户原始需求,向用户展示可用性;
    • 测试阶段:系统测试通过后;
    • 测试人员:最终用户或需求方;
    • 测试策略:
      • 正式验收测试:管理严格,测试用例为系统测试子集;
      • 非正式验收测试:无固定用例,测试内容由测试员决定;
      • Beta 测试:用户在实际环境测试,开发者不在现场,管理最少。

14.4.3 其他重要测试类型

  1. 回归测试:

    • 核心目标:修改旧代码后,验证未引入新错误或影响其他代码;
    • 常用策略:再测试全部用例(最安全但成本高)、基于风险选择测试、基于操作剖面选择测试、再测试修改部分;
    • 优势:自动化回归测试可大幅降低成本。
  2. 冒烟测试:

    • 核心目标:验证新编译版本的基本可用性,消除表面错误,减少后期测试负担;
    • 测试时机:正式测试前(如单元集成前、集成版本形成后、缺陷修正后);
    • 特点:注重通过性,轻细节。

14.5 软件测试的组织

软件测试需有规范的流程和管理,确保测试有序、高效,覆盖所有风险点。

14.5.1 测试过程

  1. 项目需求分析阶段:明确测试范围、预期结果;
  2. 制订测试计划阶段:确定测试模块、方法、人员安排、目标;
  3. 设计测试文档阶段:编写测试用例(核心阶段);
  4. 搭建测试环境阶段:按产品要求配置硬件、软件环境;
  5. 执行测试阶段:开展单元、集成、系统、验收、回归测试;
  6. 缺陷管理阶段:收集、跟踪、沟通缺陷,直至修复。

14.5.2 测试管理

  1. 配置管理:

    • 核心目标:控制测试活动变更,建立基线,记录跟踪变更请求;
    • 关键承诺:责任明确、贯穿全测试过程、覆盖所有测试配置项、建立配置库和基线库。
  2. 过程管理:

    • 核心内容:测试项目启动(确定负责人、获取文档培训)→测试计划(确定范围、策略、风险)→测试设计(制定技术方案、设计用例)→测试执行(搭建环境、执行用例、缺陷跟踪)→结果审查分析(编写测试报告)。
  3. 缺陷管理:

    • 缺陷分类:按测试种类(界面类、功能类)、严重程度(严重、一般、次要、建议)、优先级(立即解决、高优先级等)、发生阶段(需求、编码等);
    • 管理流程:确定优先级→制定修复计划→修复后同步状态。
  4. 风险管理:

    • 核心流程:风险识别→风险评估→风险应对(规避、转移、减轻、接受)→风险上报;
    • 关键策略:高风险(如版本发布前测试不充分)优先规避,低风险可接受。

14.6 软件部署

软件部署是将开发完成的软件交付给用户使用的最后环节,核心是确保软件正常运行并满足用户需求。

14.6.1 部署目标

  1. 保障软件系统正常运行和功能实现;
  2. 简化部署操作,提高执行效率;
  3. 满足用户在功能和非功能属性上的个性化需求;
  4. 支持软件长期稳定运行,契合用户核心需求。

14.6.2 部署步骤

  1. 环境准备:在目标机器上安装软件依赖项、配置网络、搭建运行环境(如操作系统、数据库);
  2. 软件安装:将软件组件复制到指定位置,配置文件权限、注册表项等;
  3. 数据库和文件配置:对需数据库 / 文件存储的软件,配置数据库连接、初始化数据、设置文件存储路径。