チャットbotお試し用アプリ開発_8日目

# 目次

・本日の成果・考え
・最後に

### 本日の成果
共通関数のテストからやっていきました。

``` CommonFunctionTest.java
package test;

import static java.lang.System.*;

import org.junit.Test;

import util.CommonFunction;

public class CommonFunctionTest {

	//テストパターン　正常系　引数一つ
	@Test
	public void test1_1() {
		String className = new Object() {
		}.getClass().getName();
		String resultOutput = className + "のテストパターン1_1";

		try {
			out.println("**********************************************");
			out.println(resultOutput + "が開始されました。");
			CommonFunction.checkNullBlank("テスト");
			out.println(resultOutput + "が正常終了しました。");

		} catch (Exception e) {
			// TODO: handle exception
			String resultError = String.format("エラーが発生しました。内容は{%s}", e);
			out.println(resultError);

		} finally {
			out.println(resultOutput + "が終了しました。");
			out.println("**********************************************");
		}
	}
	//テストパターン　正常系　引数複数 *10
		@Test
		public void test1_2() {
			String className = new Object() {
			}.getClass().getName();
			String resultOutput = className + "のテストパターン1_2";

			try {
				out.println("**********************************************");
				out.println(resultOutput + "が開始されました。");
				CommonFunction.checkNullBlank("テスト","テスト","テスト","テスト","テスト","テスト","テスト","テスト","テスト","テスト");
				out.println(resultOutput + "が正常終了しました。");

			} catch (Exception e) {
				// TODO: handle exception
				String resultError = String.format("エラーが発生しました。内容は{%s}", e);
				out.println(resultError);

			} finally {
				out.println(resultOutput + "が終了しました。");
				out.println("**********************************************");
			}
		}
	//テストパターン　Nullを最初に含む。
	@Test
	public void test2() {
		String className = new Object() {
		}.getClass().getName();
		String resultOutput = className + "のテストパターン2";

		try {
			out.println("**********************************************");
			out.println(resultOutput + "が開始されました。");
			CommonFunction.checkNullBlank(null,"テスト","テスト","テスト");
			out.println(resultOutput + "が正常終了しました。");

		} catch (Exception e) {
			// TODO: handle exception
			String resultError = String.format("エラーが発生しました。内容は{%s}", e);
			out.println(resultError);

		} finally {
			out.println(resultOutput + "が終了しました。");
			out.println("**********************************************");
		}
	}
	//テストパターン　空白（半角）を最初に含む。
		@Test
		public void test3_1() {
			String className = new Object() {
			}.getClass().getName();
			String resultOutput = className + "のテストパターン3_1";

			try {
				out.println("**********************************************");
				out.println(resultOutput + "が開始されました。");
				CommonFunction.checkNullBlank(" ","テスト","テスト","テスト");
				out.println(resultOutput + "が正常終了しました。");

			} catch (Exception e) {
				// TODO: handle exception
				String resultError = String.format("エラーが発生しました。内容は{%s}", e);
				out.println(resultError);

			} finally {
				out.println(resultOutput + "が終了しました。");
				out.println("**********************************************");
			}
		}
	
		//テストパターン　空白（全角）を最初に含む。
				@Test
				public void test3_2() {
					String className = new Object() {
					}.getClass().getName();
					String resultOutput = className + "のテストパターン3_2";

					try {
						out.println("**********************************************");
						out.println(resultOutput + "が開始されました。");
						CommonFunction.checkNullBlank("　","テスト","テスト","テスト");
						out.println(resultOutput + "が正常終了しました。");

					} catch (Exception e) {
						// TODO: handle exception
						String resultError = String.format("エラーが発生しました。内容は{%s}", e);
						out.println(resultError);

					} finally {
						out.println(resultOutput + "が終了しました。");
						out.println("**********************************************");
					}
				}
				
				//テストパターン　Nullまたは空白を途中に含む。
				@Test
				public void test4() {
					String className = new Object() {
					}.getClass().getName();
					String resultOutput = className + "のテストパターン4";

					try {
						out.println("**********************************************");
						out.println(resultOutput + "が開始されました。");
						CommonFunction.checkNullBlank("テスト",null,"テスト","テスト");
						out.println(resultOutput + "が正常終了しました。");

					} catch (Exception e) {
						// TODO: handle exception
						String resultError = String.format("エラーが発生しました。内容は{%s}", e);
						out.println(resultError);

					} finally {
						out.println(resultOutput + "が終了しました。");
						out.println("**********************************************");
					}
				}

}

```

::: note info
コメントにテストパターンを記述しています。
第2引数以降のパターンで、null、空白の半角、全角の全てを試す必要はないと思い、一つだけテストしました。
また、引数に制限を設けていないので0（null）、1、1以上でテストしました。　
:::

では、テスト実行

テスト結果

![スクリーンショット 2025-06-17 19.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/1099fd9e-853b-4f1f-9302-9cf7fdd93212.png)

少し、画像が小さくて申し訳ありませんが、Nullの場合エラーの文が用意しているものと違うみたいです。

原因は、チェック関数の以下の部分でした。
``` CommonFunction.java
for(int i = 0;i<checkNum; i++) {
			if(checkStrings[i]==null) {
				errorMessage.append("項目のうち").append(i).append("番目がnullです\n");
            //ここのIFがTrueでも、次のIFを実行してしまっていました。
				
			}
			if(checkStrings[i].isBlank()) {
				errorMessage.append("項目のうち").append(i).append("番目が空白です\n");
				
			}
```

以下のように修正しました。

``` CommonFunction.java
for(int i = 0;i<checkNum; i++) {
			if(checkStrings[i]==null) {
				errorMessage.append("項目のうち").append(i).append("番目がnullです\n");
                continue;
                //ここでストップして、次の引数をチェックしに行く。
				
			}
			if(checkStrings[i].isBlank()) {
				errorMessage.append("項目のうち").append(i).append("番目が空白です\n");
                continue;
				
			}
```

では、再度テスト実行。

![スクリーンショット 2025-06-17 19.03.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/c11788b1-aa82-458b-8f8a-a744569d054b.png)

::: note info
テストも全てのパターンが正常終了または用意しているエラーとなり、
想定通りの結果でした。
:::

では、ようやくFactoryクラスのUTを実行します。

実行結果

![スクリーンショット 2025-06-17 20.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/725057b4-30c3-48da-a793-a39c89e86ac0.png)

::: note info
どうしてか失敗しているなと思ったら、異常系のテストのエラーキャッチの処理の中にfail処理が入っていました。
:::
したの箇所です。
```
catch (Exception e) {
			String resultError = String.format("エラーが発生しました。内容は{%s}", e);
			out.println(resultError);
			e.printStackTrace();
			fail("テストパターン1失敗。");
```

では、修正してもう一度

![スクリーンショット 2025-06-17 20.13.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3338426/c5ebb05c-a4c0-493e-9520-d750073ea578.png)

::: note info
想定通りの結果となり、AppSettingDtoFatoryのクラスの単体テストが完了しました。
:::
### 最後に
ようやく一つ目のPGおよび単体テストが完了しました。
次は、設定ファイルである.propertiesを読み込んでAppSettingDtoFactoryのメソッドを呼び出すLoaderクラスのPG・UTに取り掛かりたいと思います。
今日の振り返りとしては、ログではりませんが、エラーの内容を出力するようにソースを組んでいるので、今のところエラーをすぐに対処できています。
ここまでお付き合いありがとうございました。