この記事では、SpringBootが3層構造(Controller-Service-Repository)になっているという前提で、各層ごとのテストについて記載します。
Contents
自動テストの種類
Webアプリの自動テストで知っておくべきは次の3種類です。
No | テスト | 概要 |
1 | 単体テスト(ユニットテスト) | 1つのクラスを対象としたテスト。 |
2 | 結合テスト(統合テスト/APIテスト) | 1つのAPIを対象としたテスト。 APIを構成するコントローラ〜サービス〜リポジトリまでを結合してテストする。 |
3 | UIテスト(EtoEテスト) | APIに加えて画面操作も自動化対象とするテスト。 |
単体テスト
単体テストとは何か?
単体テストとは、各クラスごとのテストです。
SpringBootで3層構造になっている場合は、Controller層の各Controllerクラスごと、Service層の各Serviceクラスごと、Repositoy層の各Repositoryクラスごとのテストです。
補足すると、インターフェースはテストで来ませんので、実装クラスを指します。
単体テストは非常に重要です。
単体テストで確認するべきこと
単体テストで確認すべきことは、各層ごとの役割をちゃんと果たしているかということになります。
単体テストでしてはいけないこと
結合テスト(疎通テスト/EtoEテスト)
結合テストとは何か?
単体テストは1つ1つのクラス単位のものですから、この結合テストは複数クラスを結合させて行う自動テストです。
単体テストという言葉に対して結合テストと記載していますが、実際にはいわゆる疎通テストやAPIテストを意味します。
SpringBootにおける結合テストは、Controller層から始まり、Service、Repositoryまでを一気通貫で行うテストです。
結合テストで確認するべきこと
結合テストはブラックボックステストで行っていきます。
テストケースは一般的には単体テストより少なくなるでしょう。
Controllerの実行メソッドに対して、正常系、異常系が1ケースずつできていればOKです。
ただし正常系でも、必ず最下層まで到達するものになっていなければ意味がありません。
結合テストでしてはいけないこと
結合テストは各層のクラスを結合させた時に適切に動いているかが確認できれば良いので、想定されうる全ての状態パターンを網羅する必要はありません。
全ての状態パターンを網羅するのは、多くの場合、Service層の単体テストで必要になります。
層が上に行けば行くほど、テストにこけやすくなります。
それは、関わる部品が多くなるからです。
また、層が上に行けば行くほど、テストコード修正のための原因究明に時間がかかるようになります。
それは原因部分を探るために、層を下って調査していく必要があるからです。