Spring Bootとテスト駆動開発

Spring Certified ProfessionalというSpringの認定資格がProが無償化されたことで受けるハードルが下がったので、ラーニングパスを勉強してみることにした。
のは良いけど、当たり前に全文英語なので復習としてあとで見返せるようにメモをまとめていく。

ラーニングパスはこちらから受講可能(無料)

spring.academy

ちなみに認定資格を得るための試験は130分で60問選択式の問題を解くっぽい。
500点満点で300点以上で合格。
受験料が$250USDで1ドル150円とすると37,500円(多分税別)・・・

www.vmware.com


Spring BootでREST APIを構築する

SpringとSpring Boot

どちらもJavaのアプリケーション開発に利用されるフレームワークのことを指している。

Spring

様々なタイプのアプリケーションを構築するための様々なモジュールを提供している包括的なフレームワーク

提供モジュール例:

  • Webアプリケーション:Spring MVC
  • データアクセス:Spring Data
  • 認証・認可:Spring Security

Springのモジュールを利用した開発には、多くの設定が必要であり、それらを手動で行う必要がある。

Spring Boot

端的に言えばSpringを利用しやすくしたものである。
Spring アプリケーションでよく利用される設定や依存関係があらかじめ用意されているため、すぐに開発が進められる。
また、Spring BootにはWebサーバが内包されているため、外部にサーバがなくても簡単にWebアプリケーションを作成することができる。

Spring Bootでは、SpringのInvension of Control (IoC)コンテナを利用する。
→ Spring Bootでは実行時に、依存関係をアプリケーションに提供する方法と、提供タイミングを設定することができる。
ex. ローカル環境と本番環境で使用するDBの種類を変更する など

Spring Initializr

実行可能なSpringBootアプリケーションを素早く、簡単に作成できるツールのこと。
以下リンクから使用可能。

https://start.spring.io/

また、Javaの開発環境として、Eclipseを利用している場合、下記画像のようにメニューからも使用できる。

EclipseでSpringInitializrを使用するためのメニュー

今回はブラウザ版で実際にプロジェクトを作成してみる。

  • Project:Gradle-Groovy
  • LanguageJava
  • SpringBoot:3.3.0 ※SNAPSHOT付きは正式リリースではないのでなるべく避ける
  • Project Metadata
    • Group:example
    • Artifact:cashcard
    • Name:cashcard
    • Description:CashCard service for Family Cash Cards
    • Package Name:example.cashcard
    • Packaging:Jar ※外部のtomcatにリリースする場合とかは「war」を選択する
    • Java:17
  • Dependencies:Spring Web

必要情報を入力したSpringInitializrの画面

「GENERATE」を押下でzipファイルがダウンロードできるので、解凍する。

解凍したプロジェクトのフォルダ構成

プロジェクトのルートをカレントディレクトリとして、コマンドプロンプトbashを開いて、下記コマンドでビルドを実行する(bashの場合は先頭に「./」を付ける)

gradlew build

「BUILD SUCCESSFUL」と表示されればビルドが成功している。

コマンドを実行したコマンドプロンプトのスクショ


テスト駆動開発(TDD:Test Driven Development)

テスト駆動開発とは、アプリケーションコードを書く前にテストを実装する開発手法のことを指す。
実装予定の機能について、期待する動作をあらかじめテストに定義しておくことで、必要な機能を満たす最小限のコードを実装することができる。

テストのピラミッド

システム開発のそれぞれの段階で異なるテストを実施するが、各段階で実施するテストについて、
実行速度・テストを維持するためのコスト・テストがもたらすシステムの信頼性等について、バランスを取るようにテストの実施方針を決める必要がある。

一般的にピラミッドの上位にあるテストほど、1つのテストの実行速度は遅く、テストを維持するためのコスト、テストがもたらすシステムの信頼性は高い傾向がある。

テストピラミッドの図

E2Eテスト(End-to-Endテスト)

ユーザと同じインターフェースでテストを行う。複雑なテストを実施することになるため、実施にかなりの時間を要する。

結合テスト

システムのサブセットをテストする。ユニットテストよりも複雑で時間がかかる。

ユニットテスト

システムの小さな単位ごとにテストを実施する。シンプルなテストが多く、スピーディに実施できる。
テストの全体数としてはかなり多くなる。