リモート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() の高度な使用例の詳細な説明

推薦する

DockerにRabbitMQを素早くインストールする方法

1. 画像を取得する #Webコントロールページを含むバージョンを指定します docker pull...

Vue で配列パラメータを渡すための get / delete メソッド

フロントエンドとバックエンドがやり取りする場合、get または delete を介してバックエンドに...

Linux ファイルを分割するための split コマンドの詳細な説明

いくつかの簡単な Linux コマンドを使用すると、ストレージまたは電子メールの添付ファイルのサイズ...

MongoDB データベースの状態を監視する Zabbix3.4 メソッド

Mongodb には db.serverStatus() コマンドがあり、これを使用して Mongo...

Element-ui アップロードファイルのアップロード制限の解決策

質問アップロードするファイルのタイプを accept に追加することは、「表面的な」役割しか果たしま...

Centos7 に Zabbix3.0 をインストールするための非常に詳細な手順

序文最近、同社の業務の一部がコンピュータルームに移転し、ホストリソースの監視と管理をより便利に行うた...

MySQL の count()、group by、order by の詳細な説明

最近、IM を実行するときに、これらの 3 つのキーワードを同時に使用したときに問題が発生しました。...

Nginx の場所に関する一般的なルールの優先順位の問題

目次1. 場所/マッチング2. 場所 = / 一致Locaitonには、完全一致(=)、プレフィック...

MySQLリモート接続失敗の解決策

以前、MySQLがローカルでは接続できるのにリモートでは接続できないという問題に遭遇したことがありま...

Vueは動的クエリルール生成コンポーネントを実装します

1. 動的クエリルール動的クエリルールは、おおよそ次の図のようになります。ユーザのカスタマイズに応じ...

Dockerでk8sをデプロイする方法

K8s k8s はクラスターです。クラスターには複数の名前空間があります。名前空間の下には複数のポッ...

CSS リセットスタイルリセットの実装例

はじめに: すべてのブラウザには、「ユーザー エージェント スタイル シート」と呼ばれる、すべてのペ...

Tomcatの自動シャットダウンに関するバグ修正

序文最近、4 年間実行されている Java EE Web プロジェクトでは、システムが開けないという...

mysql 結合クエリ (左結合、右結合、内部結合)

1. MySQLの一般的な接続INNER JOIN (内部結合、または等価結合): 2 つのテーブ...

Ubuntu 18.04 に vsftpd をインストールするための実装コード

vsftpdをインストールする $ sudo apt-get install vsftpd -y v...