JUnit

JUnitのアサーションを利用してみた

Javaのプログラムの単体テストを自動化するツールに「Junit」があり、これを利用すると、テストを自動化でき、繰り返し実行できるようになる。

今回は、Javaの単体テストを自動化できる「Junit」の、よく使うアサーションである、org.junit.Assertクラスに含まれる「assertEquals」「assertTrue」「assertFalse」「assertNull」を使用した、作成したJunitのサンプルプログラムを共有する。

前提条件

下記記事の「IntelliJ IDEA上でSpring Bootプロジェクトの読み込み」までの手順が完了していること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...

サンプルプログラムの内容

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上図の赤枠は、今回記載するサンプルプログラムの内容である。

「build.gradle」については、以下の通りで、前提条件の内容と特に変更していない。「testImplementation ‘org.springframework.boot:spring-boot-starter-test’」が入っていることにより、junitのアサーションが利用できる。

plugins {
	id 'org.springframework.boot' version '2.1.7.RELEASE'
	id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

実際に外部ライブラリを確認すると、下図の赤枠のように、junitが含まれている。
外部ライブラリのjunit



また、テスト対象のプログラム「DemoUtil.java」の内容は以下の通り。今回は、下記クラス内のpublicメソッドをテスト対象にしている。

package com.example.demo;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.ResolverStyle;

public class DemoUtil {

    /**
     * 日付チェック処理を行う
     * @param year 年
     * @param month 月
     * @param day 日
     * @return 判定結果(1:年が空、2:月が空、3:日が空、4:年月日が不正、0:正常
     */
    public static int checkDate(String year, String month, String day){
        final String dateFormat = "uuuuMMdd";
        if(isEmpty(year)){
            return 1;
        }
        if(isEmpty(month)){
            return 2;
        }
        if(isEmpty(day)){
            return 3;
        }
        String dateStr = year + addZero(month) + addZero(day);
        if(!isCorrectDate(dateStr, dateFormat)){
            return 4;
        }
        return 0;
    }

    /**
     * 数値文字列が1桁の場合、頭に0を付けて返す
     * @param intNum 数値文字列
     * @return 変換後数値文字列
     */
    public static String addZero(String intNum){
        if(isEmpty(intNum)){
            return intNum;
        }
        if(intNum.length() == 1){
            return "0" + intNum;
        }
        return intNum;
    }

    /**
     * 引数の文字列がnull、空文字かどうかを判定する
     * @param str チェック対象文字列
     * @return 文字列チェック結果
     */
    public static boolean isEmpty(String str){
        if(str == null || "".equals(str)){
            return true;
        }
        return false;
    }

    /**
     * DateTimeFormatterを利用して日付チェックを行う
     * @param dateStr チェック対象文字列
     * @param dateFormat 日付フォーマット
     * @return 日付チェック結果
     */
    private static boolean isCorrectDate(String dateStr, String dateFormat){
        if(isEmpty(dateStr) || isEmpty(dateFormat)){
            return false;
        }
        //日付と時刻を厳密に解決するスタイルで、DateTimeFormatterオブジェクトを作成
        DateTimeFormatter df = DateTimeFormatter.ofPattern(dateFormat)
                .withResolverStyle(ResolverStyle.STRICT);
        try{
            //チェック対象文字列をLocalDate型の日付に変換できれば、チェックOKとする
            LocalDate.parse(dateStr, df);
            return true;
        }catch(Exception e){
            return false;
        }
    }

}



さらに、作成したJUnitプログラム「DemoUtilTest.java」の内容は以下の通り。テスト対象となるメソッドには、アノテーション「@Test」を付与している。org.junit.Assertクラスに含まれる「assertEquals」「assertTrue」「assertFalse」「assertNull」を使用して、テスト対象メソッドの戻り値を確認している。

package com.example.demo;

import org.junit.Test;
import static org.junit.Assert.*;

public class DemoUtilTest {

    /**
     * DemoUtilクラスのcheckDateメソッドの確認
     */
    @Test
    public void testCheckDate(){
        //第一引数yearがnullまたは空文字の場合に、1が返ってくることを確認
        //assertEquals(期待値, 実際の値)は、期待値=実際の値であればOKと判断する
        int return1 = DemoUtil.checkDate(null, "12", "14");
        assertEquals(1, return1);

        //第二引数monthがnullまたは空文字の場合に、2が返ってくることを確認
        int return2 = DemoUtil.checkDate("2019", "", "14");
        assertEquals(2, return2);

        //第三引数dayがnullまたは空文字の場合に、3が返ってくることを確認
        int return3 = DemoUtil.checkDate("2019", "12", null);
        assertEquals(3, return3);

        //引数のyear,month,dayがあり得ない日付の場合に、4が返ってくることを確認
        int return4 = DemoUtil.checkDate("2019", "2", "29");
        assertEquals(4, return4);

        //引数のyear,month,dayが正しい日付の場合に、5が返ってくることを確認
        int return5 = DemoUtil.checkDate("2019", "12", "14");
        assertEquals(0, return5);
    }

    @Test
    public void testAddZero(){
        //引数がnullの場合に、nullが返ってくることを確認
        //assertNull(実際の値)は、実際の値=nullであればOKと判断する
        String return1 = DemoUtil.addZero(null);
        assertNull(return1);

        //引数が空文字の場合に、空文字が返ってくることを確認
        String return2 = DemoUtil.addZero("");
        assertEquals("", return2);

        //引数が1桁の文字列の場合に、先頭に0が付与されることを確認
        String return3 = DemoUtil.addZero("1");
        assertEquals("01", return3);

        //引数が2桁以上の文字列の場合に、引数の値が返ってくることを確認
        String return4 = DemoUtil.addZero("11");
        assertEquals("11", return4);
    }

    @Test
    public void testIsEmpty(){
        //引数がnullの場合に、trueが返ってくることを確認
        //assertTrue(実際の値)は、実際の値=trueであればOKと判断する
        boolean return1 = DemoUtil.isEmpty(null);
        assertTrue(return1);

        //引数が空文字の場合に、trueが返ってくることを確認
        boolean return2 = DemoUtil.isEmpty("");
        assertTrue(return2);

        //引数がnull・空文字以外の場合に、falseが返ってくることを確認
        //assertFalse(実際の値)は、実際の値=falseであればOKと判断する
        boolean return3 = DemoUtil.isEmpty("abcde");
        assertFalse(return3);
    }
}

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/junit-assertion/demo



フリーランスエンジニアのエージェントは就業中でも無料で登録できるITエンジニアには、フリーランスという働き方がある。 フリーランスとは、会社や団体などに所属せず、仕事に応じて自由に契約する人のこ...

また、作成したJUnitプログラムを実行するには、下図のように、通常のJavaプログラムの実行と同じように、対象プログラムを右クリックし「実行」を選択する。
JUnit実行結果1

実行した結果は下図の通りで、JUnitプログラムが正常終了することが確認できた。
JUnit実行結果2

なお、今回取り上げた以外にも、様々なアサーションが利用できる。その内容については以下を参照のこと。
https://waman.hatenablog.com/entry/20120923/1348350852

要点まとめ

  • JUnitのテスト対象となるメソッドには、アノテーション「@Test」を付与する。
  • org.junit.Assertクラスに含まれる「assertEquals」「assertTrue」「assertFalse」「assertNull」等のアサーションを利用すると、想定結果と合っているかの確認が行える。