【问题标题】:Special compiler flag for unit test runs单元测试运行的特殊编译器标志
【发布时间】:2011-10-24 06:26:20
【问题描述】:

我有一个关于测试套件中内置的视觉工作室的问题。 VS studio 是否在运行这些测试时应用了一些特殊的编译器标志?

问题描述如下。 我在我的一个类上重载了Equals 函数。 在测试运行期间,它会很好,如果它可以给我一些额外的信息,类中的哪些成员根本不相等。

因此,我只想在应用程序在测试模式下运行时实现一些消息。

感谢您的回复! 安德烈亚斯

【问题讨论】:

  • 我认为这是一个非常相关的问题。就我而言,如果在单元测试运行时发生异常,我不想输出日志条目。

标签: c# visual-studio-2010 unit-testing


【解决方案1】:

VS 使用当前选择的构建配置编译/构建项目。因此,一种解决方案可能是自己创建一个单独的构建配置,然后为该特定构建配置中的项目使用一个常量(例如 TEST)。然后可以使用#if TEST 指令或[Conditional("TEST")] 属性来限制输出方法的执行。您可以配置您的构建服务器,始终使用该特定构建配置运行测试,因此您会看到额外的输出。但是,从 VS 运行测试时,您需要手动在构建配置之间切换

【讨论】:

  • 感谢您的回答。我还考虑过添加一些额外的编译器标志,但如果测试环境还没有,我就不知道了。
【解决方案2】:

创建一个新的解决方案配置“测试”(如果您还没有)并切换到它。打开项目设置,切换到 Build 选项卡并定义一个新符号 TEST。按确定。

将您的 Equals 实现更改为

public override bool Equals (object obj)
{
    #if TEST
     // Your implementation
    #else
      return base.Equals (obj);
    #endif
}

这将为您的测试配置编译不同的方法体。

【讨论】:

  • 感谢您的回答。我真的不想在完全不同的实现之间切换,只是稍微增强一下输出。
  • 你仍然可以调用 base.Equals 实现并提供你需要的额外输出
【解决方案3】:

我不得不说我不喜欢在你的代码中到处放置条件编译的想法。它使阅读和调试代码变得更加困难。

也许你应该退后一步,意识到你有两组不同的算法来确定一个对象是否相等。您可以使用Strategy Design Pattern 将此代码从Equals 方法中排除。

然后在运行时,您可以通过依赖注入为 Equals 方法选择策略,或者在您的基类中选择类似这样的简单函数:

public override bool Equals (object obj)
{
    if ( EqualsStrategy != null)
    {
        return EqualsStrategy.Equals(this,object);
    }
    else
    {
       return base.Equals(obj);
    }
}

在您的单元测试中,您将使用要使用的函数初始化 EqualsStrategy。

【讨论】:

  • 我明白这一点并主要同意,但我并不想更改Equals 实现。它只会给我更多的输出,所以我可以更容易地找到错误原因。
【解决方案4】:

我强烈建议不要在您的应用程序中插入任何仅测试代码。 (单元)测试的目的是测试软件的生产质量,而不是执行纯测试代码。

如果您的仅测试代码可以正常工作,但生产版本已损坏,您的测试将毫无价值。

相反,您应该以只有一件事可能出错的方式编写测试。这样,如果测试失败,您就已经知道出了什么问题。因此,如果您正在测试一个考虑 2 个属性的 equals 方法,请编写一组小测试来验证这两个属性的所有可能组合中发生的情况,并验证 Equals 方法的结果。

之后,您可以确信 Equals 方法已正确实现,您无需在其他任何地方进行测试。

另一种解决方案是添加一个执行额外日志记录的测试助手。我喜欢为此使用扩展方法。例如:

public static class TestExtensions
{
  public static void ShouldEqual( this YourType subject, YourType other )
  {
     // Check parameters for null here if needed
     if( !subject.Equals( other ) )
     {
       // custom logging here
       Assert.Fail("Objects are not equal"); // test fails
     }
  }
}

【讨论】:

  • 感谢您的回答。我不想通过单元测试检查Equals 方法,但给我一些更多提示,以在我的代码中的“高级”函数中搜索错误。但我会考虑为我的课程添加一个特殊的 AreEqual 实现。
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多