あしたは晴れるかな。ii

駅前SEのお勉強ブログです。備忘録を兼ねて徒然事をアップしていきます。

お試し jUnit4。その1。

Javaプロジェクトの単体テストをする上でメジャーなアプリケーション jUnit さんを入れてみよう。

 

 環境

eclipse : 4.2

jre : 1.7

 

64bit 用の jUnit 最新版は junit-3.8.2-6.5.el6.x86_64 らしいので、yum install。

 yum install junit
Setting up Install Process
Package junit-3.8.2-6.5.el6.x86_64 already installed and latest version
Nothing to do
もう入ってたらしいので、使ってみます。(eclipse4.2に最初から入ってますね。)

 

ということで今回は、適当なクラスを作り、

そのクラスをテストするJunitクラスを作って簡易テストしてみたいと思います。

 

今回のお試しクラスとメソッド

クラス:CalcSosu

メソッド:String checkSosu(long l)

  ・l が素数か否かを文字列で返却する。

  ・l が有効範囲外であれば無効である旨の文字列を返却する。

 

こんな感じです。

 

package calc.sosu;

public class CalcSosu {
    static final long MIN_VALUE=1;
    static final long MAX_VALUE=100*10000; // MAX100万
    private long myNumber=0;
   
    // コンストラクタ
    public CalcSosu(long l){
        this.myNumber=l;
    }

    // setter
    public void setMyNumber(long l){
        this.myNumber=l;
    }

    // getter
    public long getMyNumber(){
        return this.myNumber;
    }
   
    // 素数チェック
    // 素数か否か、または有効範囲外かを返却する
    public String sosuCheck(){
        if(!isValidValue(this.myNumber, MIN_VALUE, MAX_VALUE)){
            return "[ "+ this.myNumber+" ] は有効な数字ではないです";
        }
        if(isSosu(this.myNumber)){
            return "[ "+ this.myNumber+" ] は素数です!";
        }else{
            return "[ "+ this.myNumber+" ] は素数ではないです";
        }
    }
   
    // MIN_VALUE <= x <= MAX_VALUE を有効な数値とする。
    private boolean isValidValue(long l,long MIN_VALUE,long MAX_VALUE){
        if(MIN_VALUE<=l && MAX_VALUE>=l){
            // 有効範囲内にあれば TRUE
            return true;
        }else{
            // 有効範囲になければ FALSE
            return false;
        }
    }
   
    // 素数なら TRUE, 素数でなければ FALSE
    private boolean isSosu(long l){                   
        // 2で割りきれたら素数ではない
        if(l%2==0) return false;

        // 何かの整数で割りきれたら素数ではない
        // 入力値の半分までループする
        for(int i=1;i<l/2+1;i+=2){
            if(l%i==0){
                return false;
            }
        }
        // 最後まで残ったら素数
        return true;
    }
}

 

 

このクラス(メソッド)をテストするテストクラスを作ります。

※public methodのみテストします。

 

CalcSosuクラスを含むプロジェクトを選択し、「ソース・フォルダー」を新規作成します。テスト用のソースフォルダです。

アプリケーションのソースと分けて管理します。お作法(※2)どおり test フォルダとします。

※2 src と同階層の test フォルダを作ることが多いです。

 

パッケージ calc.sosu を作り、パッケージ内に新規 「jUnit クラス」を作成します。

右クリック→「新規」で見つからない場合は、「その他」から探します。

jUnit クラス「TestSosuClass」を作成します。テスト対象のクラスの頭に「Test」をつけるのが慣例だったりします。(クラスごとにテストクラスを作ることになります。管理しやすいし。進捗とか見やすいし。)

 

作ってみると、初めからjUnit のユーティリティをimportしており、@Testという印(アノテーション)がついています。このアノテーションごとにテストケースを区別します。

 

今回はお試しテストなので、網羅率とか考えずに適当に4ケース作ります。

  1. 1000は素数じゃない
  2. 1001は素数
  3. -1 は有効範囲外
  4. 1000001 は有効範囲外

テストケースの定番は、テストしたいメソッドの戻り値が期待している値になっているかどうかを確かめます。assertXXX というメソッドを使います。

今回使用する assertEquals( src, dst ) は、src と dst が"違う"値であれば、assert をあげて、テストを失敗させます。"同じ"値であれば何もしません。つまり、テストするメソッドのいくつかのパターンに対して、返却されるはずの期待値と、返却値を比較する assertEquals メソッドを作ります。すべてのテストメソッドで assert が上がらなければテスト成功です。

お試しコードは次のようにしてみました。

 

 

package calc.sosu;
import static org.junit.Assert.*;
import org.junit.Test;

public class TestCalcSosu {
    /** 素数 (1001). */
    @Test
    public void testSosuCheck_001() {
        CalcSosu target = new CalcSosu(1001);
        assertEquals("[ 1001 ] は素数ではないです", target.sosuCheck());
    }

    /** 素数でない (1000). */
    @Test
    public void testSosuCheck_002() {
        CalcSosu target = new CalcSosu(1000);
        assertEquals("[ 1000 ] は素数ではないです", target.sosuCheck());
    }

    /** 不正値 (-1). */
    @Test
    public void testSosuCheck_003() {
        CalcSosu target = new CalcSosu(-1);
        assertEquals("[ -1 ] は有効な数字ではないです", target.sosuCheck());
    }

    /** 不正値 (-1). */
    @Test
    public void testSosuCheck_004() {
        CalcSosu target = new CalcSosu(100*10000+1);
        assertEquals("[ 1000001 ] は有効な数字ではないです", target.sosuCheck());
    }
}

 

 TestCalcSosu クラスを右クリック→「実行」→「jUnit実行」でテストを開始します。

上記のテストはすべて成功します。

 

f:id:ashitawa:20130724231520p:plain

 

 

しょっぱいですねぇ。

つぎは ant で実行してみます。また djunitカバレッジも見てみたいと思います。

つづきます。。