跳到主要内容

系统集成调试

系统集成调试为什么出乎意料地困难?​

  • 事实: 软件系统开发过程中出乎意料的困难部分是系统集成测试;
  • 两个需要确认的判断: 系统调试花费的时间会比预料的更长; 需要一种完备系统化和可计划的方法来降低困难程度;

为什么要在所有构件能运行之后才开始集成?​

  • 常见看法: 系统集成调试要求在每个部分都能正常运行之后开始;
  • 对立做法一(合在一起尝试): 认为除了构件单元 bug 还有系统 bug, 越早合拢系统 bug 出现越早;
  • 对立做法二(省测试平台): 用系统各部分相互测试, 避免搭建大量测试辅助平台;
  • 对立做法三(文档化的 bug): 构件缺陷已发现但未修复, 只要测试人员知道后果就可以忽略它们;
  • 作者判断: 两种做法都合理但不完全正确; 使用完好的、经过调试的构件, 能比搭建测试平台和进行全面单元测试节省更多时间;
  • 反对"文档化 bug"的理由: 调试人员并不了解 bug 引起的所有后果; 对记录 bug 的修复本身会注入未知问题, 使后续系统测试令人困惑;

为什么要搭建充分的测试平台?​

  • 定义: 辅助测试平台指供调试使用的所有程序和数据, 它们不会整合到最终产品中;
  • 规模预期: 测试平台可能有相当于测试对象一半的代码量, 这是合乎情理的;
  • 四种形式:
形式用途
伪构件(dummy component)只有接口和伪数据或小测试用例, 让未完成模块的位置可以先被测试
微缩文件(miniature file)只含典型记录但涵盖全部描述的小型文件, 用于验证磁带和磁盘文件格式
伪文件(dummy file)微缩文件的特例, 实际并不常见
辅助程序(auxiliary program)测试数据发生器、特殊打印输出、交叉引用表分析等专用工具

变更控制需要哪些受控拷贝?​

  • 前提: 必须有人负责, 控制和负责各构件单元的变更或版本之间的替换;
  • 三个拷贝:
    • 供构件单元测试使用的最终锁定版本;
    • 测试版本的拷贝, 用来进行缺陷修复;
    • 安全版本, 其他人可以在其上修复和扩展自己的模块和子系统;
  • 类比来源: 对测试期间的严密控制是硬件调试中一项令人印象深刻的技术, 同样适用于软件;

什么是"紫色线束"手法?​

  • 硬件场景: System/360 工程模型中发现 bug 后, 立即设计快速修复电路并安装到系统, 使用紫色电线以示区别;
  • 完整流程: 把更改记录到日志, 准备正式变更文档, 启动设计自动化流程, 最终在电路图和黄色线路中实现设计调整;
  • 软件对应: 对最后成为产品的程序代码, 更需要严密控制和深层次关注;
  • 关键因素: 在一个日志中记录所有变更, 并在源代码中显著标记快速补丁与正式修改的区别;
  • 正式修改的标准: 完备、经过测试、需要文档化;

为什么要一次只添加一个构件?​

  • 诱惑: 添加离散构件需要调试伪程序和其他测试平台, 于是被"可能不需要这些额外工作"的乐观主义和惰性诱导;
  • 反驳: 必须假设系统中存在许多错误, 并计划一个有序的过程把它们找出来;
  • 回归测试要求: 添加新构件后必须用完整的测试用例测试子系统; 原来能在子系统上成功运行的用例必须在现有系统上重新运行;

变更为什么要阶段化?​

  • 现实: 开发者会不断带来更新、更快、更卓越的构件版本, 替换使用中的构件需要和构件添加一样的系统化测试流程;
  • 外部影响: 其他团队把最新集成系统当作调试平台, 测试平台的修改会阻碍他们的工作;
  • 处理方式: 变更必须被阶段化并定期发布, 使每个用户拥有稳定的生产周期, 其中穿插测试平台的改变;
  • 证据(Lehman 和 Belady): 变更阶段要么很大且间隔很宽, 要么小而频繁; 小而频繁的阶段很容易变得不稳定;
  • 作者实践: 决不会在实践中冒险采用小而频繁的策略;
  • 与紫色线束的兼容: 直到下一次定期发布前一直使用快速补丁; 在当前的发布中把已通过测试并文档化的修补整合到系统平台;