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

本文关键字:编译器 标志 单元 测试运行 用于 | 更新日期: 2023-09-27 18:12:16

我有一个关于测试套件中构建的视觉工作室的问题。VS工作室运行这些测试与一些特殊的编译器标志应用?

问题描述如下。我在一个类上重载了Equals函数。在测试运行期间,如果它能给我一些额外的信息,类中的哪些成员是不相等的,那就太好了。

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

谢谢你的回复!Andreas

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

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

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

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

将Equals的实现更改为

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

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

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

也许你应该退后一步,意识到你有两套不同的算法来确定一个对象是否相等。您可以通过使用策略设计模式将这些代码从Equals方法中提取出来。

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

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

在你的单元测试中,你可以用你想要使用的函数初始化EqualsStrategy

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

如果你的测试代码是工作的,但生产版本是坏的,你的测试将是毫无价值的。

相反,您应该以这样一种方式编写测试,即只有一件事可能是错误的。这样,如果测试失败,你就知道哪里出了问题。所以,如果你在测试一个考虑两个属性的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
     }
  }
}