Xunit

2006年1月17日

XUnit 是赋予一组测试框架的家族名称,这些框架已在软件开发人员中广为人知。该名称源于 JUnit, 这是第一个广为人知的框架。

这些框架的起源实际上始于 Smalltalk。Kent Beck 是将自动化测试作为软件开发核心的忠实拥护者。为了帮助他和他的客户做到这一点,他构建了一个简单的框架来组织和运行单元测试。重点是让程序员能够使用他们常规的 Smalltalk 环境轻松定义测试,然后快速运行部分或全部测试。Kent 和他的追随者会在每次更改系统后运行单元测试,在 Smalltalk IDE 中进行快速编辑和测试循环。

我当时遇到了 Kent。我自己也做过同样的事情,但 Kent 的框架很好地结合了荒谬的简单性和对我来说恰到好处的功能。基本上,他做得比我好,所以我直接使用了他的。特别是,我们在 C3 上使用了该框架,Ron Jeffries 也被介绍了它。

我说“它”,但这实际上是一个误称。没有一个单一的 kent-beck-smalltalk-unit-testing 框架。Kent 希望人们控制自己的环境,所以他喜欢让每个团队自己构建框架(只需要几个小时),这样他们就会乐于根据自己的特定情况进行更改——本质上,它实际上是一个 种子工作

它在 Smalltalk 社区之外仍然是未知的,所以将 JUnit 的功劳归于它传播了这种想法是公平的。JUnit 诞生于从苏黎世飞往 1997 年亚特兰大 OOPSLA 的航班上。Kent 和 Erich Gamma 在一起飞行,两个极客在长途飞行中还能做什么呢?除了编程?JUnit 的第一个版本是在那里构建的,结对编程,并且是测试先行(一种令人愉快的元循环极客行为)。我听说过它,并要求得到一份副本,这使我成为最早的 alpha 用户之一。我感觉可以自由地更改我不喜欢的东西,并将一些贡献发回给 Kent 和 Erich。如果你想知道谁应该为断言消息是第一个参数而不是遵循将可选参数放在末尾的 Java 惯例负责......

JUnit 还引入了红/绿条进度指示器。在 C3,我们会在一项测试失败时将整个窗口涂成红色,如果所有测试都通过则涂成绿色。当您进行集成时,很容易在中央构建机器上看到窗口。JUnit 将此作为进度条引入,从而为软件开发人员添加了一些新的词汇。

JUnit 像火箭一样腾飞——并且对于支持不断增长的极限编程和测试驱动开发运动至关重要。在过去十年中,我看到了人们对测试的态度发生了巨大变化,我认为 JUnit 在其中发挥了重要作用。它小巧简单,鼓励人们学习和使用它。它还证明了可以被其他人扩展并集成到工具中。(虽然我希望 Sun 只是将整个东西捆绑到 JDK 中。)

随着 JUnit 越来越受欢迎,其他语言也想要一个。我记得 Michael Feathers 为 C++ 编写了 CppUnit,这可能是第一个移植版本。随之而来的是大量移植,几乎每种语言都至少有一个 JUnit 移植版本。我想,它也被“移植”回 Smalltalk 作为真正的框架是不可避免的。

移植版本各不相同。有些是原始 JUnit 的逐行重写,对目标语言几乎没有让步。第一个版本的 NUnit 甚至有一个“isVAforJava”方法,该方法源于对 Visual Age for Java 的特殊处理。其他版本则更加复杂:NUnit 2.0 因在 C# 中使用属性而受到 Anders Heljsberg 的赞扬——这种经验已经回到 Java 社区和 JUnit 本身,因为 Java 开发了注释。