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

IT

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

投稿日:

スポンサーリンク

336×280




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ツールと合わせて結果をサーバーなどにおけば、ユニットテストの結果が管理もしやすいです。

本日のおすすめ商品

pock: Up and Running

安定のオライリーからも出版されています。

カップヌードル チリトマトヌードル

期待の新星・チリトマト!!!

終わりに

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

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

336×280




336×280




CATEGORIES & TAGS

IT, , , , , , , , ,

blogenist

Author: blogenist