開発者は、これらのリスクを最小限に抑え、ユニットと統合のテストを作成しようとしています。 通常、単体テストの作成は簡単です。 統合テストでは、洗練度によっては状況がより複雑になります。

テストでTomcatまたはJettyを使用する場合、問題は発生しません。これらのサーバーはJavaで記述されており、テストに簡単に統合できます。 しかし、たとえば、 Aerospikeを使用しており、このデータベースとの相互作用をテストする場合、次の問題が待ち受けています。
- AerospikeはJavaで記述されていないため、アプリケーションに簡単に統合できません。
- 開発者がすべての一般的なプラットフォーム(Windows、OS X、Linux)でテストを実行できるようにしたいと思います。 Aerospikeは、Linux専用のバイナリも提供します。
- テストは並行して実行できるため、複数のサーバーが必要ですか?
- 各テストは、データベースのクリーンコピーを受信する必要があります。
多くの場合、これらの目的には共通のテスト環境が使用されます。たとえば、Aerospikeが既に構成され、いくつかのテストを実行できるリモートサーバーです。 ただし、このアプローチにはいくつかの欠点があります。
- リモートサーバーでのテストの実行は、ローカルテストの実行よりもかなり時間がかかります。 これは、低速のインターネットで作業する場合に特に顕著です。
- 複数の開発者がアプリケーションを同時にテストすることにした場合、分離に問題があります。
- 多くの場合、企業の情報セキュリティポリシーでは、企業VPNの背後にサーバーを隠す必要があります。 VPNクライアントをセットアップする見込みがあるため、自宅で仕事をしたいという欲求をすべて落胆させる可能性があります。
別の方法:テスト用にローカル環境を準備し、Aerospikeを3つのプラットフォーム(Win / Mac / Linux)にインストールして構成するための長い手順を作成する必要があります。 しかし、別のオプションがあります-Dockerなどの自動化ユーティリティを使用します。
Dockerは、隔離された環境(コンテナー)でアプリケーションを展開および管理するためのシステムです。 これは、クライアント/サーバーアーキテクチャの原則に基づいて構築されており、Dockerクライアントはすべての主要なOCに対応しており、DockerデーモンはLinuxシステムでのみ動作します。 ただし、これは問題ではありません:docker-machineを使用すると、Windows / OS Xで(仮想ホスト上で)dockerを実行できます。 そのため、テストを実行するには、開発者はマシン上でdocker clientを構成する必要があります。コマンドdocker run hello-worldでこれを確認できます。 WindowsおよびOS Xの場合、 docker-machineをインストールする必要があります。
埋め込まれたエアロスパイク
Aerospikeを統合テストで使用するために、dockerおよびdocker-machineのラッパーを作成しました 。 彼女はその方法を知っています:
- コンテナを開始/停止します。
- aerospike.conf構成ファイルをコンテナー内にマウントします。
- コンテナポートを空きホストポートにバインドします。
- テストがWindows / OS Xで実行されている場合は、Dockerマシンを起動/停止します。
コンテナーを管理するために、Docker用の一般的なJava APIクライアントであるdocker-java API clientを使用します。 Dockerコンテナー内でAerospikeサーバーを起動し、ポート転送を構成し、構成ファイルをマウントするには、次のコマンドを実行する必要があります。
docker run -d -P -p 3000:3000 -v path/to/aerospike.conf:/etc/aerospike/aerospike.conf --name aerospike aerospike
そして、これがDocker Remote Apiを使用して同じことを行うコードです
ExposedPort tcp3000 = ExposedPort.tcp(3000); Volume volume = new Volume("/etc/aerospike/aerospike.conf"); Ports portBindings = new Ports(); portBindings.bind(tcp3000, Ports.binding(aerospikePort)); CreateContainerResponse container = dockerClient.createContainerCmd(IMAGE_ID) .withExposedPorts(tcp3000) .withPortBindings(portBindings) .withBinds(new Bind(aerospikeConfPath, volume, AccessMode.ro)) .exec(); dockerClient.startContainerCmd(container.getId()) .exec();
詳細については、 AerospikeServerクラスを参照してください。
テストを書く
埋め込みエアロスパイクを使用した統合テストの例を見てみましょう。 識別子によってユーザーセグメントを保存および受信できるSimpleAerospikeClientクラスがあるとします。
public Set getSegments(Long userId); public void addSegments(Long userId, Set segments);
クラス全体を表示します 。
これらのメソッドの正しい実装を検証するテストを作成しています。
まず、サーバーを構成して起動する必要があります。
@BeforeMethod public void setUp() throws Exception { aerospikeServer = AerospikeServer.builder() .aerospikeConfPath(getClass().getResource("/aerospike.conf").getFile()) .dockerConfig(DockerClientConfig.createDefaultConfigBuilder().build()) .build(); aerospikeServer.start(); }
データが正しく書き込まれ、データベースから読み取られることを確認します。
@Test public void test() { long userId = ThreadLocalRandom.current().nextLong(); aerospikeClient.addSegments(userId, new HashSet<Integer>() {{ add(150); add(151); }}); Set<Integer> segments = aerospikeClient.getSegments(userId); Assert.assertEquals(segments.size(), 2); Assert.assertTrue(segments.contains(150)); Assert.assertTrue(segments.contains(151)); }
テスト中に作成されたコンテナを停止して削除することを忘れないでください。
@AfterMethod public void tearDown() throws Exception { aerospikeServer.stop(); }
おわりに
このアプローチにより、開発者のマシンで統合テストを実行できます。つまり、第1に、テストサーバーの保守にリソースを費やす必要がなく、第2に、インフラストラクチャにアクセスせずにアプリケーションを開発およびテストできます。 Aerospikeの使用例を検討しましたが、この方法でプログラムと任意のサービスの相互作用をテストできることは明らかです。
記事の著者はkiruxanとzeliboba69です