3

Maven (2) Cobertura プラグインを使用してコード カバレッジに関するレポートを作成しています。メソッドで使用している次のスタブがあります。

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
}
System.err.println("The program never exited!");

例外などをログに記録する必要があることはわかっていますが、それは今のポイントではありません... Cobertura は、スタック トレースが出力された後の行がカバーされていることを認めることを拒否しています。つまり、System.err.printlnステートメントの前に「}」が付いている行は、カバーされているものとして表示されていません。以前は、メソッドの終了中かっこはカバーされているものとして表示されていなかったため、System.errステートメントが表示されていました。cobertura の maven プラグインに、System.err.printlnステートメントがカバーされているため、終わりのブレースがカバーされている必要があることを納得させる方法はありますか?

そうそう、モック セキュリティ マネージャーを使用してセキュリティ例外をスローします。これは、System.exit呼び出し後にテストを実行し続けるための最も簡単な方法であるためです。

4

4 に答える 4

9

取材レポートを見てみます。私のテストを再確認してください。コードが実際にカバーされており、100%に達することを心配しないことに注意してください。コードカバレッジは、テストでヒットすることを怠った可能性のある領域を見つけるために最もよく使用されますが、目標として100%のカバレッジを取得することに焦点を当てるのは悪い習慣であり、ツールが表示するという理由だけで作成する必要のあるテストをスキップする可能性があります100%。ツールを使用して何ができるかを確認しますが、ツールに実行内容を定義させるという罠にはまらないでください。

于 2008-10-13T01:44:19.363 に答える
4

Javaクラスファイル形式では、すべてのメソッドに、コードオフセットを行番号にマッピングするテーブルが注釈として付けられます。この場合、閉じ中括弧はバイトコードを生成しないため、カバーされません。これは、ソースとバイトコード間の不完全な対応の問題です。この行を非コードとして認識し、カバレッジツールで処理する必要があります。

エマにも同様の問題があることを私は知っています。クローバーの運賃ははるかに優れていますが、商用です(この場合も処理できるかどうかはわかりません)。IDEAを使用する場合は、新しいカバレッジの実装を試す必要があります。これは非常に優れており、活発に開発されています。

于 2008-10-13T02:00:21.767 に答える
1

私はしばらくの間(2005年?)Coberturaを使用していませんでしたが、当時この動作を見ました。同様の問題は、C#のNCoverと、catch/finallyブロックに続く中括弧にも存在します。

私の提案は、同様の問題を詳述するこのCoberturaバグレポートに追加することです。また、@ tvanfossonのアドバイスに従って、JVMでは実際には何にもならない中括弧をカバーしないことは「ノイズ」として無視できるものであることを認識してください。

于 2008-10-13T01:46:58.890 に答える
0

これは古い質問であり、Cobertura は既にこれを修正していることを知っていますが、完全を期すために、"}" のカバレッジの欠落は、内部の自動的な "finally" ブロックが原因でした。

コードを次のように参照してください。

try {
    System.exit(0);
} catch (final SecurityException exception) {
    exception.printStackTrace();
} finally {
    // noop
}

幸いなことに、これは一部のバージョンでは発生しなくなりました。

于 2013-05-28T17:44:35.147 に答える