2011-07-14 12 views

答えて

1

私は、実行時に、または静的解析を使用して2つの選択肢があると思います。ランタイム

あなたは(TestNGのは、同様の抽象化を持っている)のJUnitのRunListenerを使用して、実行時に、あなたのテストにフックすることができますが、アサーションが行われた場合、どのように言うことができますか?単純ではありませんが、Java Agentを使用すると可能です。 Javaエージェントと、バイトコード操作を行うライブラリを使用して、JVMにロードされる「アサーション」メソッドの動作を変更することができます。あなたの変更されたメソッドは、あなたのRunListenersを呼び出さなければならないし、その後彼らの主張を黙っていなければならないでしょう。あなたは "assertion"(junit?testng?hamcrest?など)として数えられるすべてのメソッドをリストすることができる必要があります。ピー!私は過去にこれすべてをやったことがありますが、それはかなり厄介でしたが、うまくいきます。あなたのケースでは

静的解析

、静的解析は、より良い選択であるように思われます。すべての@Testアノテーション(またはTestNGに相当するもの)のクラスパスをスキャンし、どのクラスが "assert"を開始するメソッドを呼び出すかを確認することができます。私はjavaparserを使ってこれに似たようなことをしてきました。

他の答えで説明したように、例外がスローされないという暗黙のアサーションが常に存在することに注意してください。私たちはスイートの中にいくつかの有効で有用なテストを行っていますが、そのために明示的なアサーションはありません。

+0

私は既にテストコードを反映したものを持っており、どのテストメソッドが実行されているのかを把握しています(どのテストが実行されていないのかわかります)。 "javap -c"の出力は、どのテストにアサーションがあるかを知るのに役立ちます(古い方法では、 'Assert.fail'への呼び出しがあり、アサーションは新しい方法で呼び出されます) 'ExpectedException.expect'の呼び出しがあります)。 これは、少なくとも直接アサーションを持つテストでは間接的アサーションでは機能しません。とにかくアサーションは直接的でなければなりません。 –

0

私はあなたの最善の策は、正規表現の検索や静的解析のようなものだと思います。いずれにしても、テストメソッドを特定し、それらがアサーションを含んでいるかどうかを判断することができなければなりません。assertionはいくつかのassertコール、モック検証、および/または "予期される例外"句です。これらのすべてが何らかの「アサーション」を構成します。

+1

、暗黙のアサーション - アサート(例外はスローされません)がしばしばあります。 –

1

単純なアプローチは、テストの数だけでなくテストメソッドで使用されるアサートも印刷できるアサートカウンタをサポートするJUnitとTestNGでした。

私はすべてのメソッドをオーバーライドし、カウンターを持っているAssertクラスのラッパーを書かれている。..

あなたはまた、IntelliJのの構造サーチ

よろしくを使用しようとすることができ、 Nagendraもちろん

関連する問題