【C#】xUnitのタイムアウトは非同期メソッドにする必要がある


xUnitの動作について

xUnitのタイムアウトの挙動について調べたところ、非同期メソッドであるようでした。

テストコード

using System;
using System.Threading.Tasks;
using Xunit;

namespace XUnitTestProject1
{
    public class WaitTests
    {
        [Fact(Timeout = 500)]
        public void WaitBlocking()
        {
            Task.Delay(1000).Wait();
        }
        [Fact(Timeout = 500)]
        public Task Direct()
        {
            return Task.Delay(1000).ContinueWith(t => throw new Exception());
        }
        [Fact(Timeout = 500)]
        public async Task AsyncAwait()
        {
            await Task.Delay(1000);
        }
        [Fact(Timeout = 500)]
        public async void AsyncAwaitVoid()
        {
            await Task.Delay(1000);
        }
        [Fact(Timeout = 500)]
        public async Task AsyncWaitNothing()
        {
            Task.Delay(1000).Wait();
        }
        [Fact(Timeout = 500)]
        public async void AsyncWaitVoidNothing()
        {
            Task.Delay(1000).Wait();
        }
    }
}

結果

タイムアウトで失敗してくれるのは非同期メソッドになっている3つだけでした。

また、非同期メソッドにしても内部でブロッキングして待っている場合はタイムアウトになりませんでした。

C:\\\\\\\\XUnitTestProject1.dll(.NETCoreApp,Version=v3.1) のテスト実行
Microsoft (R) Test Execution Command Line Tool Version 16.7.0
Copyright (c) Microsoft Corporation.  All rights reserved.

テスト実行を開始しています。お待ちください...

合計 1 個のテスト ファイルが指定されたパターンと一致しました。
  X XUnitTestProject1.WaitTests.AsyncAwait [1ms]
  エラー メッセージ:
   Test execution timed out after 500 milliseconds

  X XUnitTestProject1.WaitTests.AsyncAwaitVoid [1ms]
  エラー メッセージ:
   Test execution timed out after 500 milliseconds

  X XUnitTestProject1.WaitTests.Direct [1ms]
  エラー メッセージ:
   Test execution timed out after 500 milliseconds


テストの合計数: 8
     成功: 5
     失敗: 3
合計時間: 7.6350 秒