单元测试运行的特殊编译器标志

时间:2011-10-24 06:26:21

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

我对测试套件内置的视觉工作室有疑问。 VS工作室是否运行了这些测试并应用了一些特殊的编译器标志?

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

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

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

4 个答案:

答案 0 :(得分:7)

VS使用当前选定的构建配置编译/构建项目。因此,解决方案可能是自己创建单独的构建配置,然后对该特定构建配置中的项目使用常量(例如TEST)。然后可以使用#if TEST指令或[Conditional("TEST")]属性来限制输出方法的执行。您可以配置构建服务器te始终使用该特定构建配置运行测试,因此您将看到其他输出。但是,在从VS

运行测试时,您需要手动在构建配置之间切换

答案 1 :(得分:5)

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

将您的Equals实施更改为

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

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

答案 2 :(得分:-1)

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

也许你应退后一步,意识到你有两套不同的算法来确定对象是否相等。您可以使用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。

答案 3 :(得分:-1)

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

如果您的仅限测试代码正在运行但生产版本已损坏,则您的测试将毫无价值。

相反,您应该以这样的方式编写测试:只有一件事可能错误。这样,如果测试失败,你就已经知道出了什么问题。因此,如果您正在测试考虑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
     }
  }
}