Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

集成测试与系统测试

复习

  • 单元测试:验证最小功能单元
  • 分解、模块与接口:模块通过接口交流
  • 契约、错误与异常:明确的前提与承诺

TL;DR

  • 集成测试验证多个模块组合后能否协作
  • 系统测试从整体验证端到端流程
  • 问题常出在“结合处”,单元测试抓不到
  • 不同层次的测试各有分工

正文

  单元测试保证了每个模块“自己是对的”。可多个正确的模块放到一起,就一定能正常工作吗?不一定。因为问题常常出在它们交接的地方。

结合处的麻烦

  模块之间通过接口交流。哪怕每个模块都通过了单元测试,它们组合起来仍可能出问题:

  • A 以为传给 B 的是整数,B 却以为是字符串
  • A 在 B 还没准备好时就调用了它
  • 数据在一连串传递中,被某一方悄悄改坏

  这些“结合处”的毛病,单元测试抓不到——因为单元测试时,其他模块还不在场。要抓它们,就需要集成测试(integration testing):把若干模块连起来,验证它们真的能协作。

从整体验证端到端

  再往上,还有系统测试(system testing):不再盯着某些模块,而是把整个软件当作一个黑盒,从用户的角度走一遍完整的流程——输入一个请求,看最终输出对不对。

  它验证的是“端到端”的效果:这一整条路,从入口到出口,通不通、对不对。

不同层次的测试

  把几层测试放在一起看,它们各管一段:

  • 单元测试:这个模块自己对不对
  • 集成测试:几个模块拼起来协不协作
  • 系统测试:整个软件端到端对不对

  这和网络故障诊断里的“分层排查”是一个味道:越往上,范围越大、越接近真实使用,但定位问题也越难。 所以实践中的常见做法是——底层测试写得多、跑得勤,越往上的测试相对越少但更贴近实际。上面出问题时,往往要靠下面的测试来缩小范围。

思考题 1

  为什么要单独做集成测试,而不是只做单元测试?

思考题 2

  单元测试、集成测试、系统测试各关注什么?

小结

知识点

  • 集成测试验证多个模块的协作
  • 结合处的问题单元测试抓不到
  • 系统测试从整体验证端到端流程
  • 各层测试分工不同,越往上范围越大

参考资料

  1. Wikipedia(zh):集成测试:验证多个模块组合后的行为
  2. Wikipedia(zh):系统测试:从整体验证整个系统

思考题答案(仅供参考)

思考题 1

  因为单元测试只验证单个模块自己是否正确,无法覆盖模块之间的配合。接口不匹配、时序、数据传递等问题都发生在“结合处”,只有在模块组合起来之后才会暴露,因此需要专门的集成测试。

思考题 2

  单元测试关注单个模块自己的行为是否正确;集成测试关注多个模块连接后能否正确协作;系统测试则把整个软件当作整体,从用户角度验证端到端流程是否通、结果是否正确。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