Keycloak REST APIを使ったコードの自動テスト
この記事ではKeycloakの管理用APIを使ったコードの自動テストのために、Dockerによる使い捨てのKeycloakサーバを活用する方法を紹介します。
実行環境
- macOS Sonoma 14.2.1
- Node.js v20.10.0
- Docker 25.0
手順の概要
- Keycloak上にレルム、クライアント、ユーザといったテストに必要なデータを設定し、これらのデータをエクスポートしたものを初期データとして用意します。
- エクスポートしたデータを使ってDockerコンテナを立ち上げ、自動テストを実行します。
テストデータの準備
Keycloakで必要なテストデータを用意します。例えば、Client Credential Flowを使用して取得したアクセストークンを使い、管理用REST APIでユーザーアカウントを作成するコードのテストでは、レルムとmanagement-user
ロールを持つクライアントのIDとシークレットを事前に準備する必要があります。管理コンソールなどを使用してデータを準備しましょう
次に準備したKeycloakのデータをエクスポートします。Keycloakのスクリプトであるkc.sh
を使ってレルムのデータをJSON形式でエクスポートすることができます。
./kc.sh export --dir <保存先ディレクトリ>
エクスポートしたデータはプロジェクトの任意の場所に置いておきます。
テストサーバの立ち上げとテストの実行
テスト用のKeycloakサーバはDockerを使って立ち上げます。エクスポートしたデータを使ってKeycloakサーバのDockerコンテナを立ち上げるには、以下のコマンドを実行します。
docker run --name keycloak --rm -d -p 8080:8080 \
-v <レルムの保存先ディレクトリ>:/opt/keycloak/data/import \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:23.0.4 start-dev --import-realm
エクスポートしたデータが入ったディレクトリを/opt/keycloak/import
にマウントし、起動スクリプトに--import-realm
オプションを付与することで、データをインポートした状態のKeycloakサーバを起動します。なお、Keycloakサーバが起動するまで少し待つ必要があるため。wait-onを使用してHTTP通信が可能になるまで待機し、その後にテストを開始します。npmスクリプトは以下のように設定します。
"test": "(run-s test-server:run test:run);run-s test-server:stop",
"test:run": "vitest --run",
"test-server:run": "docker run --name keycloak --rm -d -p 8080:8080 -v ./test-realm:/opt/keycloak/data/import -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:23.0.4 start-dev --import-realm && wait-on http://localhost:8080",
"test-server:stop": "docker stop keycloak"
終わりに
テストを行う際、外部サービス関連のコードをモックで代替する方法もありますが、個人的には実際の環境に近い条件でテストを行う方が、より実践的な価値があると考えています。データベース領域ではこの手法が一般的ですが、Keycloakのような少しニッチな領域では似たような記事は見かけなかったので、調査した内容をシェアするためまとめました。
Discussion