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

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

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

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

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

вопрос может быть сведен к я думаю, что ряд возможных решений

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

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

5 ответов


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

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

Вариант 1-Самое навязчивое, обнаружение платформы времени компиляции

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

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

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

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

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

вот аналогичное решение option1, за исключением того, что не требуется отдельная конфигурация:

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] тест, но он игнорировал


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

[Fact (Skip = "specific reason")]


теперь есть новые опции.

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

пример:

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

    // Test Windows only functionality.
}

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


теперь это решено в 1.8 - вы можете фильтровать по признакам. Смотрите это выпуск журнала.

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