【发布时间】:2018-08-04 23:15:04
【问题描述】:
我正在尝试创建一个最小的工作示例,说明 Xunit.net 中的 Timeout 参数如何运行。我目前有以下Fact 示例,但它没有按我的预期运行,因为它没有通过测试:
[Fact(Timeout = 50)]
public void FactTimeout_TimeoutLessThanProcessingTime_ThrowTestTimeoutException()
{
// Arrange
// Act
Action act = () => Task.Delay(5000);
// Assert
Assert.Throws<TestTimeoutException>(act);
}
这是正确的,还是我的理解错误?是否还有其他需要更改或添加到测试本身或 Xunit 配置的内容?
更新
根据@RubenBartelink 的回答,我得到了以下工作:
// Will generate the exception and display it in the results window
[Fact(Timeout = 50)]
public async void TestOne() => await Task.Delay(5000);
// This will pass the test, but will complain that it is not awaited
[Fact(Timeout = 50)]
public void TestTwo() => Assert.ThrowsAsync<TestTimeoutException>(() => Task.Delay(5000));
【问题讨论】:
-
你需要
awaitThrowsAsync- 否则你刚刚产生了一个Task,没有人会检查它的结果。但问题是TestTimeoutException是一个内部异常,在测试超时时由 xUnit 抛出 - 没有其他真正的方法可以让它在你的测试主体中抛出(对我来说,这是你的问题)正在寻求实现整体 - 如果在您的实际代码中超时,您会怎么做?) -
@RubenBartelink 啊,我应该在前面更清楚。我正在创建一个示例项目来演示如何使用 Xunit 的不同方面。因此,您认为这种方法不适合实际测试是正确的。
Timeout参数可以在非异步情况下使用吗,比如说你有一段同步的代码需要很长时间? -
是的,无论同步还是异步,超时都适用。一般来说,对于一个整体的测试套件,我会考虑为整个测试套件设置一个超时时间(通常任何跑步者都会有这样的设施,就像 xunit.runner.console 用于 instacne 一样)然后让 CI 钻机的时间引导您处理通常花费太长时间的任何事情。也就是说,虽然 Timeout 工具在需要时可能是不可或缺的,但我倾向于在任何高级概述中都不会提及它
-
所以事实证明
Timeout参数当前不适用于同步代码,我最终在 xunit.slack 频道上询问,因为我无法获得同步示例。跨度> -
啊,有趣。 :thinking: 有没有什么办法可以通过
async Task Test () => {.... (take >50ms); await Task.FromResult(0); }滥用它 - 让我们假装这个想法没有进入我的脑海!