Как программно игнорировать некоторые приемочные тесты с помощью 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");
    }
    

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