Как программно игнорировать некоторые приемочные тесты с использованием TechTalk.SpecFlow и С#?

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

[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();
    }
    

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

  • Или, если вы хотите сделать это с помощью арифметического метода тестирования, и вы не боитесь запутаться с внутренними компонентами, то вы можете использовать интерфейс IUnitTestRuntimeProvider:

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

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