明日からできるプロジェクト管理(4)
単体テストの品質をチェックするには
1page2page3page

高野敦
2006/1/12

◆ メトリクスを計測するためのツール

 品質を評価するために必要なメトリクスを前頁で説明しました。これらのメトリクスを人間が計測しても良いのですが、中には計測が困難なものやコストが多く掛かるものがあります。そのため計測するツールが開発されています。これらのツールの中からオープンソースで提供されているもののいくつかを紹介します。

● ツールで評価するサンプルプログラム

 ツールを紹介する前に、ツールで評価するサンプルプログラムの説明をします。このプログラムは2つのチェックを行うメソッドを実装したUtilクラスとそのメソッドをテストするUtilTestクラスがあります。このプログラムについて、ツールでメトリクスを測ります。

・Util.java

package example.util;
/**
    * @IT用テストプロジェクトのユーティリティクラス
    * @author takano
    *
    */
public class Util {

        /**
        *
        * @param estValue
        * @return 判定値
        * 引数の値:0または負の値                -1
        *         1の場合                        1
        *         2の倍数                        2
        *         3の倍数                        3
        *         その他                        99
        */

        public int checkValue(int estValue){
            int retValue;

            if(estValue <=0){
                return -1;
            }

            if(estValue % 2 == 0){
                return 2;
            }

            if(estValue % 3 == 0){
                return 3;
            }

            if(estValue % 5 == 0){
                return 5;
            }

            return 99;

        }

            /**
            *
            * @param esm
            * @return 判定値
            * 引数の値:ABCの場合                1
            *          それ以外の場合            0
            */

            public int checkString(String esm){

                if(esm == "ABC"){
                    return 1;
                }else{
                    return 0;
                }
        }

}

 ツールによるコードレビューを実施するために、このコードにいくつかの欠陥を埋め込んであります。仕様はJavadocの形式でソースコードに記述しています。

 また、テストコードは以下のとおりです。

・UtilTest.java

package example.util;

import junit.framework.TestCase;

public class UtilTest extends TestCase {

    private Util util = new Util();

    public UtilTest(String name){
        super(name);
    }

    public void testCheckValueCase1(){
        assertEquals(util.checkValue(-1),-1);
    }

    public void testCheckValueCase2(){
        assertEquals(util.checkValue(0),-1);
    }

    public void testCheckValueCase3(){
        assertEquals(util.checkValue(1),1);
    }

    public void testCheckValueCase4(){
        assertEquals(util.checkValue(2),2);
    }

}

 このテストコードもUtilクラスと同様に欠陥を埋め込んであります。

● コードレビューツールにおけるツール

 コードレビューは人間の手で行うことが多いですが、ツールによって行うこともできます。ここでは、ビルド時にできるレビューツール(ツールによるレビューの実施)と人間が行うレビューを支援するツールを紹介します。

○ FindBugs

- PR -
  FindBugsは、Creative Commons Attribution-NonCommercial-ShareAlike Licenseで提供されるオープンソースのコードレビューツールです。FindBugsによってツールによるコードレビューを実施します。EclipseのPluginなども提供されているので各プログラマがこのツールを利用して、随時レビューすることも可能です。ここではビルド時にレビューする方法を説明します。詳細については、「ソフトウェアの品質向上を支援するプラグイン」や「開発のプロが教える標準FindBugs完全解説」(アスキー)を参照してください。

 ビルド時にFindBugsを実行するためにMavenを利用します。Mavenについては、前回の記事「ビルド管理を楽にするオープンソースツール一覧」を参照してください。MavenでFindBugsを利用するためにproject.xmlに以下の設定を行い、siteゴールを実行します。

<設定>

 <dependencies>に以下のコード片を追加します。

<dependency>
    <groupId>maven-plugins</groupId>
    <artifactId>maven-findbugs-plugin</artifactId>
    <version>1.0</version>
    <type>plugin</type>
</dependency>

  <reports>に以下のコード片を追加します。

<report>maven-jxr-plugin</report>
<report>maven-findbugs-plugin</report>

 FindBugsプラグインをダウンロードするために<dependency>の設定を行っています。ダウンロードプラグインを利用してダウンロードする場合この設定は必要ありません。<report>の設定としてFindBugsプラグインの設定だけではなく、Javaクロスリファレンスプラグインの設定をしています。これは、FindBugsプラグインが出力するレポートがJavaクロスリファレンスプラグインが出力するレポートをリンクしているためです。

 siteゴールを実行した結果としてプロジェクトフォルダにtargetフォルダが作成され、docsフォルダの下にindex.htmlが作成されています。このHTMLを表示すると以下のようになります。

