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

推薦する

vue $setは配列コレクションオブジェクトへの値の割り当てを実装します

Vue $set 配列コレクションオブジェクトの割り当てVue カスタム配列オブジェクト コレクショ...

Centos8 で Apache httpd2.4.37 を使用して Web サーバーをインストールする詳細な手順

ステップ 1: yum install httpd -y #httpd サービスをインストールします...

JS を使用して要素が配列であるかどうかを判断する例

検証できるデータの種類は次のとおりです a = [1,2,3,4,5,6]とします。 b = [とし...

HTML メタタグの使用の概要 (推奨)

メタタグ機能METAタグは、HTMLタグのHEAD領域にある重要なタグです。文書の文字セット、使用言...

Nodejs のグローバル変数とグローバルオブジェクトの知識ポイントと使用方法の詳細

1. グローバルオブジェクトすべてのモジュールは呼び出すことができます1) global: ブラウザ...

Tomcat の 404 エラーの解決方法の詳細な説明

Tomcat テストで 404 問題が発生します。問題は次のとおりです。 HTTP ステータス 40...

Webpack で環境変数を使用するためのさまざまな正しい姿勢

目次前に書いてビジネスコードは環境変数を使用するwebpack.DefinePlugin プラグイン...

シンプルなドラッグ効果を実現するJavaScript

この記事では、簡単なドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

easycomモードでUNI-APPコンポーネントを呼び出す際に習得する必要がある実践的なスキル

この記事は議論の出発点となることを目的としています。詳細なドキュメントと easycom の仕様につ...

MySQL ストアド プロシージャ関連の権限変更の問題

MySQL データベースを使用すると、他のユーザーが定義したストアド プロシージャを他のユーザーが変...

1 つの記事で React における Redux の初期の使用を理解する

Redux はデータ状態管理プラグインです。React や Vue を使用してコンポーネント化された...

MySQLはデフォルトのエンジンと文字セットの詳細を変更します

目次1. データベースエンジン1.1 ビューデータベースエンジン1.2 デフォルトのデータベースエン...

Linux ネットワークプログラミングにおけるソケットオプションの実装

ソケットオプション機能機能: ソケットファイル記述子の属性の読み取りと設定に使用されるメソッド #i...

ページ下部のフッターを修正する方法(複数の方法)

フロントエンド Web エンジニアとして、ページ効果を作成するときに次の現象に遭遇したことがあるはず...