我对测试套件内置的视觉工作室有疑问。 VS工作室是否运行了这些测试并应用了一些特殊的编译器标志?
问题描述如下。
我在其中一个课程上重载了Equals
函数。
在测试运行期间,它会很好,如果它可以给我一些额外的信息,班级中的成员根本不相同。
因此,我只想在应用程序以测试模式运行时才实现一些消息。
感谢您的回复! 安德烈亚斯
答案 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
}
}
}