Подтвердить что ты не робот

Как пропустить конкретные тесты в xUnit на основе текущей платформы

  • У меня есть сборка, которую я построил на Windows
  • Я хочу запустить тесты xUnit для mono в Linux.

Тем не менее, я обнаружил, что, хотя 400 из этих тестов могут выполняться (по порядку), некоторые тесты либо повесить бегун xUnit, либо полностью отбросить его.

Я не забочусь о , если некоторые тесты не могут работать в Linux, некоторые тесты связаны с DTC и некоторыми неуправляемыми gumph, которые нам не нужно поддерживать там.

Тем не менее, я хочу, чтобы применить игнорирование этих тестов, а также тот факт, что тест был проигнорирован правильно помечен в выводе сборки.

Вопрос можно свести до того, что я предполагаю ряд возможных решений

  • Как запустить определенные тесты в xUnit через консоль? (Я не нашел документацию с этой целью, может быть, я просто не выгляжу достаточно сложно).
  • Можно ли пойти другим путем и сказать: "Вот сборка, пожалуйста, проигнорируйте эти конкретные тесты, хотя"
  • Наличие атрибута на этих тестах было предложено лучше, чтобы формально документировать, что эти тесты являются специфичными для платформы - возможно ли это?

Если бы я мог слишком сильно модифицировать исходный код, который был бы большим, так как код действительно не изменился, и применение большого количества кросс-платформенных хаков, вероятно, не будет слишком сильно снижаться.

4b9b3361

Ответ 1

Я бы избегал экстернализации пропущенных тестов (т.е. файла конфигурации/команды, если это возможно). Это несколько противоречит тому, чтобы тесты легко запускались и заслуживали доверия. Проведение тестов, игнорируемых в коде, является самым безопасным подходом, когда другие люди начинают участвовать.

Я мог видеть несколько вариантов, вот два, которые включают в себя модификацию существующего кода.

Вариант 1 - наиболее интрузивное, определение времени компиляции

В VS-решении определите другую конфигурацию, которая определяет флаг прекомпилятора MONOWIN (просто так, чтобы он явно указывал флаг, что он предназначен для кода, скомпилированного в Windows для использования в Mono).

Затем определите атрибут, который сделает тест проигнорированным при компиляции для Mono:

public class IgnoreOnMonoFactAttribute : FactAttribute {
#if MONOWIN
    public IgnoreOnMonoFactAttribute() {
        Skip = "Ignored on Mono";
    }
#endif
}

На самом деле трудно найти какие-либо преимущества для этого метода, поскольку он включает в себя насмешку над оригинальным решением и добавляет другое подтверждение, которое необходимо поддерживать.

Вариант 2 - несколько интрузивный - определение платформы времени выполнения

Вот аналогичное решение для опции 1, за исключением того, что не требуется отдельная настройка:

public class IgnoreOnMonoFactAttribute : FactAttribute {

    public IgnoreOnMonoFactAttribute() {
        if(IsRunningOnMono()) {
            Skip = "Ignored on Mono";
        }
    }
    /// <summary>
    /// Determine if runtime is Mono.
    /// Taken from http://stackoverflow.com/questions/721161
    /// </summary>
    /// <returns>True if being executed in Mono, false otherwise.</returns>
    public static bool IsRunningOnMono() {
        return Type.GetType("Mono.Runtime") != null;
    }
}

Примечание 1

xUnit runner будет запускать метод дважды, если он помечен [Fact] и [IgnoreOnMonoFact]. (CodeRush этого не делает, в этом случае я предполагаю, что xUnit верен). Это означает, что любые методы тестов должны иметь [Fact] заменены на [IgnoreOnMonoFact]

Примечание 2

Тест-драйв CodeRush по-прежнему запускал тест [IgnoreOnMonoFact], но он проигнорировал тест [Fact(Skip="reason")]. Я предполагаю, что это связано с тем, что CodeRush отражает xUnit и фактически не запускает его с помощью библиотек xUnit. Это отлично работает с бегуном xUnit.

Ответ 2

Теперь есть новые параметры.

Добавить пакет Nuget SkippableFact, который позволяет использовать [SkippableFact] вместо [Fact], и вы можете использовать Skip.<xyz> внутри a Тесты для динамического прогона теста во время выполнения.

Пример:

[SkippableFact]
public void SomeTestForWindowsOnly()
{
    Skip.IfNot(Environment.IsWindows);

    // Test Windows only functionality.
}

Ответ 3

Теперь доступен XUnit v2.0. Сканируемые тесты поддерживаются им напрямую. Использование:

[Fact (Skip = "specific reason")]

Ответ 4

Это было бы идеальным использованием признаков, но, к сожалению, ни командная строка, ни файл проекта xml не поддерживают фильтрацию на основе признаков. Было бы целесообразно добавить проблему на сайт codeplex для этого.

Ответ 5

Теперь это разрешено в 1.8 - вы можете фильтровать на Чертах. См. Этот журнал .

Обновление: черты работают с консольным бегуном, но не с MSBuild, я добавил запрос функции для этой поддержки.