如何在运行时跳过单元测试



提前感谢!

我们有一些使用selenium web驱动程序的自动化测试,这些测试非常棒,提供了一个非常好的回归包。

现在的问题是,我们的代码中有功能切换。所以我需要说忽略这些测试,除非打开/关闭功能切换。我在谷歌上找不到任何真正的搜索结果。

理想情况下,我不希望在功能测试的顶部使用"if"语句,但它看起来将是主要的方法。我最初的想法是在哪里创建自定义属性

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的逻辑被关闭,那么就不要运行这个测试-考虑动态添加[Ignore],但没有运气。

这是通过VSTS运行的,我可以使用[TestCategories],但我必须不断更新打开/关闭功能的管道,这是我不想做的

任何帮助或建议都将是伟大的!

MSTestv2现在有很多可扩展点,您可以通过扩展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()
{
//...
}
}

根据我的阅读,您可能需要使用Assert.Inconclusive

相关内容

  • 没有找到相关文章

最新更新