Single Statement Unit Tests

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

已经有很多关于单元测试模式和反模式的文章和书籍了。我想再添加一个建议,我相信这可以帮助我们使我们的测试和我们的生产代码更加面向对象。这就是:一个测试方法必须只包含一个单独的assert语句。

看一下来自OpenJDK 8的RandomStreamTest中的这个测试方法,由Brian Goetz创建:

这个方法分为两个部分:算法和断言。算法准备了两个整数数组,而断言则比较这两个数组,如果它们不相等则抛出“AssertionError”。

我认为我们应该尽量避免第一部分,即算法部分。唯一必须要有的是断言。以下是我重新设计这个测试方法的方式:

如果Java有别名,这段代码会看起来更加优雅。

正如你所看到的,在这个方法中只有一个“语句”:assertEquals()

Hamcrest及其assertThat()集合的基本匹配器,是使我们的单语句测试方法更加凝聚和可读的完美工具。

如果我们同意遵循这个原则,将会有许多实际的好处。

  • 简洁性。由于当只有一个assert时,创建一个长的测试方法会变得相当困难,您和其他程序员不可避免地会编写更短、更易读的代码。

  • 易读性。通过一个单独的assert语句,测试方法的意图将始终明显。它将以意图声明开头,而所有其他较低级别的细节将缩进。

  • 不可变性。如果测试方法没有算法代码的位置,那么在生产代码中几乎不可能使用设置器。你将不可避免地创建不可变对象,以便通过单个“assert”进行测试。

当将这个原则应用于我们的测试时,我们获得的最大好处是它们变得声明式和面向对象,而不是算法化、命令式和过程化的。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 14:39

sixnines availability badge   GitHub stars