Несовместимые результаты теста при использовании dotCover - PullRequest
3 голосов
/ 26 января 2012

У меня есть некоторый код с модульными тестами, которые проходят в сборке 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 Ответ

2 голосов
/ 31 января 2012

Я считаю, что основной проблемой здесь является Оптимизация вызовов Tail , где компилятор сворачивает стековые фреймы для повышения производительности. Это происходит только в режиме релиза.

dotCover (как и другие профилировщики .net) отключает некоторые оптимизации CLR, предотвращая скомпрометированные результаты. Было бы трудно сосчитать выполнения методов, если они не выполняются ...

Я не могу сказать вам, если NCover не может преодолеть оптимизацию или решает это по-другому, но я совершенно уверен насчет dotCover.

...