I have integration tests set up with xUnit.net.
Is there a way to configure how long an integration test should last maximum? I mean a threshold.
For the newer xunit versions, I am using this method, which seems to work well:
public static class AssertAsync
{
public static void CompletesIn(int timeout, Action action)
{
var task = Task.Run(action);
var completedInTime = Task.WaitAll(new[] { task }, TimeSpan.FromSeconds(timeout));
if (task.Exception != null)
{
if (task.Exception.InnerExceptions.Count == 1)
{
throw task.Exception.InnerExceptions[0];
}
throw task.Exception;
}
if (!completedInTime)
{
throw new TimeoutException($"Task did not complete in {timeout} seconds.");
}
}
}
You can use it like so:
[Fact]
public void TestMethod()
{
AssertAsync.CompletesIn(2, () =>
{
RunTaskThatMightNotComplete();
});
}
However, be sure to read the reason about why this was removed in the first place as one of the maintainers of the project does make a pretty good point about potentially deadlocking your test run. I run these tests in single-threaded mode and it doesn't appear to cause a problem.
[Fact(Timeout=milliseconds)], but only for non-parallel runs.It seems, what you are looking for is the Timeout parameter of the Fact attribute.
For further information see the XUnit Docs under Ensuring a Test Does Not Run Too Long.
Fact parameters seems to be absent in the documentation whatsoever.Fact and add an excerpt from the article here.To get a concrete example:
You can just use
[Fact(Timeout = 2000)]
for example.
Hint: Timeout is specified in ms.
Timeout attribute only works for async methods. github.com/xunit/xunit/issues/2222
dotnet test --blame-hang-timeout 30swould be another way to disallow any single test to run longer than 30 seconds. It is not controlled by xUnit, but by the test runner, and can be used with any framework and doesn't suffer the issues withFact(Timeout=30000ms), which xUnit most of the time just ignores...