如何跳过具有Theory属性而非Fact的测试用例

12

如何跳过数据驱动测试用例?

我可以使用Fact跳过一个测试用例,但在使用skip跳过参数化测试用例时会出现异常。
异常信息:Xunit.SkipException: 'Exception of type 'Xunit.SkipException' was thrown.'

[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,则应跳过测试用例。


理论(跳过=“为什么跳过的原因”) - undefined
2个回答

15

xUnit不将SkipException作为异常处理。

你可以通过Fact(Skip="Reason")来实现跳过。

[Theory]也有一个类似的Skip属性。

在Theory中的任何一个用例抛出异常都会停止处理。

因此,我建议您使用if (bad) return;来跳过处理。


3

通过扩展xUnit的功能,基于运行时选择,可以动态地跳过测试用例(无论是事实还是理论中的案例)。

我建议采用xunit.samples中的DynamicSkipExample(由各自作者许可的Apache 2.0许可),其中包括此示例用法:

最初的回答:

可以通过扩展xUnit的特性,根据运行时的选择,动态地跳过测试用例(无论是事实还是从理论中得出的结论)。我建议采用来自xunit.samples的DynamicSkipExample(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):

Original Answer翻译成"最初的回答"

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接