• トップ
  • ブログ一覧
  • ユニットテストってどんなもの?
  • ユニットテストってどんなもの?

    こやまん(エンジニア)こやまん(エンジニア)
    2021.11.24

    IT技術

    ユニットテストとは?

    クラスやメソッドなど細かい単位で行うユニットテスト

    クラスやメソッド単位などでテストを行うことをユニットテスト(単体テスト)と言います。

    反対に、他クラスや外部モジュールと結合して行うテストをインテグレーションテスト(結合テスト)と言います。

    ユニットテストの特徴として、テスト規模が小さい範囲で、テストを早期に開始でき、問題の特定と修正が容易なことがあげられます。

    昨今は、変化の激しい市場に対応すべく、アジャイル型の開発を取る現場が多い状況となっているようです。

    アジャイル型の開発は、素早くリリースしブラッシュアップする方式であるため、従来のウォーターフォール型の開発と比べ、短期間で高品質な保証をする必要が求められるため、ユニットテストを活用することで対応ある程度の品質を保証できます。

    ユニットテストはあくまで品質保証の手段の一つであり、万能ではないため、他のテストとの組み合わせが必要になる点は注意が必要です。

    コードが設計した通りに動作するかを確認する

    ユニットテスト(単体テスト)は、主にコードが設計した通りに動作するかを確認することに用いられます。

    設計通りに動作することを証明できるため、品質を保証できます。

    バグ修正のコストを下げられる

    基本的に結合前の段階でテストが実施できるため、問題の特定と修正が容易になります。

    同水準でテストの再実行が可能

    テストケースを作成するため、プログラム変更後もユニットテストを再実行すれば、以前と同じテストがいつでも実行できるため、同じ品質を保証できます。

    プログラムに修正が入った際に、テストを再実行することで、既存のコードに問題が発生してないかを確認できるため、デグレードを防ぎやすくなります。

    学習コストがかかる

    手動テストに比べて、テストコードの作成方法の理解にコストがかかります。場合によっては自動ではなく手動でテストする方法を取ることも大切になります。

    JUnitとは?

    Javaのテストツールといえばコレ!!と言われるくらい知名度の高い、ユニットテストの自動化を行うためのフレームワークがJUnitとなります。参考程度にPythonであれば、unittestが標準モジュールで提供されているフレームワークになりますが、unittestはJUnitの影響を受けて開発されています。

    2021年11月15日の時点では、JUnitの最新バージョンは5.8.1となっており、Java8以上のバージョンが必要とされています。

    JUnit5の使い方

    テスト用のクラスを作成し、テストメソッドに@Testアノテーションを付与することで実行できます。

    Mavenの場合の実行コマンド

    1./mvnw test

    特定のコントローラーのみ実行したい場合の実行コマンド

    1./mvnw test -Dtest=controller.HogeControllerTest

    特定のサービスのみ実行したい場合の実行コマンド

    1./mvnw test -Dtest=service.HogeServiceTest

    特定のサービスのメソッドのみ実行したい場合の実行コマンド

    1./mvnw test -Dtest=service.HogeServiceTest#hoge_テスト

    Gradleの場合の実行コマンド

    1./gradlew testじ

    実行結果(テスト結果に失敗があった場合)

    失敗した箇所とその理由が表示されます。

    1[INFO] Results:
    2[INFO] 
    3[ERROR] Failures: 
    4[ERROR]   SampleControllerTest.sampleTest:10 expected: <3> but was: <2>
    5[INFO] 
    6[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0

    実行結果(テストが全て成功した場合)

    1[INFO] Results:
    2[INFO] 
    3[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    4[INFO]

    様々なアノテーション

    JUnitでは、様々なアノテーションを使用できます。

    クラス内で一度だけ実行したい処理、各テストメソッドの前後に実行したい処理などは、次のメソッドを付与することで実行できます。

    @BeforeALL このアノテーションを付与したメソッドは、テストクラス内で最初に一度だけ実行される。

    @BeforeEach このアノテーションを付与したメソッドは、各メソッドの前に実行される。

    @AfterALL このアノテーションを付与したメソッドは、テストクラス内で最後に一度だけ実行される。

    @AfterEach このアノテーションを付与したメソッドは、各メソッドの後に実行される。

    何らかの理由があり、テストメソッドは存在するものの、実行したく無い場合は、実行したくないメソッドに@Disabledを付与すれば、テスト実行時に実行対象から除外されます。

    まとめ

    ユニットテストを活用することで、開発したプログラムの品質をある程度保証することができます。

    しかし、万能ではないため、品質保証の一つとして、状況に応じて使い分けるのが良さそうです。

    私もまだまだ理解が浅いため、ユニットテストを始め、様々なテスト手法を積極的に使いこなして品質の高いコードを作成していきたいと思っています。

    こやまん(エンジニア)

    こやまん(エンジニア)

    おすすめ記事