Как программно игнорировать некоторые приемочные тесты с использованием TechTalk.SpecFlow и C#?
У меня есть несколько файлов с некоторыми сценариями. Мне нужно игнорировать несколько сценариев или функций, отмеченных некоторыми @tag
в зависимости от некоторых условий. Я прочитал документацию по specflow, но не нашел там чего-то, что могло бы быть полезным для моего решения. Я хочу использовать что-то вроде
[BeforeScenario("sometag")]
public static void BeforeScenario()
{
if(IgnoreTests)
{
// This is the hot spot
Scenario.DoSomethingToIgnoreScenarioIfConditionButRunScenarioIfConditionFalse();
}
}
Также я пытался динамически добавлять или удалять теги
[BeforeScenario("sometag")]
public static void BeforeScenario()
{
if(IgnoreTests)
{
ScenarioContext.Current.ScenarioInfo.Tags.ToList().Add("ignore");
}
}
но это не сработало. Может быть, есть какой-то другой способ динамически добавлять или удалять теги? Или некоторые методы в ScenarioContext
класс, который будет игнорировать текущий сценарий?
1 ответ
У вас есть как минимум 3 варианта:
Сконфигурируйте Specflow для обработки ожидающих шагов как игнорируемых с помощью
missingOrPendingStepsOutcome="Ignore"
тогда вы можете написать:if(IgnoreTests) { ScenarioContext.Current.Pending(); }
Это может быть не то, что вы хотите, в зависимости от ваших требований для ожидающих шагов.
Используйте встроенный метод модульного тестирования, чтобы игнорировать тест во время выполнения. Так что если вы используете, например, NUnit, то с Assert.Ignore ():
if(IgnoreTests) { Assert.Ignore(); }
Я думаю, что это самое чистое / простое решение.
Или, если вы хотите выполнить тестирование независимо от фреймворка и не боитесь связываться с внутренними объектами Specflow, вы можете использовать
IUnitTestRuntimeProvider
интерфейс:if (IgnoreTests) { var unitTestRuntimeProvider = (IUnitTestRuntimeProvider) ScenarioContext.Current .GetBindingInstance((typeof (IUnitTestRuntimeProvider))); unitTestRuntimeProvider.TestIgnore("ignored"); }
Это будет работать, даже если вы измените свой тестовый провайдер модулей, но не гарантируется, что этот API не сломается в будущем.