8

カバレッジ分析には EclEmma を使用しています。

私の Java コードには、synchronized(MyClass.class) {} ブロックが含まれています。

EclEmma は、部分的にしかカバーされていないと言っていますが、1 つのスレッドがアクセスし、別のスレッドがブロックされる単体テストがあります。

EclEmma を使用して Synchronized を完全にカバーすることは可能ですか?

この行を完全にカバーするように EclEmma に指示するために、何らかの方法でコードに注釈を付けることはできますか?

よろしくロジャー

4

3 に答える 3

7

問題 2939804が次のように報告されているため、完全にカバーできるかどうかはわかりません。

EMMA は常に部分的にカバーsynchronized(..)されているとマークします

例:

synchronized (lock) // partially covered (yellow line in EclEmma)
{
// ...
}
synchronized (this) // partially covered (yellow line in EclEmma)
{
// ...
}

別のツール ( Cobertura など) を使用すると、別の結果が得られるのでしょうか? (私は最近それをテストしていません)。


2012 年 12 月の更新 (2 年以上後):

ネイサン・D・ライアンは次のよう に報告しています

synchronized同期ブロックにオブジェクト モニターで待機するコードが含まれていて、テストによって待機中のスレッドが中断された場合は、緑色に点灯します。

少し実験した後、ブロックが正常に完了し、例外により突然完了しsynchronizedた場合に、行を完全にカバーすることができました。synchronized

于 2010-09-15T06:38:35.430 に答える
1

EclEmma は、カバレッジ分析に Jacoco を使用しています。

Jacoco の (現在存在しない) JAVAC.SYNC フィルタリング オプションで説明されているように、動作は同期ブロック用に生成されたバイト コードの結果です。

Java 同期ブロックは、2 つのバイトコード命令にコンパイルされます。ブロックの最初の MONITORENTER と最後の MONITOREXIT です。

どのような場合でもモニターが確実に解放されるようにするために、別の MONITOREXIT 命令を指す例外ハンドラーがインストールされます。この例外ハンドラー ブロックは通常、ソース コードの観点からは意味をなさない部分的な行カバレッジを引き起こします。

関連するJacoco issue 245では、@nathan-ryan によっても説明されているように、必要に応じて例外をトリガーして完全なカバレッジに到達する方法について説明しています。

  1. 同期ブロックを正常に実行する 1 つのテスト
  2. 2 番目のテストでは、同期ブロック内から例外がスローされます (したがって、予期されます)。
于 2016-06-01T11:18:40.543 に答える
0

問題はMyClass.class明らかに実装されていると思います

http://emma.sourceforge.net/faq.html#q.fractional.examples

非表示の Class.forName() による暗黙の分岐。このケースは非常によくあることですが、プログラマはほとんど制御できないため、かなり残念です。

Class.forName() はチェック済み例外をスローできるため、コンパイラーはそれらを未チェックとして再スローする catch ブロックを発行します。この catch ブロックが実際に実行されることはほとんどありませんが、部分的にカバーされている行をマークすることに成功しています。

私は最初の読み切りでそれを見逃しました。

コードを書き直して、完全にカバーできるようにします。

/ロジャー

于 2010-09-15T07:48:06.683 に答える