Как программно игнорировать некоторые приемочные тесты с использованием 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 варианта:

  1. Сконфигурируйте Specflow для обработки ожидающих шагов как игнорируемых с помощью missingOrPendingStepsOutcome="Ignore" тогда вы можете написать:

    if(IgnoreTests)
    {
        ScenarioContext.Current.Pending();
    } 
    

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

  2. Используйте встроенный метод модульного тестирования, чтобы игнорировать тест во время выполнения. Так что если вы используете, например, NUnit, то с Assert.Ignore ():

    if(IgnoreTests)
    {
        Assert.Ignore();
    }
    

    Я думаю, что это самое чистое / простое решение.

  3. Или, если вы хотите выполнить тестирование независимо от фреймворка и не боитесь связываться с внутренними объектами Specflow, вы можете использовать IUnitTestRuntimeProvider интерфейс:

    if (IgnoreTests)
    {
        var unitTestRuntimeProvider = (IUnitTestRuntimeProvider) 
        ScenarioContext.Current
           .GetBindingInstance((typeof (IUnitTestRuntimeProvider))); 
        unitTestRuntimeProvider.TestIgnore("ignored");
    }
    

    Это будет работать, даже если вы измените свой тестовый провайдер модулей, но не гарантируется, что этот API не сломается в будущем.

Другие вопросы по тегам