我有一个关于测试套件中构建的视觉工作室的问题。 VS studio是否应用了一些特殊的编译器标志来运行这些测试?单元测试运行的特殊编译器标志
问题描述如下。 我在其中一个类上重载了Equals
函数。 在测试过程中,如果它能给我一些额外的信息,那么这个班级里的哪些成员根本就不相同。
所以我想实现一些消息只有当应用程序在测试模式下运行。
感谢您的回复! 安德烈亚斯
我有一个关于测试套件中构建的视觉工作室的问题。 VS studio是否应用了一些特殊的编译器标志来运行这些测试?单元测试运行的特殊编译器标志
问题描述如下。 我在其中一个类上重载了Equals
函数。 在测试过程中,如果它能给我一些额外的信息,那么这个班级里的哪些成员根本就不相同。
所以我想实现一些消息只有当应用程序在测试模式下运行。
感谢您的回复! 安德烈亚斯
VS编译/构建项目与当前选择的生成配置。因此,一个解决方案可能是自己创建一个单独的构建配置,然后对该特定构建配置中的项目使用常量(例如TEST)。输出方法的执行可以通过#if TEST
指令或[Conditional("TEST")]
属性来限制。您可以配置您的构建服务器,然后使用该特定构建配置运行测试,以便您可以看到更多输出。从VS
创建一个新的解决方案配置“测试”(如果你没有它尚未),并切换到它。打开项目设置,切换到Build选项卡并定义一个新的符号TEST。按OK。
更改您的Equals实施
public override bool Equals (object obj)
{
#if TEST
// Your implementation
#else
return base.Equals (obj);
#endif
}
这将编译一个不同的方法体为您的测试配置。
感谢您的回答。我并不是真的想要在完全不同的实现之间切换,但只是稍微提高输出。 –
你仍然可以调用base.Equals实施,并提供额外的输出需要 –
我不得不说我不喜欢在代码中随处添加条件编译的想法。这使得阅读和调试代码变得更加困难。
也许你应该退后一步,实现你有两套不同的算法来确定对象是否相等。您可以通过使用Strategy Design Pattern来将这些代码从等于方法中排除。
然后在运行时,你可以在你的基类选择Equals方法低谷依赖注入的策略,或者一个简单的功能是这样的:
public override bool Equals (object obj)
{
if (EqualsStrategy != null)
{
return EqualsStrategy.Equals(this,object);
}
else
{
return base.Equals(obj);
}
}
在你的单元测试,你会初始化EqualsStrategy与功能你想用。
我看到这一点,并aggree为主,但我并没有真的想改变'Equals'实施。它只应该给我更多的输出,所以我可以找到更容易的错误原因。 –
我会强烈建议不要在应用程序中插入任何测试仅代码。 (单元)测试的目的是测试软件的生产质量,而不是测试只测试代码。
如果您的测试,只有代码工作找到,但量产版坏了你的测试将是毫无价值的。
取而代之,您应该以这样的方式编写测试:只有一件事可以错误。这样如果测试失败,你已经知道什么是错的。因此,如果您正在测试考虑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”实现。 –
感谢您的回答。我也想过加入一些其它编译器选项,但如果没有一个已经通过测试环境并没有舒尔。 –