0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

📘 Vol.9.9:【Struts2】バリデーション処理の単体テスト編 〜 validate()/独自バリデータ/input遷移の検証を網羅的に 〜

Last updated at Posted at 2025-05-24

🧭 はじめに

Struts2 のバリデーション処理は、ユーザー入力の正当性を保つ重要な機能ですが、
そのロジックが複雑になるほど テストによる品質担保が必要不可欠です。

本記事では、以下の観点から「バリデーションの単体テスト方法」を実務ベースで解説します。


✅ 本記事で扱う内容

  • validate()メソッドのテスト方法

  • 独自バリデータ(FieldValidator)の単体テスト

  • input への遷移確認やエラーメッセージ表示のテスト

  • テストパターン設計の実例


🔍 1. テストパターン設計(実務の流れ)

まず最初に行うのが、「どんな入力パターンをテストすべきか」の パターン洗い出し です。
これは、仕様書や画面設計書をもとに以下のような観点で整理します。

観点 テスト例
必須チェック ユーザー名が空
桁数制限 ユーザーIDが20文字超
形式指定 パスワードが数字だけ/英字だけ
相関チェック パスワードと確認用パスワードが一致していない
数値範囲 年齢がマイナス値

👀 実際のプロジェクトではこのように ExcelやPDF形式 でまとめて整理しています:

📄 入力値テストケース(ログイン画面)


🧪 2. validate() のテスト例(JUnit)

Struts2の Action クラスで validate() をオーバーライドしている場合、
JUnit で以下のように単体テスト可能です。

@Test
public void testValidate_emptyFields() {
    LoginAction action = new LoginAction();
    action.setUserId("");
    action.setPassword("");
    
    action.validate();
    
    assertTrue(action.hasFieldErrors());
    assertEquals(2, action.getFieldErrors().size());
    assertTrue(action.getFieldErrors().get("userId").contains("ユーザーIDは必須です"));
}
  • hasFieldErrors() でエラー発生の有無を確認

  • getFieldErrors().get("フィールド名") で具体的なエラーメッセージ確認


🧩 3. 独自バリデータ(Custom Validator)のテスト例

FieldValidatorSupport を継承したクラスも、テスト可能です。

@Test
public void testCustomValidator() throws ValidationException {
    MyCustomValidator validator = new MyCustomValidator();
    validator.setFieldName("userId");
    validator.setDefaultMessage("不正な形式です");

    ValidatorContextMock context = new ValidatorContextMock();
    validator.setValidatorContext(context);

    // 無効な値
    validator.validate("abc!!");

    assertTrue(context.hasFieldErrors());
}

🛠 MockContext を使うことで、validate() 単体をテストできます。

🔁 4. input 遷移の検証(ActionProxy 利用)

Struts2 本体の挙動(inputへの遷移や結果判定)も以下のように確認できます。

@Test
public void testLoginAction_inputTransition() throws Exception {
    ActionProxy proxy = getActionProxy("/login");
    LoginAction action = (LoginAction) proxy.getAction();

    action.setUserId(""); // エラー条件
    action.setPassword("test");

    String result = proxy.execute();

    assertEquals("input", result); // inputに遷移すること
    assertTrue(action.hasFieldErrors());
}

ActionProxy で実行すると、Struts2の結果遷移も含めてテストできます。


🧱 5. テスト設計のベストプラクティス

複数画面やフォームを扱う場合、テスト構成を以下のように整理しておくと便利です。

src/test/java/
└── validation/
    ├── BaseValidationTest.java
    ├── LoginValidationTest.java
    ├── UserFormValidationTest.java
    └── CustomValidatorTest.java

✅ まとめ

観点 内容
テストパターン設計 観点を洗い出し、仕様に沿ったテストケースを作成
validate() のテスト hasFieldErrors() で結果を確認
独自バリデータの検証 単体で validate() を呼び出してテスト可能
input 遷移の確認 ActionProxy を使って実際の画面遷移結果を検証

Struts2 のバリデーション処理は非常に柔軟である一方、
その動作確認を パターンごとに丁寧にテスト することで、
品質と保守性が格段に向上します。


🧭 次回予告:Vol.9.10

次回は、画面側のUX向上編!

  • <s:fielderror> の高度な使い方

  • エラー時の入力欄装飾(赤枠表示、ツールチップ)

  • JavaScriptと連携したリアルタイムバリデーション

バリデーションの「見せ方」 を工夫して、より使いやすいUIを実現していきましょう!



✨ シリーズまとめ(Vol.9.x バリデーション編)


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?