Keycloakテストフレームワークのご紹介

2024年11月14日 Lukas Hanusovsky 著

すべてはどのように始まったのか

現在のテストスイートを置き換えるというアイデアは、数年前から検討されていました。当初は、現在のテストの記述方法に対するアプローチのリファクタリングのみを目的としていましたが、数回の内部議論とリファクタリングの更新を経て、新しいフレームワークに基づいた新しいテストスイートの方がより良い解決策になることがわかりました。

現在のテストスイートを使用する際に際立ついくつかの欠点について言及することは有益でしょう。まず第一に、Arquillian frameworkの上に構築された様々な構成と追加機能の複雑さです。これらの変更により、テストスイートは強力になりましたが、適切なドキュメントがないと初心者にはほとんど理解不能であるという欠点があります。2つ目の重要な点は、Arquillian frameworkがもはや完全にサポートされていないことです。他に言及すべき点としては、テスト対象を正確に指定したい場合に使用する複雑な実行システム、共有構成を持つ抽象クラス、カスタム拡張機能を追加するオプションがないことなどがあります。

明るい未来?

Keycloakチームは、2024年5月に新しいテストフレームワークを設計する取り組みを開始しました。まず、私たちのアイデアが実現可能かどうかを検証するためのプロトタイプから始まりました。プロトタイプは、JUnit5 テストフレームワークに基づいたJUnit5拡張機能であり、具体的には、デフォルトのテストライフサイクル機能を拡張し、@KeycloakIntegrationTest@InjectWebDriver@InjectRealmなどのカスタムインジェクトアノテーションを提供するJUnit5コールバッククラスを実装するためのものです。

成功したテストラウンドの後、複数のサーバーモード、異なるデータベースとWebDriver、クライアントとユーザーのセットアップ、SmallRye構成のサポート、Nimbus SDKに基づくOAuthClient(この機能はプレビューのみです)などをサポートするために機能リストを拡張する概念実証に進みました。現在実装されている機能の完全なリストは次のとおりです。

  • Maven BOM

  • コアモジュール

    • サーバーライフサイクル

    • データベースライフサイクル

    • 管理者クライアントのインジェクション

    • レルム、ユーザー、クライアントのライフサイクルとインジェクション

    • イベントおよび管理者イベントリスナーとインジェクション

    • OAuthクライアントのインジェクション

  • UIモジュール

    • WebDriverライフサイクルとインジェクション

    • ページインジェクション

    • Chrome、Firefox、HtmlUnit4ブラウザのサポート

  • データベースモジュール

すでにメインブランチとKeycloakナイトリービルドに存在しています。

どこから始めるか興味がありますか?

フレームワークの仕組みと使用方法の基本的な概要を提供するユーザーガイドを読むことをお勧めします。それでも不十分な場合は、テストの例も確認できます。

拡張機能開発者向けには、カスタムプロバイダーでKeycloakを起動する方法の例を参照することをお勧めします:プロバイダーの例pom.xmlテスト依存関係テストの例

バグを見つけた場合、何か議論したい場合、または新しい機能拡張を提案したい場合は、こちらのGitHubフィードバックディスカッションリンクに従ってください。

次のステップ

新しいテストフレームワークには、古いテストスイートからいくつかのテストを移行するのに十分な機能がすでに備わっています。実際、最初のテストの移行はすでに完了しています。古いテストスイートから、まずadminテスト、次にformsおよびoauthパッケージへと、一度に1つのパッケージを移行する予定です。これを行うにあたり、テストフレームワークの機能を拡張していきます。

近日中に提供される予定の機能には、以下が含まれます。

  • 最初にプロバイダーのMavenビルドを必要とせずに、カスタムプロバイダーをより簡単にデプロイする方法

  • 改善されたロギング。テストとKeycloakの両方からロギングを簡単に構成できるようにする

  • モックアプリケーションを含む、OAuthおよびOpenID Connectの簡単なテスト

  • リモートインターフェースのみを介したテストが容易でない場合に、テスト対象のサーバー上でコードを実行できるようにする拡張機能

また、長期的な計画として、以下を提供する予定です。

  • プロバイダーを直接呼び出すことでプロバイダーを簡単にテストするために使用できるプロバイダーテスト

  • テスト実行時間を短縮するために、複数のコアを最大限に活用するテストの並列実行

謝辞

コンセプト実証をまとめ、実現してくれたすべての人々、Miquel、Simon、Filip、Moises、Jon、そしてPedroに感謝します。プロジェクトを別のレベルに引き上げた非常に気の利いた提案をしてくれた技術設計を主導したStianに特別な感謝を申し上げます。

フィードバックをお寄せいただきありがとうございます。

お楽しみください!