表征测试

在计算机编程中，表征测试（也称为黄金大师测试）是一种描述（表征）现有软件的实际行为，从而通过自动测试来保护遗留代码的现有行为不被意外更改的手段。这个名词由迈克尔·费瑟斯（Michael Feathers）首创。

概览 
表征测试的目的是帮助开发人员验证对软件系统的参考版本所做的修改没有以不想要或不希望的方式修改其行为。它们为没有足够的单元测试的代码扩展和重构提供了安全网。

在吉米·巴赫和迈克尔·博尔顿（Michael Boltons）对测试先知的分类中， 这种测试对应于历史先知。与通常的基于断言的软件测试方法相反，测试的结果不是由单个值或属性（由断言检查）决定的，而是由被测试的软件过程的复杂结果作为一个整体与该软件的早期版本中相同过程的结果进行比较来确定的。从某种意义上讲，表征测试会颠覆传统测试：传统测试会检查单个属性（将它们列入白名单），而表征测试会检查所有未删除的属性（列入黑名单）。

创建表征测试时，必须观察给定一组输入会发生什么输出。假定观察到遗存代码基于给定输入给出了特定的输出，则可以编写一个测试，断言遗存代码的输出与给定输入的观察结果相匹配。例如，如果观察到 f(3.14) == 42，则可以将其创建为一个表征测试。然后，在对系统进行修改之后，如果给出相同的输入，测试可以确定修改是否会导致结果变化。

不幸的是，与任何测试一样，通常不可能为每个可能的输入和输出创建特征测试。因此，许多人选择声明或分支覆盖。但是，即使这样也可能很困难。测试编写者必须使用他们的判断来决定多少测试是合适的。通常情况下，编写只涵盖已知发生的特定输入和输出的表征测试就足够了，要特别注意边界情况。

与非常相似的回归测试不同，表征测试不会验证代码的正确行为，这是无法确定的。相反，他们验证在编写时观察到的行为。通常没有规范或测试套件可用，仅保留表征测试作为选项，因为保守的做法是假定旧的行为是必需的行为。表征测试本质上是变化检测器。它依赖于分析结果的人来确定所检测到的变化是预期的和/或理想的，还是意外的和/或不理想的。

表征测试有趣的一个地方是，由于它们基于现有代码，因此可以自动生成一些表征测试。自动化的表征测试工具将使用具有大量的相关的和/或随机输入值来执行现有代码，记录输出值（或状态变化）并生成一组表征测试。当生成的测试针对新版本的代码执行时，如果该版本代码的修改以某种方式改变了先前建立的行为，则它们将产生一个或多个失败或警告。

在GUI级别上进行测试时，可以将表征测试与智能猴子测试结合使用，以创建复杂的测试，捕获用例及其中的特殊情况。

优点 
与基于断言的传统软件测试相比，表征测试具有以下优点：

 对于复杂的遗存系统来说，实现起来相对容易。
 就可以进行重构了。
 通常，对于诸如PDF、XML、图像等复杂结果，这通常是一种明智的做法，在这些结果中，用断言检查所有相关的属性，会由于属性的数量而无法实现，并导致测试代码不可读/不可维护。

缺点 
与基于断言的传统软件测试相比，表征测试具有以下缺点：

 它基于可重复性。无论是表征还是过程结果，都需要掩盖/删除易变和不确定的值。如果需要删除太多元素或删除元素太复杂，则可能会使表征测试无法实施。
 它不仅取决于软件的可重复性，还取决于环境和输入值的稳定性。
 表征测试不能推断结果的正确性。它仅有助于检测软件更改的有害影响。

参考文献

外部链接 

 表征测试
 使用表征测试高效地工作  基于博客的特征测试教程系列。
 “无所畏惧地修改代码 DDJ的特征测试文章。
软件测试