#linedevday Parallel selenium test with dockerにいってきたまとめ!【LINE DEVELOPER DAY 2017】
今年もLINE Developer Day 2017に行ってきました!!
本記事はについてSeleniumを用いたテストを並行で如何に早く処理したかを解説した「Parallel selenium test with docker」のセッションのまとめになります!
Parallel selenium test with docker
Chloe chao様
なぜSeleniumが必要なのか使うのか
- webサービスはあちこちで使われている
- line nowはグループのイベントで使われるが、そのサービスを管理するシステムとして、content management system/ external management system / party manager web pageがある
-content management systemは内部のユーザ向けシステムとして、ユーザや外部との関係を管理できる - external management systemは外部パートナー向けとして、システムのイベントの管理、イベントのアクティブの作成などができる。
- party manager web pageはイベントの最中のフローやコンテンツを管理できる
selenium
- 品質を高めるためにテストサイクルをどうスピードアップするかが重要
- seleniumは主要なブラウザを全てサポートしている
- selenium webdriver apiからリクエストを投げ、WebDriverからSystemのテストにHTTP Requestを投げる
- webdriverは様々なブラウザで使える
- 全てのAPI callがRPCで使われるが、テストコードが増えるとネットワークレイテンシーも増えていくので、テストを全て自動化をしたいと考えた
- 自動化したテストを全てに行い、フィードバックをできるだけ早く返すようにする
- テストを一つずつやると遅いので並行してやれば早くフィードバックを返せる
- リレーションテストなどは並列化していく
パラレルtest suitesについて
- どのテストフレームワークを使っているかで適切なライブラリを選んで並列テストをするのが重要
- selenium gridが同時並行テストを可能にしている
- リモートで複数にseleniumテストの管理を行える
- リモートweb driverがパラメータを送ってくれる
- ノードサーバに対してのtestのリルートもできる
- テストする環境はたくさんある課題があった
- seleniumテストするために依存関係をインストール、テストデータのセットアップなどの必要があったりする
- ノードサーバを増やすのが難しい
- 解決作としてcontainerに入れてしまうことで柔軟性の高いテストインフラを作ることができた
- selenium+dockerを使ってテストのインフラを作って同時並行でテストを行えることができるようになる
使い捨てのテストランナーコンテナーの使い方
- アプリケーションをコンテナーし、dockerを使うことでshipして実行することができる
- どうやってbuild/ship/runをするか
- selenium/mulithread livraryなどをdockerに入れる必要がある
- dockerfileはgitで管理する
- seleniumテストを用意し、dockerfileを適切に定義し、このコードをgitにコミットする、jenkinsジョブからコンテナーが作られpushされる
- さらにtest runnerコマンドをjenkinsのスレーブとして作ることもできる
- デーモン/processをtest runnnerの中でインストールすることもできる
- どうやってCIパイプラインに入れるか
- jenkins docker pluginを用いて、test runnnerがsshで実施し、テストのリクエストをselenium gridに送る
- マルチスレッドのライブラリを複数のリクエストを同時にdockerに投げることができる
- selenium hub serverから複数のブラウザでテストできる
dockerベースの並列テストについて
Zalenium
- selenium gridのextensionになる
- selenium gridを動的に作っていらなくなったら破棄できる
- ノード固定で作る必要がなくなる
- ビデオの録画も対応している
- hubとノードコンテナーを持っている
- docker socketを共有することでnode containerをホストマシン上で評価することでできる
- いくつノードコンテナーが必要なのかをテスト実行前に知る必要も、サーバが不足するといったこともなくなる
- テストが終わったらノードサーバコンテナーは破棄されてハブコンテナーのみ残る
- コンソールを提供しており、全てのノードのリクエストが確認できる
- ブラウザのバージョンやコンフィグ情報もリモートサーバの情報も観れる
- 各コンテナーのテストの状況もVNCを通じて観れる
- ビデオの録画、ダッシュボードを持っているので、トラブルシューティングの時に活用できる
- デバッグのためにビデオの再生などができる
- マルチスレッドライブラリがdockerで作られ、docker pushによってdocker hub.private リポジトリにpushされ、マルチスレッドのライブラリを使うことでテストを並列で行える
- dockerによってテストランナーコンテナーを依存性ありで構築できる
- 誰でもテストを行って、その機能をリモートでもローカルでも実施できる
まとめ
- seleniumのmultithread libraryを用いる
- jenkins slave agentをテストランナーコンテナに用いる
- zareniumによってgrid consoleを提供し、grid console上で、管理ができる
- テストの録画でデバッグがしやすい
@mogmetの所感
大規模になればなるほど人で実施するテストは非現実的になるので、できるかぎり自動化を導入したいところですが、Seleniumを大規模でこんなに活用されているのは初めて聞きました。
導入障壁は高いかもしれませんが、導入してしまうとその恩恵もとても大きいですね。