2011-10-24 49 views
3

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

问题描述如下。 我在其中一个类上重载了Equals函数。 在测试过程中,如果它能给我一些额外的信息,那么这个班级里的哪些成员根本就不相同。

所以我想实现一些消息只有当应用程序在测试模式下运行。

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

回答

6

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

运行测试时,您将需要但是手动构建配置间切换
+0

感谢您的回答。我也想过加入一些其它编译器选项,但如果没有一个已经通过测试环境并没有舒尔。 –

4

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

更改您的Equals实施

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

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

+0

感谢您的回答。我并不是真的想要在完全不同的实现之间切换,但只是稍微提高输出。 –

+0

你仍然可以调用base.Equals实施,并提供额外的输出需要 –

0

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

也许你应该退后一步,实现你有两套不同的算法来确定对象是否相等。您可以通过使用Strategy Design Pattern来将这些代码从等于方法中排除。

然后在运行时,你可以在你的基类选择Equals方法低谷依赖注入的策略,或者一个简单的功能是这样的:

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

在你的单元测试,你会初始化EqualsStrategy与功能你想用。

+0

我看到这一点,并aggree为主,但我并没有真的想改变'Equals'实施。它只应该给我更多的输出,所以我可以找到更容易的错误原因。 –

0

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

如果您的测试,只有代码工作找到,但量产版坏了你的测试将是毫无价值的。

取而代之,您应该以这样的方式编写测试:只有一件事可以错误。这样如果测试失败,你已经知道什么是错的。因此,如果您正在测试考虑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 
    } 
    } 
} 
+0

感谢您的回答。我不想通过单元测试来检查'Equals'方法,但给我一些暗示默勒在我的代码搜索的“更高”的功能错误。但我会考虑为我的类添加一个特殊的“AreEqual”实现。 –