コンテンツにスキップ

単体テスト ( UT0 )⚓︎

単体テスト ( UT0 ) は、静的テストと動的テストで構成します。

静的テスト ( UT0 )⚓︎

静的テスト ( UT0 ) の目的⚓︎

  • コーディング規約に準拠したソースコードであるか検証し、開発者間でのバラツキを抑制する
  • ソースコード内の潜在的なバグを自動検出し、品質の向上に役立てる

静的テスト ( UT0 ) で利用するツール⚓︎

上記の目的を達成するため、 AlesInfiny Maia OSS Edition (以降、 AlesInfiny Maia)では以下のツールを用いて静的テストを行います。

  • Checkstyle
    • コーディング規約に準拠した Java コードとなっているか自動的にテストするツールです。
    • 分析ルールは、 Google が提供している「Google Java Style Guide 」をベースにし、警告がなくなるまでコードを修正します。
    • 日本語コメントや IDE とミスマッチするルールは修正して使用します。
  • SpotBugs
    • Java コード内の潜在的なバグを自動検出するツールです。
    • SpotBugs の既定の分析ルールを使用し、警告がなくなるまでコードを修正します。

静的テスト ( UT0 ) のテスト対象⚓︎

静的テストは、すべての Java コードを対象に行います。

静的テスト ( UT0 ) の実行方法⚓︎

IDE および CI ツールを利用して、自動的に各ツールによるテストを行います。 各ツールの報告する警告は、原則コードを修正して対応します。

動的テスト ( UT0 )⚓︎

動的テスト ( UT0 ) の目的⚓︎

  • 業務機能が仕様通り実装されていることを確認する
  • 機能の追加・修正によってデグレードが発生しないことを短時間で確認できる
  • 特に業務機能の中核部分を手厚くテストし、重要機能の障害発生率を下げる

動的テスト ( UT0 ) で利用するツール⚓︎

上記の目的を達成するため、 AlesInfiny Maia では以下のテストフレームワークを用いて UT0 を行います。

  • JUnit
    • Java のテストフレームワークです。
  • Spring Test
    • Spring で構築したアプリケーションのテストを実行するためのツールセットです。
    • 主にモックの作成に使用します。

動的テスト ( UT0 ) のテスト対象⚓︎

動的テスト ( UT0 ) のテスト対象は以下の通りです。

  • アプリケーションコア層 ( ドメインモデル / ドメインサービス / アプリケーションサービス )
  • システム共通部品 ( 全機能 )

他の層の単体テスト

アプリケーションにおいて最も重要なのはアプリケーションコア層に実装される業務ロジックです。 ドメインモデルやドメインサービス、アプリケーションサービスに実装されたロジックが、仕様通りに動作することが最重要です。 アプリケーションコア層以外は、 UT0 でのテストの優先度が相対的に下がります。 特にプレゼンテーション層とインフラストラクチャ層は、 UT0 より高いテストレベルでも、十分にテストを行うことができます。

UT0 は日常的に繰り返し実行するテストであるため、テストが素早く完了することも重要です。 プレゼンテーション層やインフラストラクチャ層のテストは、依存するミドルウェアの初期化に時間を要することが多く、日常的な繰り返しには不向きとも言えます。 UT0 で他のレイヤーのテストを行う場合は、モック化やテストケースの絞り込みなど、短時間でテストを完了できる工夫を施すようにしてください。

動的テスト ( UT0 ) の実行方法⚓︎

動的テストは JUnit 上にテストコードを作成し、 IDE および CI ツールを利用してテストを実行します。 テストは業務ロジックの機能性を担保することを目的にします。 テストコードは AAA パターン に従い、どの環境で実行してもテストが成功するように実装します。

特定の環境でのみ成功するテストを作成してはいけません。 また、テストの事前準備が必要であれば、その作業もテストコードとして実装します。 テストの実行前に人手のテスト準備が必要ないようにします。 テスト対象のクラスが依存するコンポーネントやミドルウェアは、必要に応じてモックを作成し、可能な限り疎結合なテストを実現します。

自動生成コードなど、品質の担保されているコードは、正常動作の確認にとどめます。 業務ロジックに対するテストは重点的に行い、 C2 カバレッジが 100% となるようテストケースを設計します。 重要なコードのテストに十分なコストをかけるよう、濃淡を工夫しましょう。

テストケースの作成には、ブラックボックス技法、ホワイトボックス技法を組み合わせます。 入力パラメーターの組み合わせが多岐にわたる場合は、デシジョンテーブルを用いて整理します。

入力パラメーターは、境界値をそのクラスの代表値として使用します。 また null などの特殊な入力値もテストデータとして追加するようにします。