リモートDockerを使用した統合テスト環境の構築手順

リモートDockerを使用した統合テスト環境の構築手順

需要背景

チームには統合テストが必要であり、そのためには、mysql や rabbitmq などのミドルウェアに依存する必要があります。すべての開発者は、開発したコードに対してテストを記述し、テストを実行する必要があります。

相互干渉を避けるために、R&D センター内にローカルに独自の依存環境を構築することもできます。これらの環境が簡単、高速、クリーンアップしやすいものになることを願っています。

Dockerを使用して環境を構築する

Docker は上記の要求を十分に満たすことができます。
しかし、それだけでは十分ではありません。私たちは次のような問題にも直面しています。

  • ローカル環境の構築は複雑です。すべての R&D チームは Docker 環境をローカルにインストールする必要があり、使用時にいくつかの障壁や不便が生じます。当社を例に挙げてみましょう。厳格なネットワーク制御のため、イントラネット上で開発しており、インターネットに接続できません。特に Windows に Docker をインストールする場合は、インターネットに接続する必要があります。この問題を解決する方法はありますが、初心者は皆、ローカル環境のインストールとデバッグのプロセスを経る必要があり、面倒です。
  • テスト実行速度は保証されません。プロジェクトが多くのミドルウェアに依存している場合、ローカル Docker も多くのリソースを消費し、テスト速度に影響します。
  • 複数環境の統合テストは面倒です。統合テストはローカル Docker に依存しているため、このコードをパッケージ化して Jenkins で実行するには、対応する環境に Docker をインストールする必要があります。

要約すると、Docker を使用するとプロジェクトの依存関係環境を迅速に構築できますが、ローカライズされた Docker 依存関係により、テスト中にコードが十分に純粋ではなくなり、各オペレーティング環境ではローカルの Docker のインストールが必要になります。

集中型Dockerサーバーによる統合テストの改善

実際、Docker 自体はリモート接続モードを提供しており、これにより Docker を集中的にデプロイし、テスト コードを統合して、TCP 接続経由で Docker サーバーを使用して依存ミドルウェアをビルドおよびテストすることができます。

Docker Server リモートリンク設定

この記事では、centos 7.6 を例に、リモートで接続できるように docker を構成する方法について説明します。

/etc/docker/daemon.jsonでリモート接続ポートを開きます。

{"ホスト": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}

ファイル/etc/systemd/system/docker.service.d/override.confを追加します。上記のパスが存在しない場合は、手動で作成します。

 [サービス]
 実行開始=
 実行開始=/usr/bin/dockerd
  • デーモンプロセスをリロードしますsystemctl daemon-reload
  • dockerコンテナを再起動しますsystemctl restart docker.service

テストコンテナフレームワーク

リモートDockerをデプロイした後、次のような問題が発生します。

  • コード内でリモート Docker 環境に接続して使用する方法
  • 2 人の開発者が同時にテスト ケースを実行する場合、彼らが起動するコンテナーがポート上で競合しないことをどのように確認すればよいでしょうか。
  • 使用後の容器の掃除方法

幸いなことに、Testcontainers フレームワークは上記の問題をうまく解決するのに役立ちます。

  • コンテナの起動と停止を支援するためにjunit 4およびjunit 5と統合できます。
  • テストが実行されるたびに新しいコンテナが起動され、異なるポートが公開されるため、2 人の開発者が同時にテスト ケースを実行しても、環境が互いに干渉することはありません。
  • 指定された遅延後に、testcontainers/ryuk を使用して未使用のコンテナをクリーンアップします。
  • 上記のすべてはユーザーにとって透過的です。

Spring Boot と統合されたテストコンテナ

さらに、ゲーム会社 Playtika は、Testcontainers と Spring Boot を統合するテスト フレームワークhttps://github.com/Playtika/testcontainers-spring-boot ) を提供しており、Spring Boot または Spring クラウド エコシステム内のアプリケーションの統合テストの作成が容易になっています。

環境変数の依存関係

