Menu

FrontPage

Eclipseプラグイン
Eclipse小技集
リファクタリング講座
テスティングフレームワーク JUnit
MSDEについて



The 20 newest affair
2010-09-092010-09-082010-09-072010-09-062010-09-012010-08-312010-08-272010-08-242010-08-232010-08-172010-08-162010-07-302010-07-212010-07-132010-06-272010-06-182010-06-172010-06-16
version 0.8.0用ページ

brunch%について


    djUnitのカバレッジレポートに出力される「brunch%」は、一般的な「分岐網羅(C1)」とは異なる値です。

  version0.8.0でjcoverageの一部に修正を加えたため、オリジナルのjcoverageのbranch%とは異なる結果になります。

以下djUnitのbrunch%測定方法を解説します。


測定方法  Λ


djUnitは、バイトコード加工時に「条件分岐の行」を検出(あくまでもバイトコードレベルで)すると、
その行を「conditionライン」として保持します。

シンプルな分岐を例にします。

 1  class Branch {
 2    public void method(boolean flag) {
 3      if (flag) {
 4        System.out.println("true");
 5      }
 6    }
 7  }

上記では、3, 4, 6行目がconditionラインです。

そして、カバレッジ計算時(レポート生成時)に、conditionラインを実行したかどうかを判定し、


  (対象クラスの実行されたconditionライン数の合計) / (対象クラスのconitionライン数の合計) × 100


がbranch%の値になります。

ですので、3, 4, 6行目が、すべて実行された場合、branch% = 100%となります。
もし、3, 6行目だけが実行された場合には、branch% = 66% となります。


このconditionラインは、現状のdjUnitでは、目で見ることができないため、わかりにくいです。

「分岐網羅(C1)」は、分岐条件を「true」「false」の両方の条件で実行して100%となるべきですが、
上記の例では、3行目の条件が「true」の場合を実行しただけで、すべてのconditionラインを実行できてしまいます。
ここが「分岐網羅(C1)」と違うと思います。

conditionラインについて  Λ


もう少し複雑な場合のconditionラインの例を書きます。

1. if - else

  下記のようなelse有りのときは、分岐網羅に近い値を測定できます。

 1  class Branch {
 2    public void method(boolean flag) {
 3      if (flag) {
 4        System.out.println("true");
 5      } else {
 5        System.out.println("false");
 6      }
 7    }
 8  }

2. if - elseif - else

  これも、分岐網羅に近い値を測定できます。

 1  class Branch {
 2    public void method(int number) {
 3      if (number == 0) {
 4        System.out.println("number == 0");
 5      } elseif (number < 0) {
 6        System.out.println("number < 0");
 7      } else {
 8        System.out.println("number > 0");
 9      }
10    }
11  }


3. if - (if - else) - else - (if)

  12行目にelse無しのifがあるため、分岐網羅を測定できません。

 1  class Branch {
 2    public void method(int number) {
 3      if (number == 0) {
 4        System.out.println("number == 0");
 5        if (number == 0) {
 6          System.out.println("number == 0");
 7        } else {
 8          System.out.println("number > 0");
 9        }
10      } else {
11        System.out.println("number < 0");
12        if (number == 0) {
13          System.out.println("number == 0");
14        }
15      }
16    }
17  }

4. switch

 1  class Branch {
 2    public void method(int number) {
 3      switch (number) {
 4        case 0 :
 5          System.out.println("0");
 6          break;
 7        case 0 :
 8          System.out.println("0");
 9          break;
10        default :
11          System.out.println("0");
12          break;
13      }
14    }
15  }

以上


Attached File: [Attached File All List]

Lastmodified: 2007-12-14 (金) 17:03:38 (999d)