Dockerがテストの作成にどのように役立ったか

GetIntentでは、広告を表示するために、広告プラットフォームが安定して稼働していることを確認する必要があります。 システムの信頼性は、使用されるハードウェアの種類、システム/ネットワーク構成、アプリケーションアーキテクチャなど、多くのコンポーネントで構成されています。 かなり複雑な分散アプリケーションに変更を加えると、常にリスクが伴います。

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











テストでTomcatまたはJettyを使用する場合、問題は発生しません。これらのサーバーはJavaで記述されており、テストに簡単に統合できます。 しかし、たとえば、 Aerospikeを使用しており、このデータベースとの相互作用をテストする場合、次の問題が待ち受けています。





多くの場合、これらの目的には共通のテスト環境が使用されます。たとえば、Aerospikeが既に構成され、いくつかのテストを実行できるリモートサーバーです。 ただし、このアプローチにはいくつかの欠点があります。





別の方法:テスト用にローカル環境を準備し、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のラッパーを作成しました 。 彼女はその方法を知っています:



  1. コンテナを開始/停止します。
  2. aerospike.conf構成ファイルをコンテナー内にマウントします。
  3. コンテナポートを空きホストポートにバインドします。
  4. テストが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の使用例を検討しましたが、この方法でプログラムと任意のサービスの相互作用をテストできることは明らかです。



記事の著者はkiruxanzeliboba69です



All Articles