测试金字塔 (Test Pyramid)是一套使用单元测试,集成测试和端到端测试来构建自动化测试体系的方法。
如下图所示,在金字塔的最下方是单元测试,中段是集成测试,最上方是端到端测试。单元测试实现的成本最低,运行速度最快,是毫秒级的。集成测试的实现成本比单元测试高,因为要跟外部系统连接,所以运行速度比单元测试要慢1-2各个数量级。端到端测试最符合用户的完整体验,从 UI 开始通过 API 直达系统内部代码,因为涉及的环节更多,所以实现成本更高,运行速度比集成测试更慢。
测试金字塔理论推荐单元测试应该是数量最多,覆盖范围最大的测试种类。道理很简单,单元测试成本低,运行速度快,在发现问题的时候解决问题也最快。集成测试数量次之,最后才是昂贵的端到端测试。由于端到端测试经过的环节更多,所以通过端到端测试发现的问题,解决起来用时更多。
单元测试
单元测试是一种由开发者实现的白盒测试。在测试金字塔里,单元测试是自动化测试体系的基础。一般使用代码覆盖率来评价单元测试是否达到了测试的要求,但是在实践中开发团队往往发现很难达到指定的代码覆盖率。开发工程师写的单元测试和测试工程师编写的测试用例也很难匹配,跟产品经理的业务描述差得更远。
这里的一个重要原因是许多开发者把程序简单地理解为增删改查(CRUD),而没有围绕业务逻辑来编写代码。对外部服务没有构建“以我为中心”的模型,编写代码的时候直接使用要依赖服务定义的模型,这样在编写单元测试时就会因为模拟某些服务难度太高不得不放弃,只能使用集成测试来验证代码的正确性。
我们可以借鉴《领域驱动设计》里的分层架构,以及六边形架构来构建抽象的领域模型,并且使用单元测试来验证模型实现了产品经理的业务描述。这样我们就可以使用面向对象知识围绕业务构建领域层,把外界服务看做各种连接到模型的“端口”。在编写单元测试时,就不会遇到无法模拟其他服务的问题。
总结一下,我们的单元测试应该构建