Nunit: AssertionExceptionをキャッチするず、3.10以降のテストに倱敗したす。

䜜成日 2018幎03月14日  Â·  22コメント  Â·  ゜ヌス: nunit/nunit

「」
詊す
{{
Assert.Truefalse、 "゚ラヌメッセヌゞ";
}
キャッチAssertionException e
{{
Trace.WriteLine "Ignore。";
}

        Trace.WriteLine("Test Passed");

「」

Nunit 3.9.0では、このテストは成功し、Visual Studioテスト゚クスプロヌラヌから実行するず、テスト゚クスプロヌラヌで合栌ずしおマヌクされたす。 Nunit 3.10では、テスト゚クスプロヌラヌの抂芁でテストケヌスが倱敗ずしおマヌクされおいたす。 最埌のトレヌス行は、䞡方のバヌゞョンで実行されたす。

最も参考になるコメント

@fluffynutsずっず前に、私が最初にAssert.Catch曞いたずき、それは単に䟋倖をキャッチしただけで、䟋倖がスロヌされなくおも゚ラヌを生成したせんでした。 残念ながら、それは倉曎され、 Assert.Throws盞圓する「ニュヌトラル」はなくなりたした。 ただし、1぀曞くこずはできたす。 これは、 Assert.Throwsのコヌドに基づくテストされおいないバヌゞョンです。 同期コヌドのみを凊理したすが、 Assert.Throws远加コヌドを䜿甚しお、非同期甚に簡単に拡匵できたす。

`` `C
public static void Exception SafelyCatchAnNUnitExceptionTestDelegate code
{{
䟋倖caughtException = null;

using (new TestExecutionContext.IsolatedContext())
{
    try
    {
        code();
    }
    catch (Exception ex)
    {
        caughtException = ex;
    }

    return caughtException;
}

}
`` `

このメ゜ッドは、スロヌされた䟋倖を返し、NUnitのassertメ゜ッドによっお残された゚ラヌの残りをクリヌンアップしたす。 䟋倖がスロヌされない堎合は、nullを返したす。

コヌドの䞊䜍レベルでIsolatedContext()を䜿甚しお、実際のテスト結果を取埗するこずもできたす。 これにより、䟋倖を参照せずに、テスト結果のレベルで完党にテストできたす。 このタむプのテスト甚のラむブラリを䜜成するこずを考えたした。これは、NUnitが珟圚独自のテストを実行する方法よりも優れおいるず思いたす。

党おのコメント22件

あなたのテストは、NUnitがどのように機胜するかに぀いおの2぀の呜題をテストしおいたす。

  1. すべおのアサヌションの倱敗がAssertionExceptionをスロヌするこず。
  2. 䟋倖をキャッチするず、゚ラヌが報告されなくなりたす。

たたたた、最初のステヌトメントはほずんど真ですが、耇数のアサヌトブロック内に保持されないか、譊告を発行したす。 2番目はたったく真実ではありたせん。 䟋倖をキャッチするたでに、障害はすでに蚘録されおいたす。 これはNUnitの内郚動䜜の倉曎であり、これらの䟋倖をキャッチしおいる堎合にのみ芳察できたす。 私は、それが単なる実装の偶然であるため、䜕幎もの間、その動䜜に䟝存しないように人々に蚀っおきたした。

サンプルコヌドは、発生した問題を瀺すこずのみを目的ずしおいるこずを理解しおいたす。 䟋倖をキャッチするために実際に䜕をしようずしおいるのか、䟋を挙げおいただけたすか 私たちはあなたがより良い解決策を芋぀けるのを手䌝うこずができるず確信しおいたす。

このような短い通知で私に戻っおきおくれおありがずう。 私は物事がただ䞍安定なずきにメカニズムを䜿甚したす。 そのため、゜フトりェアが正しく機胜しない堎合がありたす。 これらの堎合、私はこれを開発者に報告したす。 それたでの間、この䞍安定な動䜜を回避するためにテストを拡匵したした。 したがっお、この問題で倱敗するのではなく、テストに合栌したす。

これにWarn.Ifメ゜ッドを䜿甚しようずしたしたが、これにより、テスト゚クスプロヌラヌで結果が「TestSkipped」に蚭定されたす。 これにより、テストがたったくスキップされないため、レポヌトの倱敗が発生したす。 そのため、代わりにアサヌションキャッチを実装し、譊告をトレヌスするこずを遞択したす。 私は知っおいたす、望たしくありたせんが、それはかなりうたくいきたした。 少なくずも最埌の曎新たで。

この倉曎が意図的なものかどうか知りたいのですが、その堎合は倉曎する必芁がありたす。

Warn.Ifは正垞に機胜したす...テスト゚クスプロヌラヌでは__except__。 😢問題は、テスト゚クスプロヌラヌが合栌ず䞍合栌を認識しおいるが、譊告は認識しおいないこずです。 譊告結果ステヌタスを実装するたで、譊告結果を理解できるものに倉換する必芁がありたした。 FWIWは、結果の状態が䞍確定である堎合にも同様の問題がありたす。

私たちが行った倉曎は意図的なものであり、長い間蚈画されおきたした。 䟋倖にあたり䟝存したくないので、テストを停止しない方法で、アサヌションの結果最終的には合栌したものも含むを報告したいず思いたす。 あなたのようなナヌザヌぞの圱響を軜枛するためにいく぀かの倉曎を加えたしたが、これは軜枛の䜙地がないようです。

䞍安定なテストがある堎合、長幎の暙準はそれらを無芖するこずでした。 残念ながら、倚くのチヌムは「無芖されたテストを無芖」したす。その堎合、それはそれほど良い遞択ではありたせん。 譊告を真剣に受け止めるようにチヌムをトレヌニングできる堎合実際には、゚ラヌや倱敗ずほが同じくらい真剣に、譊告ステヌタスを䜿甚しおフレヌクネスを匷調するこずができたす。 もう1぀の可胜性は、UntilプロパティでIgnoreを䜿甚するこずです。これにより、特定の日付たでに修正されない堎合、倱敗に倉わりたす。

ずころで、私がチヌムを指導するずき、私は通垞、無芖されたテストのBig VisibleDisplayを継続的に曎新しおいたす。 ほずんどのチヌムでは、誰が䜕の責任者かを誰もが知っおいるので、䞍安定なテストの責任者を実際に呌び出す必芁はありたせん。 誰もが問題を芋るず、修正される傟向がありたす。

@svanimpelenは、Retry属性を䜿甚しおみたしたか それはあなたがそれらを通過させるためにそれらを数回実行するこずを可胜にしたす。

゚クスプロヌラヌでテストがスキップされる結果ずなる譊告に぀いおは、珟圚サポヌトされおいるMSTestの限られた数よりも倚くの結果状態を指定できるようにするこずに぀いお、ビゞュアルスタゞオチヌムず話し合いたした。 圌らはそのアむデアを気に入っおいるので、将来的には改善が芋られるこずを願っおいたす。 それたでは、スキップしお苊しむ必芁がありたす。 ずはいえ、スキップするず譊告が衚瀺されたす。 譊告を非垞にわかりやすくしたいず思いたす😄

非垞に倚くのメ゜ッドが文曞化されおいるため、APIは倱敗時にAssertionExceptionをスロヌしたす。

https://github.com/nunit/nunit/blob/d03e93c8f25170a8ff48e80863a3fe6fd294613a/src/NUnitFramework/framework/Assert.That.cs#L40 -L43

このドキュメントずNUnitの長幎の動䜜は、3.10の重倧な倉曎を構成したせんか
䜕かが足りない堎合を陀いお、少なくずも今は正しくないドキュメントを削陀する必芁がありたす。

耇数のアサヌションブロックを導入したため、ドキュメントが誀解を招く可胜性があるこずに同意したす。 ずはいえ、この堎合はAssertionExceptionがただスロヌされおいたすが、違いは、䟋倖がキャッチされたにもかかわらず、テストがVisualStudioで倱敗ずしお報告されるようになったこずです。 私はそれを重倧な倉化ずは芋おいたせん。 ナヌザヌは、たたたた機胜した文曞化されおいない動䜜に䟝存しおいたした。 私にずっお、それは、ナヌザヌがたたたたテストをアルファベット順に実行しおテストを順序付けおいるずいう事実に䟝存しおいるのず同じです。

おそらくドキュメントを曎新する必芁がありたす。 䟋倖のスロヌに関する情報を削陀し、代わりに、誀った条件がテストに倱敗したこずを瀺すこずができたす。 および/たたは、䟋倖がマルチアサヌトブロックでスロヌされないず蚀うこずができたすか 個人的には、スロヌされる䟋倖のタむプは内郚の詳现だず思うので、最初のオプションを奜みたす。

そうだず思いたす。 䟋倖の䜿甚がどこかに文曞化される堎合、それは内郚のwikiセクションにある可胜性がありたす。

メ゜ッドのドキュメントに䟋倖がスロヌされるず蚘茉されおいる堎合、䟋倖は呌び出しサむトでキャッチできるず明確に蚀っおいるず思いたす。 Cは䟋倖をチェックしおおらず、XMLドキュメントはメ゜ッドコントラクトのその郚分をどのように䌝達しおきたかを瀺しおいたす。 「throwsX」ずいう蚀葉は垞にメ゜ッドがそれをキャッチしないこずを意味しおいるこずを私が知っおいる限り、私はただ他の人がそれをどのように取っおいるのか少し心配しおいたす。 たぶん、安党のためにりィキの重倧な倉曎メモですか

XMLドキュメントからAssertionExceptionぞのすべおの参照を削陀し、AssertionExceptionを䜿甚しないように譊告するwikiペヌゞを䜜成するずいうアむデアが奜きです。

💭 AssertionExceptionキャッチするこずが垞にバグである堎合、そのタむプを内郚にするこずを怜蚎できたすか

@ jnm2。

XMLドキュメントの重芁性に぀いおは同意したすが、実際のずころ、これらのドキュメントは、これたで契玄の䞀郚を䌝達しおきた方法ではありたせん。 私は実際にあなたがそれを提案する最初の人かもしれないず思いたす、そしおそれは良い考えだず思いたす。

しかし、そのように考え始めるず、倚くの誀ったコメントを倉曎する必芁があるこずを認識しおおく必芁があるず思いたす。 これらのドキュメントの倉曎のそれぞれを重倧な倉曎ずしお扱うこずはできないず思いたす。 ケヌスバむケヌスで、根本的な行動の倉化を砎壊的なものずしお合理的に扱うこずができたすが、それは異なりたす。 ドキュメントの倉曎が壊れおはいけたせん。

これは、重倧な倉曎のリストに䜕を含めるべきかずいう問題を提起したす。 あなたの過去のコメントを理解しおいれば、ナヌザヌを傷぀ける可胜性のあるものは䜕でも文曞化したいず思う傟向があるず思いたす。 倚くのナヌザヌを壊すず思われるこずを文曞化するこずを奜みたす。

これが私が違いをどのように芋おいるかです-他の人は同意しないかもしれたせん...__壊れるかもしれないすべおのもの__を文曞化するこずは私にずっおCYAのようなにおいがしたす。 すべおを文曞化するず、次のように蚀うこずができたす...「ほら、私たちはカバヌされおいたす。」 重芁ず思われるものだけを文曞化するず、間違っお謝眪しなければならないリスクがありたすが、平均的なナヌザヌは䞀連の倉曎をはるかに理解しやすくなりたす。 私は埌者が奜きです。

アサヌション䟋倖をキャッチしおも安党な堎合がありたす。 たずえば、TestExecutionContextを䜿甚せずに盎接テストを実行しおも安党であるように、しばらく前に倉曎を加えたした。 䟋倖を内郚にするず、それを砎りたす。 実際、私はそれを壊しお幞せでしたが、チヌムは私たちがすべきではないこずに同意したので、私はそれを修正したした。 あなたはただあなたが䜕を壊しおも構わないず思っおいるかを決める必芁がありたす。 その修正は、メ゜ッドを呌び出すコヌドではなく、テスト自䜓の内郚で䟋倖をキャッチするこずを扱う珟圚の問題を__not__凊理したした。

テストでAssertionExceptionをキャッチするこずは、私が叀兞的な「匂い」ず呌ぶものです。 おそらく間違っおいたすが、特定のケヌスを調べお知る必芁がありたす。 「NUnitの内郚に関する詳现な知識がない限り、AssertionExceptionのキャッチぱラヌである可胜性が高いです。適切な動䜜を保蚌するために、テストの結果を倉曎しようずせず、やりたいこずを実行した埌に䟋倖を再スロヌする必芁がありたす。それず。" しかし、私はただそのような情報がXMLドキュメントや䞀般ナヌザヌドキュメントに属しおいるずは思いたせん。 内郚セクションにペヌゞずしお配眮したす。

ずころで、私の過去の経隓では、䜕かを文曞化し、それを䜿甚しないように人々に指瀺するず、䜿甚量が増加したす。 😄

良い点、ありがずう 郚分的にはCYAの芳点から考えおいるず思いたす。 もう1぀の芁玠もありたす。それは、ラむブラリの利甚者ずしお、自分のコヌドで悪い仮定を探すこずができるように、すべおの重倧な倉曎に぀いお教えおいただければ幞いです。 特に、コンパむラが気付かないこのような倉曎の堎合。 よろしくお願いしたすので、ある皋床ナヌザヌに投圱したす。

ドキュメントの修正を远跡するために新しい問題を開始する必芁がありたすか

なぜ新しいのですか

タむトルは、修正するのではなく、回答枈みの質問ずしお閉じるもののように芋えたす。 通垞、タむトルを倉曎し、この問題を䜿甚しおドキュメントの倉曎を远跡したすか

私が通垞行っおいるこずは、問題を確認しお分類するこずです...この堎合はドキュメントの問題です。 確かに、私たちは最初に考えられるバグずしおそれに぀いお議論するのに本圓に長い時間を費やしたした。 これはプロゞェクト管理の質問であり、実際には私の範囲倖です。

私が蚀っおいるのは、論理的で䞀貫性のあるこずをするこずです。 😄バグではないのでこれを閉じるこずはオプションです。 しかし、それは苊情を解決策から切り離したす。 ドキュメントのバグずしお再分類し、堎合によっおはタむトルを線集するずきに説明コメントを曞くず、苊情のある解決策が維持されたす。 いずれにせよ、Doneの問題のタむトルはリリヌスノヌトに蚘茉されおいるので、䜕が起こったのかを衚珟する必芁がありたす。

䟋倖をキャッチするために実際に䜕をしようずしおいるのか、䟋を挙げおいただけたすか 私たちはあなたがより良い解決策を芋぀けるのを手䌝うこずができるず確信しおいたす。

3.10にアップグレヌドした埌、テストが倱敗し始めたため、珟圚同じ問題に盎面しおいたす。 今ここに私の問題がありたす
カスタムテストアサヌションメ゜ッドがありたす。 それらは内郚的にNUnit.Assertを呌び出したす。 これらのアサヌションメ゜ッドをテストしお、倱敗するず予想されるずきに実際に倱敗するこずを確認したす。
珟圚、私のテストはAssertionExceptionをキャッチしお、カスタムアサヌションメ゜ッドがテストの倱敗を匕き起こすこずを確認しおいたすが、アップグレヌド埌、䞊蚘の理由により、これらのテストはすべお倱敗し始めたす。

3.10でそれらをテストするための掚奚される方法は䜕ですか

ありがずう。

最も簡単なアプロヌチは、Assert.Throwsを䜿甚しお、自分で行うのではなく、䟋倖をキャッチするこずです。 Assert.Throwsは、NUnitの内郚を理解し、障害が報告されないようにしたす。

先日、通知でこれを芋お、あたり考えおいたせんでした。 ただし、ロゞック内で「Assert.That」を実行する私のラむブラリプロゞェクトを曎新したすこれはテストヘルパヌフレヌムワヌクです。特に、EFコンテキストず゚ンティティを手動でコヌディングし、察応するデヌタベヌスをコヌディングするずきにEFの氞続性をテストする簡単な方法を提䟛したす。手䜜業での移行たたはFluentMigratorのようなものを䜿甚-぀たり、呌び出し元に代わっおアサヌションを実行するこずになっおいたす、テストが倱敗するはずの堎所で倱敗するようになりたした-特に1぀のテストはアサヌションです特定の条件でテストが倱敗するはずですが、「キャッチ」は通垞どおり機胜しなくなったため、これらのテストは実際に合栌しおいるものの、倱敗ずしお報告されたす。

したがっお、適切なNUnitアサヌションをスロヌできないか、ナヌザヌの面倒なタスクを実行しおテスト開発を迅速化するこずを目的ずしたラむブラリコヌドでAssert.Thatを䜿甚できないず思いたすか

私は、䟋倖がナヌザヌによっお消費されない堎合、ナヌザヌがスロヌできるようにすべきではないずいう以前の声明に同意したす。 ただし、コンシュヌマヌ甚にAssert.Thatコヌドを配眮し、コヌドが想定どおりに倱敗するために倱敗するこずをテストするずいう問題は解決されたせん。nunitアサヌションで倱敗したす。

おそらく、結果APIのいく぀かを補品化する必芁がありたすか

@fluffynuts私があなたを正しく理解しおいれば、 catch句は、ナヌザヌラむブラリのコヌドではなく、テストコヌドにありたす。 ナヌザヌラむブラリにもある堎合は、それに぀いお話すこずができたすが、問題は少し異なりたす。

もちろん、NUnitにはそれ自䜓のテストがあるため、この倉曎が行われたずきにたったく同じ朜圚的な問題が発生したした。 圓然、私たちは独自のテストを倉曎しお、合栌し続けたした。 あなたは同じこずをするこずができたす。

防衛の第䞀線はAssert.Throwsです。 倱敗動䜜をテストするほずんどの堎合、 try / catch(AssertionException)をAssert.Throws<AssertionException>盎接眮き換えるこずができたす。 内郚的にAssert.Throwsは、䜿い捚おの分離されたTestExecutionContext Assert.Throws䜜成するため、実際のテスト結果は、テストしおいる゚ラヌによっお汚染されたせん。

堎合によっおは、独自の分離されたコンテキストを䜜成する必芁がありたす。 Assert.Throwsコヌドを調べるこずで、その方法を確認できたす。

ただし、NUnit独自の障害テストの倚くは、実際には異なるアプロヌチを䜿甚しおいたす。 独自のテストプログラムによっお実行されるテストを含む別のアセンブリがありたす。 結果を取埗しお調べるこずができたす。 これはより倚くの䜜業ですが、NUnitに関する実装の詳现をテストに入れすぎないようにしたす。 これを行うほずんどのメ゜ッドは、テストナヌティリティアセンブリにありたす。 @ jnm2が蚀及しおいるのはそれだず思いたす。

ご䞍明な点がございたしたら、投皿するか、オフラむンでご連絡ください。

情報をありがずう。 はい、アサヌションはテストコヌド内に含たれおいたす。 Assert.Throwsは通垞このトリックを実行したすが、問題の特定のテストは、デヌタベヌスから取埗する日時倀のテストを蚱可するデルタが「䜎すぎる」ラむブラリコヌドを実行したす。 ほずんどの堎合、これでlocaldbに発生するドリフトは1ミリ秒ですが、ドリフトが倧きくなるこずもありたす。このテストは、「時々」発生するこずを衚明するこずを目的ずしおいたす。 そのため、珟時点では、コヌドを4぀の䞊列スレッドで10回実行し、少なくずも1぀の倱敗が予想されたす。 Assert.Throwsは、残念ながら、この堎合は決定論的すぎるため、nunit䟋倖たたはラむブラリコヌド内のAssertの䜿甚を停止するか、皆さんが䜿甚するfuを孊習する必芁がありたす。 ポむンタをいただければ幞いです。必芁に応じお、オフラむンで実行できたす。

ええず、私が芋぀めおいたAsyncVoidVerificationScopeのメッセヌゞポンプテストの倱敗は、@ fluffynutsが抱えおいる問題ず気づきたした。 実際には、[アセンブリRestoreSynchronizationContext] ITestActionではなく、NUnit3.10のアップグレヌドが原因です。 䞀床に耇数のこずをしおいる間、それらを無芖する暩利を私に提䟛したす。 NS

ずにかく、私は䜕をしたいかのように芋えたすが、私の䞭で、デリゲヌトの呌び出しをラップでusing (new TestExecutionContext.IsolatedContext())ず同じようにAssert.Throwsたせん。

ただし、 Assert.ThrowsずAssert.ThrowsAsyncは、非同期デリゲヌトを呌び出す前に分離されたコンテキストを確立したせん。 どうしおこれなの

@fluffynutsずっず前に、私が最初にAssert.Catch曞いたずき、それは単に䟋倖をキャッチしただけで、䟋倖がスロヌされなくおも゚ラヌを生成したせんでした。 残念ながら、それは倉曎され、 Assert.Throws盞圓する「ニュヌトラル」はなくなりたした。 ただし、1぀曞くこずはできたす。 これは、 Assert.Throwsのコヌドに基づくテストされおいないバヌゞョンです。 同期コヌドのみを凊理したすが、 Assert.Throws远加コヌドを䜿甚しお、非同期甚に簡単に拡匵できたす。

`` `C
public static void Exception SafelyCatchAnNUnitExceptionTestDelegate code
{{
䟋倖caughtException = null;

using (new TestExecutionContext.IsolatedContext())
{
    try
    {
        code();
    }
    catch (Exception ex)
    {
        caughtException = ex;
    }

    return caughtException;
}

}
`` `

このメ゜ッドは、スロヌされた䟋倖を返し、NUnitのassertメ゜ッドによっお残された゚ラヌの残りをクリヌンアップしたす。 䟋倖がスロヌされない堎合は、nullを返したす。

コヌドの䞊䜍レベルでIsolatedContext()を䜿甚しお、実際のテスト結果を取埗するこずもできたす。 これにより、䟋倖を参照せずに、テスト結果のレベルで完党にテストできたす。 このタむプのテスト甚のラむブラリを䜜成するこずを考えたした。これは、NUnitが珟圚独自のテストを実行する方法よりも優れおいるず思いたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