Как выполнить модульный тест только в режиме отладки? - PullRequest
12 голосов
/ 30 октября 2009

У меня есть модульный тест, который проверяет, является ли исключение броском, но это исключение выбрасывается только в режиме отладки (через атрибут [Conditional ("DEBUG")]). Если я запускаю этот тест в режиме выпуска, он не проходит. Я пытался применить тот же атрибут в тесте, но он не учитывается.

Как я могу исключить тест в режиме выпуска? Имеет ли смысл даже запускать модульные тесты в режиме выпуска или мне следует придерживаться режима отладки?

Ответы [ 5 ]

14 голосов
/ 30 октября 2009

Что касается большей части вашего вопроса, это в некоторой степени зависит от того, какой инструмент модульного тестирования вы используете. Тем не менее, в общем, вы хотите директивы препроцессора

//C#
#ifndef DEBUG
    //Unit test
#endif

Возможно, для вашей ситуации

//C# - for NUnit
#if !DEBUG
    [Ignore("This test runs only in debug")] 
#endif 

А что же, оставить ли юнит-тесты в релизной версии? Я бы дал громкое НЕТ. Я бы посоветовал перенести все ваши юнит-тесты в собственный проект, а НЕ включать это в ваши релизы.

6 голосов
/ 30 октября 2009

Попробуйте это:

#if DEBUG

// here is your test

#endif
5 голосов
/ 30 октября 2009

Если вы используете NUnit, вы можете сделать свои методы модульного тестирования условными:

[System.Diagnostics.Conditional("DEBUG")]
public void UnitTestMethod()
{
   // Tests here
}

Таким образом, он будет выполняться только в сборках DEBUG. У меня нет большого опыта работы с модульными тестами Visual Studio, но я уверен, что это должно работать и в VS.

РЕДАКТИРОВАТЬ : Другие упоминали директивы условной компиляции. Я не думаю, что это очень хорошая идея по ряду причин. Чтобы узнать больше о различиях между директивами условной компиляции и условным атрибутом, прочитайте превосходную статью Эрика Липперта здесь .

1 голос
/ 20 марта 2019

Аналогичное решение для фреймворка NUnit (работает только тестирование отладки):

public class DebugOnlyAttribute : NUnitAttribute, IApplyToTest
{

    private const string _reason = "Debug only";

    public void ApplyToTest(Test test)
    {
        if (!Debugger.IsAttached)
        {
            test.RunState = RunState.Ignored;
            test.Properties.Set(PropertyNames.SkipReason, _reason);
        }

    }
}

[DebugOnly]
[Test]
public void TestMethod()
{ 
//your test code
}
0 голосов
/ 09 ноября 2016

Если вы используете XUnit, вы можете использовать следующий метод , как описано Джимми Богардом , расширяя атрибут факта:

public class RunnableInDebugOnlyAttribute : FactAttribute
{
    public RunnableInDebugOnlyAttribute()
    {
        if (!Debugger.IsAttached)
        {
            Skip = "Only running in interactive mode.";
        }
    }
}

и затем вы можете использовать это следующим образом:

[RunnableInDebugOnly]
public void Test_RunOnlyWhenDebugging()
{
    //your test code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...