リモート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プロジェクトでlessを使用するためのヒント

目次序文1. スタイルの浸透1. パターン浸透とは何ですか? 2. 使い方は? 2. ミキシング1....

ウェブサイトのカラースキーム ウェブサイトに適した色の選択

色はウェブサイト訪問者に影響を与えますか?数年前までは、ウェブサイトはまだ贅沢品でしたが、今ではほと...

Tencent Cloudでhive3.1.2を構築する方法を教えます

環境の準備操作を開始する前に、hadoop バージョンがインストールされていることを確認してください...

MySQL例外に対する一般的な解決策をいくつか分析する

目次序文1. コードによって設定されたデータベース名またはパスワードがローカルデータベースと一致して...

Vue でインデックスをキー属性値として使用することが推奨されないのはなぜですか?

目次序文キーの役割差分アルゴリズムにおけるキーの役割ヘッドノードを同期するテールノードを同期する新し...

nginx リクエスト ヘッダー データ読み取りプロセスの詳細な説明

前回の記事では、nginx がリクエスト ラインのデータを読み取って、リクエスト ラインを解析する方...

Vue 開発者向けの VSCode 拡張機能ベスト 7

適切な VS Code 拡張機能を Visual Studio に追加すると、開発者としての作業がは...

HTML ページにミュージック ビデオを追加する例

1. ビデオタグFirefoxでは自動再生をサポートしますが、GoogleとIEではサポートしません...

Vueはキャンバスの手書き入力を使用して中国語を認識します

効果画像: 序文:最近、屋外の大画面プロジェクトに取り組んでいました。システムの入力方法は使いにくか...

React antd タブの切り替えによりサブコンポーネントが繰り返し更新される

説明する: Tabs コンポーネントが切り替わると、TabPane に含まれる同じサブコンポーネント...

js に基づいて大きなファイルのアップロードとブレークポイントの再開を管理する方法

目次序文フロントエンド構造バックエンド構造(ノード+エクスプレス) FormDataに基づくファイル...

MySQL双方向バックアップの実装方法

MySQL 双方向バックアップはマスター-マスター バックアップとも呼ばれ、両方の MySQL サー...

ethers.js を使用して Solidity スマート コントラクトをデプロイする方法

Ethereum 上で DApps を開発したことがある場合は、フロントエンド JavaScript...

MySQLでテーブルインデックスを構築する方法

目次複数の種類のフィルタリングをサポート複数の範囲のクエリを避ける並べ替えを最適化するインデックスの...

Dockerはrabbitmqのサンプルコードをインストールして実行します

イメージをプルします: [mall@VM_0_7_centos ~]$ sudo docker pu...