.net 在nUnit中使用Console.Out.WriteLine vs Trace.WriteLine单独运行或在reSharper或TeamCity中运行

.net 在nUnit中使用Console.Out.WriteLine vs Trace.WriteLine单独运行或在reSharper或TeamCity中运行,.net,nunit,resharper,teamcity,trace,.net,Nunit,Resharper,Teamcity,Trace,我模模糊糊地记得读过关于在Console.Out.WriteLine上使用Trace.WriteLine的“某处”,可能是在reSharper或TeamCity的上下文中,但我记不起细节 因此,问题是在nUnit单独运行的情况下,或者在reSharper/TeamCity中,使用其中一个是否有任何好处,如果有区别,您个人会使用什么 目前我的立场是Trace.WriteLine,这不仅是因为我模糊地记得一些我本可以想象出来的东西,而且我觉得单元测试中的跟踪更像是一项诊断任务,而不是一项输出任务。单

我模模糊糊地记得读过关于在Console.Out.WriteLine上使用Trace.WriteLine的“某处”,可能是在reSharper或TeamCity的上下文中,但我记不起细节

因此,问题是在nUnit单独运行的情况下,或者在reSharper/TeamCity中,使用其中一个是否有任何好处,如果有区别,您个人会使用什么


目前我的立场是Trace.WriteLine,这不仅是因为我模糊地记得一些我本可以想象出来的东西,而且我觉得单元测试中的跟踪更像是一项诊断任务,而不是一项输出任务。

单元测试不是生产代码。如果你想,没有理由不能安慰你。如果您想使用Trace,也可以,但是设置起来需要做更多的工作。我不熟悉TeamCity,因此我无法在这方面帮助您。

调试类提供了一组方法和属性,可以帮助您调试代码。如果使用Debug类中的方法打印调试信息并使用断言检查逻辑,则可以使代码更加健壮,而不会影响产品的性能和代码大小。在VisualStudio2005项目中,创建调试生成将启用调试

您可以使用Trace类中的属性和方法对发布版本进行检测。检测允许您监视在真实环境中运行的应用程序的运行状况。跟踪可以帮助您隔离问题并修复它们,而不会干扰正在运行的系统。 在VisualStudio2005项目中,默认情况下,对发布版本和调试版本都启用跟踪,因此会为发布版本和调试版本中的所有跟踪方法生成代码。因此,您可以使用跟踪来检测发布版本

我在这里找到了这段摘录,如果它有帮助的话:

编辑:找到一些更有趣的信息提到使用多播的跟踪,这是否意味着实现它的任何东西都将捕获跟踪写入行

请阅读并给出反馈:


就我个人而言,我不喜欢在单元测试中嵌入跟踪(使用您提到的任何一种方法)。如果单元测试需要这样做,这很可能是单元测试过于复杂的迹象。如果需要通过单元测试跟踪逻辑,那么应该在整个测试过程中使用断言以编程方式检查是否发生了预期的行为,从而消除对文本跟踪输出的需要

然而,你需要务实——有时候这样做很有用。使用这两种方法(或类似于Debug.WriteLine的其他方法)都可以,但使用哪种方法确实给了您一些灵活性

如果您有很多输出跟踪的测试,那么当您在一次运行中运行所有测试时,您可以获得很多跟踪输出。在NUnit中,您可以在“选项”页面中对此进行筛选:

这四个选项执行以下操作:

  • 标准输出:捕获写入控制台的所有输出。错误
  • 错误输出:捕获写入Console.Error的所有输出
  • 跟踪输出:捕获写入跟踪或调试的所有输出
  • 日志输出:捕获写入log4net日志的输出。NUnit捕获错误级别或更高级别的所有输出,除非在测试程序集或项目的配置文件中为
    DefaultLogThreshold
    设置指定了另一个级别
通过关闭这些选项,可以分别禁用发送到四种不同日志记录方法的跟踪输出,从而使您能够过滤测试跟踪

我不知道ReSharper的test runner中有任何类似的设置

还有一件事值得考虑,就是文本输出可能有副作用。我最近遇到NUnit崩溃,因为一些输出包含XML文件中非法的字符-NUnit在我们的自动构建中生成一个字符


编辑

@Bronumski:我能看到的使用一种方法与另一种方法的唯一真正区别是输出的消耗方式

某些工具将拾取
Debug
跟踪(例如DebugView),但不会拾取
Console
输出。此外,您可以通过配置(在app.config中)在运行时禁用
跟踪
输出,但不能禁用
控制台
输出。不过,这只会在你必须用测试跟踪来修饰真实(即不是测试)代码的情况下才有意义——在运行时记录大量文本可能代价高昂,因此如果可以关闭它,那么这是有益的,除非你真的需要它来诊断某些东西


此外,在使用NUnit时,如果您有太多日志记录要处理,您可以有选择地彼此独立地关闭它们。

使用NUnit和reSharper,使用跟踪时不需要额外的工作,侦听器已经设置好。我建议避免这两种情况。单元测试应该是自动的;它们要么通过,要么失败,不需要观察者来确定成功与否。同意,当测试通过时,您不需要查看任何诊断,但您假设测试从未失败。当您做出突破性的更改而测试失败时会发生什么。有些测试需要某种类型的日志记录来查看实际失败的地方,因为断言不是很清楚,特别是在遗留代码或框架中难以测试的区域周围有测试的地方。还有性能测试呢,这些测试可能不是在构建服务器上运行的,而是手动运行的,您希望输出结果。我同意单元测试中的跟踪并不理想,但正如您所承认的,它们有时是遗留代码或框架中不易模仿的区域所必需的。由于答案的质量,我给了a+1,但我不确定是否回答了这个问题。我得出的结论是