4

タイムアウトが発生したときにNUnitは正確に何をしますか? 以前は、TimeoutException をスローしてテストを中止すると考えていましたが、このテストはそうではないことを証明しています。

[Test, Timeout(100), ExpectedException(typeof(TimeoutException))]
public static void RaisingExpectedTimeoutException()
{
    Thread.Sleep(500);
}

残念ながら、nunit コンソールはタイムアウトの違反のみを報告しますが、それによってテストがどのように中止されたかは報告しません。これがどのように機能するかについてもっと知っている人はいますか?上記のテストで、期待した TimeoutException が発生しなかったのはなぜですか? (.NET例外タイプですが、NUnitがタイムアウト違反にその例外を使用していると思いました)。

PS: このテスト方法も失敗します:

[Test, Timeout(100), ExpectedException(typeof(ThreadAbortException))]
public static void RaisingExpectedThreadAbortException()
{
    Thread.Sleep(500);
}

そして、このテストメソッドは成功します (「誰もスペインの異端審問を期待していません!」):

[Test, ExpectedException(typeof(ThreadAbortException))]
public static void ThrowingExpectedThreadAbortException()
{
    Thread.CurrentThread.Abort();
}
4

2 に答える 2

5

NUnitのテストメソッドがタイムアウトを指定している場合、残りのテストとは別のスレッドで実行されます。テストがタイムアウトを超えると、作成されたスレッドはによって無礼に中止されますThread.Abort

中止に関する部分は、ドキュメントでは明示されていませんが、NUnitコードベースを掘り下げると明らかです。詳細TestThread.RunTestはをご覧ください。

編集*

例外をキャッチしても、タイムアウト時にテストが失敗する理由は、スレッドを中止する前にテストが失敗としてマークされているためです。したがって、それがすでに失敗としてマークされているため、それが期待されるかどうかは無意味です。

于 2012-02-25T22:08:20.457 に答える
1

NUnit は、コード内から魔法のように例外を発生させることはありません。NUnit テスト ランナーはスレッドを使用してコードを実行しており、指定されたタイムアウトよりも時間がかかる場合はそのスレッドを中止します。

コードを実行しているスレッドが中止されると、ThreadAbortExceptionが生成されます。NUnit はそれ自体がこの例外の原因であることを認識しているため、 を追加してExpectedException(typeof(ThreadAbortException))もテストはパスしません。

于 2012-02-25T22:06:38.100 に答える