通过扩展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)
{
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()));
}
}
return innerBus.QueueMessage(message);
}