如何跳过具有理论属性不是事实的测试用例

时间:2019-08-20 08:56:40

标签: xunit xunit.net

由于某种原因,如何跳过数据驱动的测试用例?

我可以使用Fact跳过测试用例,但是在对参数化测试用例使用skip时却遇到异常。 异常:Xunit.SkipException:'引发了类型为'Xunit.SkipException'的异常。'

[Theory, OwnData(@"Data\own.json"), Category("Own")]
        public void Transfer(OwnDataTestConfig own)
        {
            bool? result = null;
            Skip.IfNot(own.FeatureConfig.SameCurrencyOnly);
result = Own.VerifyTransfer(_basicActions, WebDriver, own);;
            Assert.True(result.Value);
        }

如果own.FeatureConfig.SameCurrencyOnly为false,则应跳过测试用例。

2 个答案:

答案 0 :(得分:0)

xUnit不会像这样处理SkipException

您可以通过Fact(Skip="Reason")来做到这一点。

[Theory]还具有类似的Skip属性。

从理论中的一个案例中抛出,都会中止处理。

所以我建议您使用if (bad) return;来跳过该处理。

答案 1 :(得分:0)

根据运行时的选择,动态地跳过测试用例(无论是事实还是理论中的用例),都可以通过扩展xUnit的功能来完成。

我建议改编the DynamicSkipExample from xunit.samples(许可的Apache 2.0,由其各自的作者拥有版权),其中包括以下示例用法:

[SkippableTheory]
[InlineData(null)]
[InlineData("Hello, world!")]
public void DynamicallySkipped(string value)
{
    if (value == null)
        throw new SkipTestException("I don't like to run against null data.");

    Assert.StartsWith("foo", value);
}

因此,基本上,在使用中,您可以动态引发特定的异常,从而导致跳过的测试用例,而不是失败的测试用例。

可以在自己的许可下的链接存储库中找到该代码。它将内容与IXunitTestCaseDiscoverer连接在一起,但是有趣的地方在TestCase中(一个用于Fact,一个用于Theory):

public override async Task<RunSummary> RunAsync(IMessageSink diagnosticMessageSink,
                                                IMessageBus messageBus,
                                                object[] constructorArguments,
                                                ExceptionAggregator aggregator,
                                                CancellationTokenSource cancellationTokenSource)
{
    // Duplicated code from SkippableFactTestCase. I'm sure we could find a way to de-dup with some thought.
    var skipMessageBus = new SkippableFactMessageBus(messageBus);
    var result = await base.RunAsync(diagnosticMessageSink, skipMessageBus, constructorArguments, aggregator, cancellationTokenSource);
    if (skipMessageBus.DynamicallySkippedTestCount > 0)
    {
        result.Failed -= skipMessageBus.DynamicallySkippedTestCount;
        result.Skipped += skipMessageBus.DynamicallySkippedTestCount;
    }

    return result;
}

及其关联的IMessageBus

public bool QueueMessage(IMessageSinkMessage message)
{
    var testFailed = message as ITestFailed;
    if (testFailed != null)
    {
        var exceptionType = testFailed.ExceptionTypes.FirstOrDefault();
        if (exceptionType == typeof(SkipTestException).FullName)
        {
            DynamicallySkippedTestCount++;
            return innerBus.QueueMessage(new TestSkipped(testFailed.Test, testFailed.Messages.FirstOrDefault()));
        }
    }

    // Nothing we care about, send it on its way
    return innerBus.QueueMessage(message);
}