.NET单元测试 - 在发布代码中隐藏测试接缝的最佳实践

STW*_*STW 5 .net unit-testing visual-studio

我正在寻找一些关于单元测试的建议,其方式是不要在生产代码中留下"测试钩子".

假设我有一个名为MethodLogger的静态类(VB.NET模块),它有一个"void WriteEntry(string Message)"方法,用于将调用方法和消息写入磁盘上的日志文件.WriteEntry()的实际目标可以转移到IMethodLogger的伪实现以运行单元测试,对于所有其他情况,它应该调用IMethodLogger的实际实现.

这是我到目前为止所提出的内容的粗略描述,我喜欢这种方法 - 但在一些快速测试中它提出了一些问题和怀疑:

[InternalAttributesVisibleTo("MethodLogger.Tests")]
internal static class MethodLogger
{
    public void WriteEntry(string message)
    {
        LogWriter.WriteEntry(message);
    }

    private IMethodLogger LogWriter
    {
        get;
        set;
    }

#if DEBUG
    internal void SetLogWriter(IMethodLogger logger)
    {
        LogWriter = logger;
    }
#endif
}
Run Code Online (Sandbox Code Playgroud)

这是我的具体问题:

  • 这将单元测试与DEBUG构建的运行紧密结合在一起; 当我运行单元测试时虽然它似乎没有专门重建DEBUG中的测试组件 - 是否可以这样做?

    • 我是否想要针对非调试版本运行单元测试?在我的头顶,我看到的价值较低 - 但会有吗?
  • 我可以使用像"TEST"这样的自定义预编译器标志来代替"DEBUG"吗?我将如何告诉Visual Studio始终使用此标志重建目标进行测试以确保我的钩子/接缝可用?

Jon*_*eet 3

就我个人而言,我不喜欢无法针对实际生产二进制文件运行测试的想法。

您不能将设置器标记为“过时”并禁用测试代码中的过时警告吗?加上合适的文档,这应该可以阻止生产代码意外调用它,但仍然可以对其进行测试。

但是,为了解决您的实际问题:

  • 是的,针对非调试版本运行单元测试是有意义的 - 它使人们更有信心调试和非调试版本之间的更改不会破坏任何内容。
  • 是的,如果需要,您可以使用自己的预处理器符号(例如 TEST);您可以将其应用于现有配置或创建新的构建配置。