《架构整洁之道》之测试边界

一、测试也是一种系统组件

测试组件通常是一个系统中最独立的组件。系统的正常运行并不需要用到测试组件,用户也不依赖于测试组件。测试组件的存在是为了支持开发过程,而不是运行过程。然而,测试组件仍然是系统中不可或缺的一个组件。事实上,测试组件在许多方面都反映了系统中其他组件所应遵循的设计模式。

二、可测试性设计

由于测试代码的独立性,以及往往不会被部署到生产环境的特点,开发者常常会在系统设计中忽视测试的重要性,这种做法极为错误的。测试如果没有被集成到系统设计中,往往是非常脆弱的,这种脆弱性会使得系统变得死板,非常难以更改。

可测试性的关键,在于如何解耦合(弱耦合性)。

三、测试专用API

设计这样一个系统的方法之一就是专门为验证业务逻辑的测试创建一个API。
这个API应该被授予超级用户权限,允许测试代码可以忽视安全限制,绕过那些成本高昂的资源(例如数据库),强制将系统设置到某种可测试的状态中。总而言之,该API应该成为用户界面所用到的交互器与接口适配器的一个超集。

核心为:测试程序与应用程序的代码结构分开。

1.结构性耦合

结构性耦合是测试代码所具有的耦合关系中最强大、最阴险的一种形式。假设我们现在有一组测试套件,它针对每个产品类都有一个对应的测试类,每个产品函数都有一个对应的测试函数。显然,该测试套件与应用程序在结构上是紧耦合的。

2.安全性

超级权限的测试专用API不能部署到真正的产品系统中,因为那样是非常危险的。因此通常我们将测试专用API及其对应的具体实现放置在一个单独的、可独立部署的组件中。

四、小结

测试并不是独立于整个系统之外,恰恰相反,它们是系统的一个重要组成部分。我们需要精心设计这些测试,才能让它们发挥验证系统稳定性和预防问题复发的作用。没有按系统组成部分来设计的测试代码,往往是非常脆弱且难以维护的。

文章目录
  1. 一、测试也是一种系统组件
  2. 二、可测试性设计
  3. 三、测试专用API
    1. 1.结构性耦合
    2. 2.安全性
  4. 四、小结