単体テスト概要
================================================================================

.. only:: html

 .. contents:: 目次
    :local:

はじめに
--------------------------------------------------------------------------------

本章では、Macchinetta Server Framework (1.x)を使用したシステムにおける、JUnitを用いた単体テストについて提示する。

ここでの単体テストのスコープはレイヤまたはレイヤ間結合とし、テストに関するアクティビティのうち、テスト実装と
テスト実施に関して解説する。
なお、解説するテスト実装は参考例でありシステムの品質を保証するためのテスト方針については、別途検討いただきたい。

単体テストガイドラインが示すこと
--------------------------------------------------------------------------------

本章では、以下のOSSライブラリを使用したレイヤまたはレイヤ間のテスト実装方法について説明する。

単体テストで利用するOSSライブラリ構成
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
テスティングフレームワーク
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

Javaのテスティングフレームワークとして、\ `JUnit <http://www.junit.org/>`_\ を使用する。

アサーション
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

アサーションに使用するライブラリとして\ `Hamcrest <http://hamcrest.org/JavaHamcrest/>`_\ を使用する。
JUnit4が標準でサポートしているアサーションライブラリである。

モック化
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

テスト対象のメソッドが依存するクラスをモック化するためのライブラリとして\ `Mockito <http://mockito.org/>`_\
を使用する。

DIコンテナ
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

テスト用のDIコンテナとして
\ `Spring TestのDI機能 <https://docs.spring.io/spring/docs/5.2.20.RELEASE/spring-framework-reference/testing.html#testing-fixture-di>`_\を使用する。

MVCフレームワーク
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

テスト用のMVCフレームワークとして
\ `Spring MVC Test Framework <https://docs.spring.io/spring/docs/5.2.20.RELEASE/spring-framework-reference/testing.html#spring-mvc-test-framework>`_\を使用する。


トランザクション管理
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

テスト用のトランザクション管理として
\ `Spring Testのトランザクション管理機能 <https://docs.spring.io/spring/docs/5.2.20.RELEASE/spring-framework-reference/testing.html#testing-tx>`_\を使用する。


データアクセス
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

テスト用のデータアクセスとして、Spring TestまたはDBUnitとSpring Test DBUnitを使用することを想定している。

* \ `Spring Test <https://docs.spring.io/spring/docs/5.2.20.RELEASE/spring-framework-reference/testing.html#testing-introduction>`_\

  * Spring Testは\ ``@Sql``\ アノテーションや\ ``JdbcTemplate``\ などを使用してSQLを発行する機能を提供している。

* \ `DBUnit <http://dbunit.sourceforge.net/>`_\  と\ `Spring Test DBUnit <https://springtestdbunit.github.io/spring-test-dbunit/>`_\

  * Spring Test DBUnitは、Spring Framework上でDBUnitを利用する際の支援ライブラリのため、DBUnitと組み合わせて使用する。
    DBUnitの提供するデータベースのセットアップ、状態の検証などの機能をアノテーションベースで実装する機能を提供している。

単体テストで利用するOSSライブラリのバージョン
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

単体テストで利用するOSSライブラリの一覧を以下に示す。

なお、以下のOSSライブラリはあくまで一例であり、実際は業務要件に合わせたライブラリを検討いただきたい。
また、本章内のアプリケーション自体を動作させるために利用するOSSライブラリ一覧については、
\ :ref:`frameworkstack_using_oss_version`\を参照されたい。


以下のOSSライブラリの中で、特にSpring Test(MockMvc)、Mockitoの使い方については、\ :ref:`UsageOfLibraryForTest`\
で詳細を説明する。

.. tabularcolumns:: |p{0.20\linewidth}|p{0.25\linewidth}|p{0.20\linewidth}|p{0.15\linewidth}|p{0.20\linewidth}|
.. list-table::
    :header-rows: 1
    :widths: 20 25 20 15 20

    * - Type
      - GroupId
      - ArtifactId
      - Version
      - Spring Boot
    * - JUnit
      - junit
      - junit
      - 4.12
      - \*
    * - Hamcrest
      - org.hamcrest
      - hamcrest
      - 2.1
      - \*
    * - Mockito
      - org.mockito
      - mockito-core
      - 3.1.0
      - \*
    * - Spring Test
      - org.springframework
      - spring-test
      - 5.2.20.RELEASE
      -
    * - DBUnit
      - org.dbunit
      - dbunit
      - 2.5.4
      - \
    * - Spring Test DBUnit
      - com.github.springtestdbunit
      - spring-test-dbunit
      - 1.3.0
      - \
    * - Apache POI
      - org.apache.poi
      - poi-ooxml
      - 3.17
      - \

.. note::

    Hamcrest 2.1より、\ ``hamcrest-core``\ と\ ``hamcrest-library``\ にあたるモジュールが\ ``hamcrest``\ に統合されたため、実施したいアサーションにより\ ``hamcrest-library``\ のような依存関係を追加する必要がなくなった。
    なお、Maven依存関係としては\ ``hamcrest-core``\ と\ ``hamcrest-library``\ を引き続き利用することができるが、実態としてはすべて\ ``hamcrest``\ を参照する形となる。

.. warning::

    \ :ref:`frameworkstack_using_oss_version`\ のとおり、本フレームワークで利用するApache POIは4.xであるが、単体テストでのみ3.17を利用する。
    これは、本フレームワークで利用しているDBUnitがApache POI 3.17に依存しており、4.xではDBUnitが利用するいくつかのメソッドが廃止されているため、Excel形式のデータ定義ファイルを読み込む際に実行時エラーとなることが確認されているためである。

|

単体テストの実装
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

単体テストは\ :ref:`ApplicationLayering`\ に沿った以下のレイヤ単位で実装している。レイヤまたはレイヤ間のテスト方法を
\ :ref:`ImplementsOfTestByLayer`\ で説明する。
レイヤ単位に当てはめられない共通機能や、機能特有のテスト方法は、\ :ref:`ImplementsOfTestByFunction`\ で説明する。

.. figure:: ./images/UnitTestOverviewApplicationLayer.png
   :width: 85%

|

対象読者
--------------------------------------------------------------------------------

本章は、\ :ref:`TargetReadersOfThisDocument`\ に加えて以下の知識・経験があることを前提としている。

* JUnitを使用した単体テストを行ったことがある

単体テストの動作検証環境
--------------------------------------------------------------------------------

本章は、以下の環境で動作検証をしている。
他の環境で実施する際は、本章をベースに適宜読み替えること。

.. tabularcolumns:: |p{0.25\linewidth}|p{0.75\linewidth}|
.. list-table::
    :header-rows: 1
    :widths: 25 75

    * - 種別
      - 名前
    * - OS
      - Windows 10
    * - JVM
      - `Java <http://www.oracle.com/technetwork/java/javase/downloads/index.html>`_ 1.8
    * - IDE
      - `Spring Tool Suite <https://github.com/spring-projects/toolsuite-distribution/wiki/Spring-Tool-Suite-3>`_ 3.9.12.RELEASE (以降「STS」と呼ぶ)
    * - Build Tool
      - `Apache Maven <http://maven.apache.org/download.cgi>`_ 3.3.9 (以降「Maven」と呼ぶ)
    * - RDBMS
      - `PostgreSQL <https://www.postgresql.org/docs/11/sql-insert.html>`_ 11.9.1

.. warning::

    本ガイドラインではSTS 4.xではなく、3.xを利用している。詳細は :ref:`STS 4.x について <warning_sts_4>` を参照されたい。