Как пропустить юнит тест во время выполнения? - PullRequest
0 голосов
/ 16 ноября 2018

Заранее спасибо!

У нас есть несколько тестов автоматизации с использованием веб-драйвера selenium, которые великолепны и обеспечивают действительно хороший регрессионный пакет.

Проблема в том, что в нашем коде есть переключатели функций.Поэтому я должен сказать, что игнорируйте эти тесты, если только эта функция не включена / выключена.Я ничего не могу найти в поиске Google.

В идеале, я не хочу, чтобы оператор «if» находился в верхней части тестов Feature, но похоже, что это будет основной путь.Мои первые мысли о том, где создать пользовательский атрибут

public class IsFeatureFlagTurnedOn : Attribute
{
   public IsFeatureFlagTurnedOn(string featureToggleName)
   {
      FeatureToggleName = featureToggleName;
   }
   public string FeatureToggleName {get;}
}

public class MyTests 
{
   [TestMethod]
   [IsFeatureFlagTurnedOn("MyFeature1")]
   public void ItShould()
   {
      // only run if MyFeature1 is turned on
   }
}

Я кое-как должен подключиться к конвейеру MSTest и сказать, если этот атрибут присутствует и логика для MyFeature1 отключена, тогда не запускайте этот тест- Посмотрел на динамическое добавление [Игнорировать], но безуспешно.

Это работает через VSTS, и я мог бы использовать [TestCategories], но мне пришлось бы постоянно обновлять конвейер, для которого функция включена / выключеначто я не хочу делать.

Любая помощь или предложения будут великолепны!

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

MSTest v2 теперь имеет много точек расширяемости, и вы можете достичь этого, увеличив TestMethodAttribute.Сначала мы добавляем два аргумента атрибута: string для имени свойства и Type, у которого есть свойство.Затем мы переопределяем метод Execute и вызываем свойство через отражение.Если результат равен true, мы выполним тест как обычно, в противном случае мы вернем результат теста «неокончательный».

public class TestMethodWithConditionAttribute : TestMethodAttribute
{
    public Type ConditionParentType { get; set; }
    public string ConditionPropertyName { get; set; }

    public TestMethodWithConditionAttribute(string conditionPropertyName, Type conditionParentType)
    {
        ConditionPropertyName = conditionPropertyName;
        ConditionParentType = conditionParentType;
    }

    public override TestResult[] Execute(ITestMethod testMethod)
    {
        if (ConditionParentType.GetProperty(ConditionPropertyName, BindingFlags.Static | BindingFlags.Public)?.GetValue(null) is bool condiiton && condiiton)
        {
            return base.Execute(testMethod);
        }
        else
        {
            return new TestResult[] { new TestResult {  Outcome = UnitTestOutcome.Inconclusive } };
        }
    }
}

Теперь мы можем использовать наш новый атрибут следующим образом:

[TestClass]
public class MyTests
{
    [TestMethodWithCondition(nameof(Configuration.IsMyFeature1Enabled), typeof(Configuration))]
    public void MyTest()
    {
        //...
    }
}

public static class Configuration
{
    public static bool IsMyFeature1Enabled => false;
}

Выше приведено очень общее решение.Вы также можете настроить его немного под свой конкретный вариант использования, чтобы, возможно, избежать слишком многословия в объявлении атрибута:

public class TestMethodForConfigAttribute : TestMethodAttribute
{
    public string Name { get; set; }

    public TestMethodForConfigAttribute(string name)
    {
        Name = name;
    }

    public override TestResult[] Execute(ITestMethod testMethod)
    {
        if (IsConfigEnabled(Name))
        {
            return base.Execute(testMethod);
        }
        else
        {
            return new TestResult[] { new TestResult {  Outcome = UnitTestOutcome.Inconclusive } };
        }
    }

    public static bool IsConfigEnabled(string name)
    {
        //...
        return false;
    }
}

И использовать его следующим образом:

[TestClass]
public class MyTests
{
    [TestMethodForConfig("MyFeature1")]
    public void MyTest()
    {
        //...
    }
}
0 голосов
/ 16 ноября 2018

Исходя из моего чтения этого , вам может потребоваться использовать Assert.Inconclusive

...