Как пропустить определенные тесты в xUnit на основе текущей платформы - PullRequest
28 голосов
/ 12 декабря 2010
  • У меня есть сборка, созданная на Windows
  • Я хочу запустить тесты xUnit на моно в Linux.

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

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

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

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

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

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

Ответы [ 5 ]

28 голосов
/ 12 декабря 2010

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

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

Вариант 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 runner.

25 голосов
/ 21 июня 2016

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

[Fact (Skip = "specific reason")]

19 голосов
/ 08 марта 2016

Появились новые опции.

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

Пример:

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

    // Test Windows only functionality.
}
2 голосов
/ 24 февраля 2012

Это теперь решено в 1.8 - вы можете фильтровать по чертам.См. Этот журнал проблем .

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

2 голосов
/ 14 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...