使用dotCover时测试结果不一致

时间:2012-01-26 11:00:01

标签: .net unit-testing nunit continuous-integration teamcity

我有一些单元测试的代码在Debug构建中传递但在Release构建中失败是正确的。但是,当使用JetBrains dotCover运行时,相同的测试在调试和释放模式下都会通过。

为了给出一些背景信息,这里有一个令人讨厌的测试代码,只是为了让您了解它为什么失败进行发布版本 - 这主要是因为代码优化导致的堆栈信息减少。

using System.Diagnostics;
using NUnit.Framework;

namespace DotCoverTest
{
    [TestFixture]
    public class TestLogger
    {
        [Test]
        public void GetCurrentClassLoggerReturnsLoggerWithOwningTypeName()
        {
            Assert.AreEqual(Logger.GetCurrentClassLogger(), GetType().Name);
        }
    }

    public class Logger
    {
        public static string GetCurrentClassLogger()
        {
            return new StackFrame(1, false).GetMethod().DeclaringType.Name;
        }
    }
}

编辑: 任何想法如何设置我的构建,以便我得到相同的测试结果,有或没有覆盖工具?

注意:这个问题最初发布时认为它与TeamCity存在问题,但事实并非如此。

1 个答案:

答案 0 :(得分:2)

我认为这里的主要问题是Tail call optimization,编译器会折叠堆栈帧以提高性能。这仅在发布模式下发生。

dotCover(与其他.net配置文件一样)禁用了一些CLR的优化,防止了泄露结果 - 如果方法执行不执行就很难计算...

我无法告诉你NCover是否未能克服优化,或以其他方式解决这个问题,但我对dotCover非常肯定。