図1 Mavenのレポート(クリックすると拡大)

 この画面の左側メニューの「プロジェクトレポート」を選択して、FindBugsReportを選択するとレポート結果を見ることができます(もし日本語が化けている場合は、プロジェクトフォルダのproject.propertiesファイルにmaven.docs.outputencodingにエンコーディングを指定してください)。

図2 FindBugsレポート(クリックすると拡大)

 46行目に「esm == "ABC"」と文字列を==で比較している部分があります。このコード片は確かに問題があり、一般的に文字列の比較はequals()メソッドを利用しなければなりません。このことをFindBugsは指摘しています。

 PMは、まずSummaryというところを確認し、全体状況としてどの程度の指摘があったのかを確認します。

 指摘数が多い場合は、Filesを確認してどのファイルに指摘が多いのかを確認します(図の2番目の囲み)。ここでファイルに偏りがないかを「体制や作成者」の情報を基に確認します。もし偏りがある場合は、そのチームや個人に対して品質に関する何らかの手を打つ必要があります。このようにPMは、全体から修正個所へブレイクダウンし、欠陥の分布に偏りがないかを確認していきます。品質は感覚で確認することはできません。このような情報を基に判断することが重要です。

 FindBugsで指摘される内容はできる限り直した方がよい内容です。このレポートを基にPMと開発者の間で修正の計画を確認していきます。開発者がどの行に問題があるかを確認する場合は、このレポートの行数をクリックすることでJavaクロスリファレンスプラグインが生成するHTML化されたソースコードのページに飛ぶことができます。

図3 クリックした結果(クリックすると拡大)

○ Checkstyle

 Checkstyleは、GNU LESSER GENERAL PUBLIC LICENSEで提供されるオープンソースツールです。FindBugsと同様にコードをレビューするツールです。FindBugsは欠陥の起こりやすいコードパターンをレビューしますが、Checkstyleはスタイルを中心としたコード規約を守っているかをレビューします。

 EclipseのPluginなども提供されているので各プログラマがこのツールを利用して、随時レビューすることも可能です、ここではビルド時にレビューする方法を説明します。詳細については「コーディング規約に従わないコードを検索する」を参照してください。

 ビルド時にCheckstyleを実行するためにFindBugsと同様にMavenを利用します。以下の設定をproject.xmlに行い、siteゴールを実行します。

<設定>

 <report>に以下のコード片を追加します。

<report>maven-checkstyle-plugin</report>

 FindBugsと同様にCheckStyleによるレポートを参照すると、以下の図のようになります。

図4 CheckStyleによるレポートを参照すると

 このレポートによるとUtil.javaにはフォーマットなどの欠陥が41個あると指摘されています。

 PMはFindBugsと同様に確認していきます。ここではデフォルトのルールセット(Sunのコーディング規約)を利用してチェックしていますが、プロジェクトによっては利用しないルールもあるかもしれないので、Checkstyleのルールファイルを調整する必要があるでしょう。

○ CodeStriker

 CodeStrikerは、GNU GENERAL PUBLIC LICENSEで提供されるオープンソースのコードレビュー支援ツールです。

 CodeStrikerは上の2つのツールとは異なり、ツールがコードの品質を計測するのではなく人間がレビューすることを支援するツールです。筆者は利用したことがないので簡単な紹介にとどめます。ここで紹介した意図はツールによる自動化だけではなく、人間のレビューを支援するツールがあることを強調したかったためです。

2/3

 INDEX

明日からできるプロジェクト管理(4)
単体テストの品質をチェックするには
  Page1
◆ 品質の考え方
Page2
◆ メトリクスを計測するためのツール
  Page3
● 単体テスト(BlackBox)におけるツール

IT Architect 連載記事一覧


この記事に対するご意見をお寄せください managemail@atmarkit.co.jp

キャリアアップ

@IT Sepcial

「ITmedia マーケティング」新着記事

2023年のSNS炎上総数は189件、炎上元の媒体1位は「X」――コムニコ「炎上レポート」
コムニコが「炎上レポート」2023年版を公開しました。

今度の「TikTok禁止」はこれまでとどう違う?
米国ではまたしてもTikTok禁止措置が議論されている。これまでは結局実現に至らなかった...

「ゼロクリック検索」とは? SGE時代の検索の変化と5つの対策を解説
SEO専門家やマーケター、そして情報を求める人々にとって、「ゼロクリック検索」はどのよ...