リモート Docker リンクに Testcontainers または playtika の testcontainers-spring-boot を使用する場合、Docker クライアントをローカルにインストールする必要はありません。ただし、コードがリモート Docker のアドレスを認識できるように、関連する環境変数を構成する必要があります。このアドレスを構成する方法はいくつかあります。

  • 方法1: システム環境変数の設定。現在のシステムで環境変数DOCKER_HOST=tcp://remote_docker_server_ip:2375を設定します。
  • 方法 2: コンテナが構築される前に、Java テスト コード内で直接、コードSystem.setProperty("DOCKER_HOST","tcp://remote_docker_server_ip:2375")を使用して環境変数を指定します。
  • 方法3: 統合テストでMavenフェイルセーフプラグインを使用する場合は、プラグインの環境変数を設定します。

コマンドライン経由でDockerをリモートで使用および管理する

上記のテスト コードでは、Docker クライアントのインストールは必要ありません。ただし、コマンドライン経由で docker を管理する必要がある場合は、リモート docker と通信するための docker クライアントをインストールできます。もちろん、上記のテストコンテナは一種のクライアントに相当します。

さまざまなオペレーティング システムでのクライアント プログラムのインストール方法については、https://gist.github.com/kekru/4e6d49b4290a4eebc7b597c07eaf61f2 を参照してください。

参考文献

https://www.testcontainers.org/
https://gist.github.com/styblope/dc55e0ad2a9848f2cc3307d4819d819f
https://github.com/Playtika/testcontainers-spring-boot
https://gist.github.com/kekru/4e6d49b4290a4eebc7b597c07eaf61f2

統合テストにリモート Docker を使用する方法については、これで終わりです。Docker 統合テストの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 継続的インテグレーションテストにおけるDocker Swarmの適用の詳細な説明

<<:  Mailtoを使えばHTMLでメールを送るのは簡単

>>:  Vue3 setup() の高度な使用例の詳細な説明

推薦する

JavaScript CollectGarbage 関数の例

まず、メモリ解放の例を見てみましょう。 <スクリプト言語="JavaScript&q...

MySQLでユーザーを作成し、ユーザーに権限を付与する方法の詳細なチュートリアル

目次ユーザー管理新しいユーザーを作成するユーザー名の変更ユーザーのパスワードを設定するルートパスワー...

IE8は優れたエクスペリエンスを提供します: アクティビティ

今日は IE8 ベータ 1 (以下、IE8 と略します) をチラ見しました。IE8 は素晴らしい体験...

CocosCreatorメッセージ配信メカニズムの詳細な説明

概要この記事は、ゲームビジネスアーキテクチャに関連するコンテンツの紹介から始まります。ゲームビジネス...

MySQLでBLOBデータを処理する方法

具体的なコードは次のとおりです。 パッケージ epoint.mppdb_01.h3c; java.i...

画像を表示したり非表示にしたりするための JavaScript

JavaScriptは画像を表示したり非表示にしたりしますが、参考までに具体的な内容は次のとおりで...

MySQLでSELECT文が実行される仕組み

目次1. マクロの観点からMySQLを分析する2. SQL ステートメントを実行するには、どの程度の...

Docker を使用した ElasticSearch:7.8.0 クラスターのインストールに関する詳細なチュートリアル

ElasticSearch クラスターは、クラスターを構築するための動態請求的方式と靜態配置文件をサ...

MySQL テーブル作成外部キー エラーの解決方法

データベーステーブルA: テーブル task_desc_tab を作成します ( id INT(11...

データベースインデックスの知識ポイントの概要

目次ファーストルックインデックスインデックスの概念インデックスファイルの構成インデックスの役割SQL...

Linux teeコマンドの使い方の詳しい説明

teeコマンドは主にstandout(標準出力ストリーム、通常はコマンド実行ウィンドウ)に出力し、同...

Linuxで中断されたシステムを呼び出す方法

序文低速システム コールとは、決して戻らない可能性があり、プロセスを永久にブロックするシステム コー...

VMware Workstation 14 Pro のインストールとアクティベーションのグラフィック チュートリアル

この記事では、VMware Workstation 14 Proのインストールとアクティベーションに...

MySQL 8.0.18 のインストールと設定方法のグラフィックチュートリアル

この記事は、参考のためにMySQL 8.0.18のインストールと設定のグラフィックチュートリアルを記...