素敵なサムシングを独断と偏見で一方的に紹介するブログ(´・ω・`)

投稿日: 2019年5月31日
最終更新日:

【SpringBoot2】JUniteに取って代わりそうな「Spock」を使ってコントローラーのユニットテストをやってみよう【TDD】

YouTubeも見てね♪

【最新機種】GoPro hero11 Black

created by Rinker
GoPro(ゴープロ)
¥62,000 (2024/03/15 19:06:06時点 Amazon調べ-詳細)

最新機種でVlogの思い出を撮影しよう!

ペヤング ソースやきそば 120g×18個

created by Rinker
ペヤング
¥2,600 (2024/03/15 19:03:46時点 Amazon調べ-詳細)

とりあえず保存食として買っておけば間違いなし!

モンスターエナジー 355ml×24本 [エナジードリンク]

created by Rinker
モンスター
¥4,748 (2024/03/15 19:03:48時点 Amazon調べ-詳細)

脳を活性化させるにはこれ!

ドラゴンクエスト メタリックモンスターズギャラリー メタルキング

created by Rinker
スクウェア・エニックス(SQUARE ENIX)
¥3,250 (2024/03/15 19:03:48時点 Amazon調べ-詳細)

みんな大好き経験値の塊をデスクに常備しておこう!

Bauhutte ( バウヒュッテ ) 昇降式 L字デスク ブラック BHD-670H-BK

created by Rinker
Bauhutte(バウヒュッテ)
¥13,861 (2024/03/15 15:06:46時点 Amazon調べ-詳細)

メインデスクの横に置くのにぴったりなおしゃれな可動式ラック!

MOFT X 【新型 ミニマム版】 iPhone対応 スマホスタンド

created by Rinker
MOFT
¥2,880 (2024/03/15 19:06:03時点 Amazon調べ-詳細)

Amazon一番人気のスマホスタンド!カード類も収納出来てかさ張らないのでオススメです!

サンディスク microSD 128GB

スマホからSwitchまで使える大容量MicroSDカード!

Spockを使おう

時間がないからユニットテストを書かないは悪

皆さんはシステム開発をする際にユニットテストは書いていますでしょうか?

スケジュールがパツパツだから、ユニットテストは後回し!といった感じの案件も正直少なくないと思います。

しかし、ユニットテストがかかれないまま機能追加や機能改修が発生すると、結局ユニットテストを追加する余裕が出ずに、ユニットテストでカバー出来る部分テスターさんが自分たちでやらないといけなくなってしまったりと、長い目で見た際に工数が結果として上がってしまう可能性がとても高いです。

テスト駆動開発の流行

さらに近年は、テスト駆動開発(TDD)という言葉が有名になってきているので、なおさらユニットテストを妥協するのはオススメ出来ません。

テスト駆動開発 (てすとくどうかいはつ、test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。多くのアジャイルソフトウェア開発手法、例えばエクストリーム・プログラミングにおいて強く推奨されている。近年はビヘイビア駆動開発へと発展を遂げている。テスト駆動開発 – Wikipedia

JUnitとSpock

では、ユニットテストを書く際に利用するのフレームワークは何を使えば良いのでしょうか。

Java開発のユニットテストといえば、JUnitが有名ですよね。

JUnitとはJavaで開発されたプログラムにおいてユニットテスト(単体テスト)の自動化を行うためのフレームワークである。JUnit – Wikipedia

最新バージョンはJUnit5であり、もちろんSpringBootもサポートしています。

そんなJUnit一強時代を崩すべく登場したのがSpockです。

Spock
the enterprise ready specification frameworkSpock

Spockとは、Groovy言語で動作するテスティングフレームワークです。

こちらは、当時JUnitが弱かったパラメータ化テスト(Parameterized Test)や、実施結果が直感的に分かりづらい、などといったデメリットを補うべくして生まれました。

もちろん、SpringBootもSpockの利用を推奨しており、手厚いサポートをしているため導入しやすいです。
さらには日本語ドキュメントも用意されています。

最高かよ!!!

今回はプロジェクトへの導入方法から簡単なコントローラークラスのテスト方法までをご紹介しようと思います。

本来はtest用のprofileを用意したり、サービス層配下はStub化する必要がありますが、今回はその辺は触れないので次回以降に余裕があったら対応してみようと思います。

手順

依存関係の追加

まずは依存関係build.gradleに追加していきましょう。

property.gradleにもSpockのバージョンを追加します。

テストクラスの作成

次にテストクラスを作成しましょう。

SpockはGroovy言語で作るので、 src/test/groovy 配下に作成する必要があります。
例の如く、テスト対象と同パッケージ階層にする必要があるので気をつけましょう。

今回はAccountDetailControllerのテストクラスを作成してみようと思います。

テストクラスには、Specificationクラスを継承させる必要があります。
また、クラス名はSpecで終わらせるのがルールとなっています。

要点の解説

@AutoConfigureMockMvc

サーバー起動せずに、MVCに関するテストを行えるようにするとても便利なアノテーション。

@SpringBootTest

SpringBootでユニットテストを行う際に、application.ymlを読み込んだりなどの準備をよしなにやってくれる魔法のアノテーション。

MockMvc

上記のアノテーションを追加することで、利用可能になるモッククラスです。

こちらを使うことで擬似的にリクエストを投げていると同等の動きを再現する事が可能になります。

@Unroll

後述するパラメタライズテスト時に、そのパラメーター単位でテスト結果をログやレポートに出力してくれます。

また、ケースとなる関数名にパラメタライズで指定した変数をセットする事が可能なので、レポートもとても見やすくなります。

setup句

setup句ではテストを行うための事前処理を行う際に記述します。

when句

実際に行う処理を記述します。

then句

処理結果の比較処理を行います。

when句

パラメタライズテストを行う際にデータを定義する事が出来ます。

Spockでは、マークダウンのテーブルのようにパイプ(|)で仕切る事で項目を定義する、データパイプと言う記法を使う事が出来ます。

1行目には項目(ヘッダー)を指定し、2行目以降に実際のパラメーターを定義する事で、その行単位で関数がsetup句から実行されていきます。

実行

では実際にユニットテストを実行してみましょう。

すべて正常に完了すれば上記のようにすべてPASSEDになると思います。

エラーがある場合はこんな感じになります。

エラーレポート

そして、Spockの一番の強みがユニットテストレポート機能標準搭載されている事です。

ユニットテスト失敗時のログに出ているファイルにアクセスしてみましょう。

おいおい神かよ。

シンプルで見やすいレポートが生成されています。

比較結果の詳細が記載されているので、調査がしやすいですね。

もちろん、すべてPASSEDになると以下のようなレポートが生成されます。

また、HTML形式なのでCIツールと合わせて結果をサーバーなどにおけば、ユニットテストの結果が管理もしやすいです。

終わりに

以上のように、今まではJUnit一択だったユニットテストですが、Spockと言う新しいフレームワークが登場した事でユニットテストの環境が変わってきています。

なんにせよ、ユニットテストの後回し自分の首を絞める事になるので必ず初期開発から導入するようにしてみると幸せになれると思います♪

CATEGORIES & TAGS

IT