JPrime 2024 無事終了!!
JPrime 2024 の主催者は、あらゆる人に何かを提供できるように、再び幅広いトピックを提供するために多大な労力を費やしました。
しかし、今日の記事は、非常に洞察力に富んだものでしたが、「Spring と Quarkus における統合テストの進化」 に関する Michael Simons の講義の 1 つによって引き起こされたものではありません。彼は、Spring Boot のセットアップに焦点を当てて、統合テスト戦略を検討しました。
著者は、自分が強調した問題は開発サービスの利用を通じて Quarkus で効果的に対処できることを明確に強調しました (図 1)。これは、私が特定のアプリケーションに対して Spring Boot に懐疑的な目で見ているもう 1 つの理由を浮き彫りにしています。その複雑さは、Quarkus の合理化されたソリューション、特に Dev Services の使用とは明らかに対照的です。
図 1 – JPrime 2024
新しい参加者の間で Dev Services の驚きが巻き起こったのを目撃するのは驚くべきことでした。ただし、Dev Services は Quarkus の最近の機能ではないことに注意することが重要です。これはかなり長い間フレームワークに不可欠な部分でした。 Quarkus Dev Services をさらに深く掘り下げ、その永続的なメリットを探ってみましょう。
Quarkus では、Dev Services により、開発モードとテスト モードの両方で未構成のサービスの自動プロビジョニングが容易になります。基本的に、拡張機能を設定せずに組み込むと、Quarkus は関連するサービスを自動的に開始し (多くの場合、バックグラウンドで Testcontainers を利用します)、このサービスを効率的に使用するようにアプリケーションを設定します。
サービスの自動検出と起動
Quarkus Dev Services は、データベース、メッセージ ブローカー、その他のバックエンド サービスなどの必要なサービスの検出と起動を自動化します。この関数は、pom.xml または build.gradle で指定されたアプリケーションの依存関係を利用します。たとえば、データベース ドライバーを追加すると、Dev Services が自動的にトリガーされ、そのデータベースの対応するコンテナー化されたインスタンスがまだ実行されていない場合にはスピンアップされます。ここで使用されるテクノロジーには主に Testcontainers が含まれており、一般的なデータベース、Selenium Web ブラウザ、または Docker コンテナ内で実行できるその他の軽量の使い捨てインスタンスを作成できます。
動的構成の挿入
必要なサービスがインスタンス化されると、Quarkus Dev Services は関連するサービス接続の詳細を実行時にアプリケーションの設定に動的に挿入します。これは、標準データベースまたは他のサービス URL を自動プロビジョニングされたテストコンテナに再ルーティングする継続的テストと呼ばれる機能を使用して、手動介入なしで実行されます。 URL、ユーザー資格情報、その他の操作パラメータなどの構成プロパティがシームレスに設定されるため、アプリケーションは手動で構成されたかのようにこれらのサービスと対話できるようになります。
サービス固有の動作
Dev Services はさまざまなタイプのサービスに合わせて調整されています:
ネットワーク処理とサービス分離
Quarkus Dev Services によってスピンアップされた各サービスは、分離された環境で実行されます。これは、異なる開発テスト間でポートの競合、データの残留、セキュリティの問題が発生しないようにするために非常に重要です。この分離にもかかわらず、サービスは Docker を使用して適切にネットワーク化され、必要に応じて相互に通信できるようになり、現実世界のデプロイ環境を模倣します。
ライフサイクル管理
Quarkus は、これらの動的にプロビジョニングされたサービスのライフサイクル全体を管理します。アプリケーションを開発モードで起動すると、必要なサービスが自動的に起動します。 Quarkus アプリケーションを停止すると、これらのサービスも終了します。この管理には、必要に応じてデータの永続性を処理することが含まれており、開発者はセットアップに遅れが生じることなく、中断したところから再開できるようになります。
Quarkus で PostgreSQL データベースを使用しているとします。既存の PostgreSQL 構成が検出されない場合、Quarkus は PostgreSQL Docker コンテナをキックスタートし、アプリケーションを自動的に接続します。
これらのサービスは、開発モードおよびテスト モードではデフォルトで有効になっていますが、必要に応じて application.properties:
を使用して無効にすることができます。
quarkus.datasource.devservices.enabled=false
Quarkus が PostgreSQL データベースを使用しているシナリオと、開発サービスが最小限の労力でこれを容易にする方法について詳しく説明します。
Quarkus は、アクティブな PostgreSQL 構成がない (実行されていない、または明示的に構成されていない) ことを検出した場合、Docker を使用して PostgreSQL コンテナを自動的に起動します。これは、Dev Services を通じて舞台裏で設定されます。
ORM レイヤーを介してデータベースと対話するには、Hibernate ORM 操作を簡素化する Quarkus Panache の使用を検討してください。環境をセットアップする方法は次のとおりです:
依存関係を追加
まず、必要な依存関係を pom.xml に含めます:
io.quarkus quarkus-hibernate-orm-panache io.quarkus quarkus-jdbc-postgresql
エンティティの定義
次に、CityEntity:
などのエンティティを定義します。
@Entity @Table(name = "cities") public class CityEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @Column(name = "public_id") private String publicId; @OneToOne private StateEntity state; @Column(nullable = false, name = "created_at") private Instant createdAt; @Column(nullable = false, name = "last_modified") private Instant lastModified; @PrePersist protected void onCreate() { createdAt = Instant.now(); lastModified = createdAt; } @PreUpdate protected void onUpdate() { lastModified = Instant.now(); } }
リポジトリの作成
データベースと直接対話するリポジトリを実装します:
@ApplicationScoped public class CityRepository implements PanacheRepository{ }
サービス層
リポジトリを利用するサービス層を定義します:
@ApplicationScoped public class CityServiceImpl implements CityService { @Inject CityRepository cityRepository; @Override public long countCities() { return cityRepository.count(); } } public interface CityService { long countCities(); }
リソース エンドポイント
@Path("/cities") @Tag(name = "City Resource", description = "City APIs") public class CityResource { @Inject CityService cityService; @GET @Path("/count") @Operation(summary = "Get the total number of cities", description = "Returns the total count of cities in the system.") @APIResponse(responseCode = "200", description = "Successful response", content = @Content(mediaType = "application/json", schema = @Schema(implementation = Long.class))) public long count() { return cityService.countCities(); } }
Quarkus アプリケーション (mvn quarkus:dev) を実行すると、PostgreSQL コンテナーが自動的に起動することを確認します (図 2)。このシームレスな統合は、Quarkus Dev Services の威力を実証しており、アプリケーションに必要な外部サービスへの構成と接続セットアップを自動化することで、開発とテストを大幅に簡素化します。
図 2 – アプリケーション ログ
Quarkus Dev Services は、さまざまなサービスの構成と管理を処理することで開発とテストのフェーズを合理化し、開発者が実際のアプリケーションにさらに集中できるようにします。 Quarkus は、次のような幅広い開発サービスをサポートしています:
Quarkus Dev Services は、開発者が開発フェーズとテストフェーズで外部サービスをセットアップおよび統合する方法におけるパラダイムシフトを表しています。環境セットアップの自動化は、開発プロセスを加速するだけでなく、構成エラーの可能性を減らし、チームが堅牢で機能豊富なアプリケーションの作成に集中しやすくします。
Quarkus Dev Services の際立った利点の 1 つは、開発者の生産性を重視していることです。サービスの依存関係を手動で管理する必要がなくなるため、開発者はすぐにビジネス ロジックとアプリケーション機能の作業を開始できます。この合理化されたワークフローは、複数のサービスの開発と統合を同時に行う必要があるマイクロサービス アーキテクチャで特に有益です
結論として、Quarkus Dev Services を採用すると、開発チームの有効性とプロジェクトの成果に大きな影響を与える可能性があります。 Quarkus のシンプルさとパワーは実験を奨励します。
イテレーションが短縮され、最終的には開発サイクルが短縮されます。この種のテクノロジーの活用は、現代のビジネスがデジタル時代で成功するために必要なものです。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3