スタンドアロンでプロダクショングレードのアプリケーションを構築する人気のJavaベースのフレームワークの最新バージョンであるSpring Boot 3.1では、開発時コンテナのサポートが改善された。この新機能は、SpringのデベロッパーアドボケイトであるJosh Long氏が、自身のYouTubeチャンネル「Coffee + Software with Josh Long」で行ったライブ配信で話題になった。また、Spring公式サイトのブログ投稿の 「Spring Boot 3.1'sConnectionDetails
abstraction 」では、この新機能についてさらに詳しく説明している。
TestcontainersはオープンソースのJavaライブラリで、一般的なデータベースやSeleniumウェブブラウザなど、Dockerコンテナで実行できるものであれば何でも、軽量で使い捨てのインスタンスを提供する。これは主に、アプリケーションが外部システムと正しくやりとりしているかを確認する必要があり、統合テストに使用される。
以前のバージョンのSpring BootでもTestcontainersはサポートされたが、その統合はそれほどシームレスではない。Spring Boot 3.1では、新しい@ServiceConnection
アノテーションを導入することで、この問題に対処した。このアノテーションは、必要なコードの量を減らし、統合テストとSpring Bootの自動設定の間の "stringly "型付けされた結合を避けることで、Testcontainersを使った統合テストのプロセスを容易にする。開発者が@ServiceConnection
アノテーションをどのように使うか、次の例を見てください。
@ServiceConnectionpublic static PostgreSQLContainer<?> db = new PostgreSQLContainer<>("postgres:13") .withDatabaseName("test") .withUsername("test") .withPassword("test");
Spring Boot 3.1で導入された2つ目の大きな機能は、開発時にTestcontainersを使用することだ。この機能により、開発者はプロダクションコードでTestcontainersを起動し、それらのコンテナに接続するプロパティを設定できる。しかし、この方法では、Testcontainersの依存関係をコンパイルクラスパス上に置く必要があり、これはfat JARに含まれる可能性がある。 Spring Boot 3.1では、Testcontainers依存関係をテスト
スコープに保持し、テストコード内に新しいmain
メソッドを作成することで、より良い方法を提供する。次の例を見てください。
import org.springframework.boot.SpringApplication;public class TestMyApplication { public static void main(String[] args) { SpringApplication.from(MyApplication::main).run(args); }}
このtest-main
メソッドは、新しいSpringApplication.from
メソッドを利用して、プロダクションコードで使われる "real "mainメソッドにデリゲートする。
開発者はアプリケーションの開発中に必要なTestcontainersのBeanを定義する@TestConfiguration
を作成できるようになった。次の例を見てください。
import org.springframework.boot.test.context.TestConfiguration;import org.springframework.boot.testcontainers.service.connection.ServiceConnection;import org.springframework.context.annotation.Bean;@TestConfiguration(proxyBeanMethods = false)public class MyContainersConfiguration { @Bean @ServiceConnection Neo4jContainer<?> neo4jContainer (){ return new Neo4jContainer<>("neo4j:5"); }}
Spring Boot 3.1はコンテナのライフサイクルを管理し、アプリケーション起動時にコンテナを起動し、アプリケーション停止時にコンテナをシャットダウンする。この機能は、GradleやMaven用のSpring Bootプラグインを使ってIDEやターミナルから使用できる。
YouTubeの動画では、開発用コンテナの構築にDocker ComposeとTestcontainersを使用する方法について、さらに詳しく説明してる。動画内でJosh Long氏は、Testcontainersのメインメソッドを作成するプロセスと、Testcontainersを使用したMongoDBの設定を説明してる。これらの機能の特徴として、開発環境の一貫性の強化やセットアップの簡素化、テスト用インフラのライフサイクルの詳細な制御などが挙げられる。
Spring Boot 3.1の拡張機能は、開発環境のセットアップと依存関係の管理プロセスをシンプルにし、新しいエンジニアがプロジェクトに貢献し始めやすくすることを目的としている。Spring Boot 3.1でTestcontainersと開発時コンテナのサポートが改善されたことは、開発プロセスをより効率的かつ合理的にするための大きな前進だ。
Spring BootでTestcontainersの使用方法の詳細については、公式のSpring Bootの公式ドキュメントを参照してください。