この章では、開発したJavaプログラムの動作を検証するための方法について説明します。
この章での内容を学習することにより、プログラムのテスト手法の一つ、ユニットテスト(単体テスト)を行うことができます。
開発するプログラムを機能単位でテストすることをユニットテストと言います。
EclipseではJavaプログラムのテストのためにJunitという機能を使います。
準備
パッケージ名:com.example
クラス名:DateData
まず初めに、検証するプログラムとして与えられた年月日より、その年が閏年であるかを判定するプログラムを作成します
上記のコードを記述してください。
プログラムは
パッケージ名:com.example
クラス名:DateData
とします。
テストプログラム
テストプログラムの作成
パッケージ名:com.example
クラス名:TestMain
package com.example;
public class TestMain{
public static void main(String[] args){
DateData dd;
dd = new DateData();
dd.setDateData("20220920");
if(dd.isToday(dd.getDateData())){
System.out.printf("%s は 今日です¥n", dd.getDateData());
} else {
System.out.printf("%s は 今日ではありません¥n", dd.getDateData());
}
if(dd.isLeapYear(dd.getData())){
System.out.printf("%s はうるう年です¥n", dd.getDateData());
} else {
System.out.printf("%s はうるう年ではありません¥n", dd.getDateData());
}
System.out.printf("今日は%sです¥n", dd.getToday());
}
]
上記コードを記述してください。
プログラムは
パッケージ名:com.example
クラス名:TestMain
とします。
これが実際に判定を行うメインプログラムとなります。
テストプログラムを実行
プログラム「TestMain.java」を実行します。
テストプログラムについて
実際に実行してみたところ、現在の日付を10月30日と返しましたが、このプログラムを実行したのは11月30日です。
よって、日付が1ヶ月遅れるというバグ(不具合)があることになります。
このような場合、ユニットテストを行うことで原因を追求できます。
JUnitでテストプログラム
JUnitでテストプログラムを作成
package com.example;
import java.utill.Calendar;
import static org.junit.jupiter.api.Assertions.*;
class DateDataTest{
DateData dd;
DateDataTest(){
dd = new DateData();
}
@org.junit.jupiter.api.BeforeEach
void setUp(){
}
@org.junit.jupiter.api.AfterEach
void tearDown(){
}
@org.junitjupiter.api.Test
void setDateData(){
dd.setDateData(null);
assertNull(dd.getDateData());
}
@org.junit.jupiter.api.Test
void getDataDate(){
dd.setDateDate("20220916");
assertEquals("20220916", dd.getDateData());
}
@org.junit.jupiter.api.Test
void getToday(){
Calendar cal = Calendar.getInstance();
String toDay = String.format("%02d", cal.get(Calendar.YEAR)) + String.format("%02d", cal.get(Calendar.MONTH) + 1) + String.format("%02d", cal.get(Calendar.DAY_OF_MONTH));
assertEquals(toDay, dd.getToday());
}
@org.junit.jupiter.api.Test
void isToday(){
assertEquals(true, dd.isToday(dd.getToday()));
}
@org.junit.jupiter.api.Test
void isLeapYear() {
assertEquals(true, dd.isLeapYear("20220916"));
assertEquals(false, dd.isLeapYear("20230916"));
assertEquals(true, dd.isLeapYear("20000916"));
assertEquals(true, dd.isLeapYear("2020"));
assertEquals(false, dd.isLeapYear("2021"));
assertEquals(true, dd.isLeapYear("20000"));
}
}
JUnitでユニットテストを行うための準備をします。
ファイル→新規→その他をクリックします。
ウィザードを実行画面より、JUnitテスト・ケースを選び、次へをクリックします。
テストケースに名前をつけます。
ここでは「DateDataTest」とします。
プログラムの不具合を検査するために、上記のテストコードを書きます
JUnitでテストプログラムを実行
テストプログラムを実行して原因箇所を特定します。
DateDataTest.javaを右クリック→実行→Junitテストをクリックします。
画面下、Junitタブに結果が表示されます。テストされた項目は5つ、うち2つが失敗していることがわかります。
さらに、その内訳としてgetToday()メソッドとisToday()メソッドが原因であることがわかりました。
さらにその右側にテスト内容が表示されます。
エラーとしてAssertionFailedErrorが発生しており、年月日の値である<20221130>と<20221030>の比較に矛盾が生じている旨を示しています。
実際の実行結果と同じ結果です。
テスト結果のエクスポート
テスト結果を記録しておく場合、エクスポートを行います。エラー内容が表示されてるあたりの3つ縦に点が並んでいる左の下三角「▼」を押して、エクスポートをクリックします。
エクスポート場所を確認し、[Save]を押します。