Как пропустить конкретные тесты в 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, я добавил запрос функции для этой поддержки.