本文改编自Google的“Testing on the Toilet”(TotT,意为“马桶上的测试”)系列中的一集。你可以下载此TotT集的打印友好版本,并将其张贴在你的办公室。
测试金字塔是指导测试套件演变的经典启发式方法。它传达了一个简单的信息——宁愿多做单元测试,少做集成测试;宁愿多做集成测试,少做端到端测试。
尽管测试金字塔很有用,但随着测试方案的范围扩大以及在面临艰难的权衡取舍时,它缺乏你所需的详细信息。为了扩展你的测试方案,那么,我们需要超越“测试金字塔”。
SMURF(以下单词的首字母)是帮助理解在平衡测试方案时需要考虑的权衡取舍的一种简便方法:
- 速度(Speed): 单元测试比其他类型的测试更快,并且可以更频繁地运行——你会更快地发现代码问题。
- 可维护性(Maintainability): 调试和维护所有类型测试的总成本会迅速增加。较大的被测系统拥有更多的代码,因此更容易受到依赖关系变更和需求变更的影响,而这些又会带来更多的维护工作。
- 利用率(Utilization): 使用较少资源(内存、磁盘、CPU)的测试运行成本更低。一个优秀的测试套件会优化资源利用率,使其不会随着测试数量的增加而超线性增长。单元测试通常具有更好的利用率特性,这往往是因为它们使用Mock测试或仅涉及系统的有限部分。
- 可靠性(Reliability): 可靠性测试只有在发现实际问题时才会失败。对不可靠的测试进行问题排查会浪费开发人员的时间,并因为重新运行测试而消耗更多资源。随着系统及其相应测试规模的扩大,非确定性(即不可靠性)会悄然出现,测试套件更容易变得不可靠和不可信。
- 保真度(Fidelity): 高保真测试更接近真实操作条件(例如,真实的数据库或流量负载),并能更好地预测生产系统的行为。集成测试和端到端测试能更好地反映现实条件,而单元测试需要模拟环境,这可能导致测试预期与现实之间出现偏差。
说明:测试类型与测试属性(即SMURF)的雷达图。离中心越远表示越好。
在许多情况下,SMURF(速度、可维护性、利用率、可靠性、保真度)各个维度之间的关系是相互矛盾的:提高一个维度可能会影响其他维度。然而,如果你能在不损害其他维度的情况下提高测试的一个或多个维度,那么你就应该这样去尝试。在考虑你的测试类型(单元测试、集成测试、端到端测试)时,你的选择或取舍会对你的测试方案的成本及其提供的价值产生重要影响。