由于某种原因,如何跳过数据驱动的测试用例?
我可以使用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,则应跳过测试用例。
答案 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);
}