单元测试应该使用日志记录吗?

18

在这个话题上似乎有两种趋势:

  1. 一些答案(例如这个)建议单元测试不应记录任何内容。
  2. 一些问题和答案(例如这个)建议在单元测试中使用不同的日志记录技术和格式。

单元测试是否应该记录其执行过程?这些额外的信息能否帮助单元测试报告呈现?或者说只要没有失败,单元测试是否应该保持静默?

我的问题针对Java单元测试,但来自其他语言的程序员的意见也可能很有趣。

7个回答

7
这显然有点主观,但我不明白为什么你要在单元测试中禁用日志记录。
我认为你误解了第一个链接的帖子; 发帖人并没有声称您不应记录任何内容,他是说通过/失败不应该只存在于日志中。 它应该返回到测试框架。 它应该是与正常日志完全分开的数据片段。
我同意他的观点。
除此之外,您仍然可以拥有正常的日志记录。 您在正在测试的类中已经拥有它(或应该拥有)。 当测试失败时,您可能会在日志中看到一些有助于更快地调试它的内容。 我不明白这可能会是一个负面因素。

1
此外,在您的断言中不要忘记添加注释。例如,如果您使用Junit,则assertEquals(a,b)比assertEquals(“值a和b不正确,bla bla”,a,b)更糟糕。当测试失败时,这将为测试框架报告/日志增加更多价值。 - Illarion Kovalchuk

7

单元测试应该非常简单和专注,一个测试失败已经记录了出错的原因。你不需要阅读日志来找到这个错误。

然而,记录大量自动化测试套件的总体结果是一个好主意,这样你就不必遍历所有测试来找到失败的测试。在最后看到一个摘要是很好的,你可以专注于它。


6

在单元测试期间,我使用了安静和详细的日志记录。个人而言,我更喜欢每个测试输出一行内容,包括测试名称和测试结果。这样我可以更清楚地了解正在发生的事情,尽管我不能说这对我的工作有任何实际影响。

如果您从控制台运行,则带有颜色的输出会更好看。


完全可以将结果记录到一个流中,而将通常的日志项目记录到另一个流中。 - Joeri Hendrickx
你为什么需要日志记录来告诉你测试名称和测试结果呢?测试框架(以及希望你使用的IDE)已经为你做了这个。 - Michel Jung
@MichelJung: 我喜欢它用于CI和cli,不仅仅是IDE。我从Java看到的大部分内容都是以一种方式过载输出,只是在集成测试中使日志混乱。这也是一个风格,可以很好地跨越许多语言,不考虑平台,IDE,CI,cli等等。谷歌的C++单元测试模块就是一个很好的例子。 - Jonas Byström

2

我认为在单元测试中不应该记录日志,只需要进行断言。主要原因是记录日志会隐藏重要信息,这些信息只有作者才能在日志中看到。以下是我关于此问题的博客文章:Logging in Unit Tests, a Bad Practice


1
通常在编写测试时,你首先学到的一件事是单元测试不应该连接到任何东西 - 数据库、文件系统、互联网。一个单元测试应该非常快速,并且不受你所在环境的影响。如果它连接到某些东西,那么它就是集成测试。 我认为使用可能会显著降低单元测试速度的日志框架违背了单元测试的理念。整个想法是你可以根据自己的意愿运行数千、数万个测试。理想情况下,你的单元测试套件应该插入到你的保存按钮中(实际上并不太可行,但你明白我的意思)。

0
如果日志框架不能让你启用/禁用日志,那么它就没什么用处。因此,请随意添加日志,但请确保您可以将其与其他内容分开启用/禁用。

0

测试具有断言。如果断言中缺少某些内容,请添加更多的断言。日志用于事后调查错误。但是当您进行单元测试时,您拥有自动搜索错误的所有权力。

如果您想查看日志,则意味着您没有足够的测试用例和检查。请添加它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接