Selenium Gridをクラウドで動かすために

webdb

こんにちは。kintoneチームの宮田です。好きな食べ物は寿司です。たまに築地から出社します。

2015年2月24日(火)に発売されるWEB+DB PRESS Vol.85に「Selenium最新活用 安定した開発を支えるE2Eテスト自動化」という特集を書かせていただきました。ざっくり以下のような内容になっています。

  • Seleniumとは
  • Selenium WebDriverの基本的な使い方
  • 安定・高速・メンテしやすくするための改善テクニック
  • kintoneチームにおける運用事例・開発プロセス

入門から運用までひと通り書いたので、Seleniumに興味がある人&既に使っている人にとって少しでも役立つ内容になっていればと願います。

宣伝だけではあれなので、未完成で記事には入れられなかったSeleniumテスト環境のクラウド移行についてちょっと書かせていただきます。まだトライ中のものなのでざっくり書きます。

背景

以前に「Docker で Selenium Grid の環境構築をもっと楽に!」という記事で書いたとおり、DockerのおかげでSeleniumの環境構築がかなり楽になりました。しかし、Dockerを使っても数十並列でテストを動かすための大規模なSelenium Gridを構築するとなると、かなりのマシンリソースが必要になります。また、kintoneチームでは複数バージョンのブランチを切って並行開発が行われることもあり、そのときはブランチごとにテストを走らせられるように複数のSelenium Gridが必要になるので、一時的に必要なマシンリソースが倍増することもあります。なので必要なときに柔軟にスケールするマシンリソースがほしいのですが、社内でマシンを調達・管理していくのはなかなか大変です。

これを実現する既存のサービスとしてSauceLabsなどがありますが、大量にリソースを借りるとなるとやはり予算が高かったです。。Selenium GridのセットアップはDockerのおかげでそこまで大変ではなくなったので、IaaSを使ってクラウド上にテスト環境を用意することを検討することにしました。

クラウド移行

テスト対象のプロダクト本体は社外に持ち出すわけにはいかないので、必要な準備は以下のようになります。

  1. クラウド環境にVMを用意してSelenium Gridを構築する
  2. クラウド環境のSelenium Gridに社内からアクセスできるようにネットワークを設定する
  3. 社内でテスト用にプロダクトをデプロイしてクラウド環境のVMからアクセスできるようにIP制限を設定する
  4. Seleniumテストを実行するときにクラウド環境のSelenium Gridを使うように設定する

IaaSはEC2とGCE(Google Compute Engine)を検討しましたが、今回の目的としてどちらかが大きく機能面として優れているということはなかったです。ただ、一回のテスト実行時間が30分前後で実行中以外は停止してコストを抑えたいのに対して、EC2は最小1時間単位の課金、GCEは最小10分単位での課金なので現時点ではGCEで試しています。

課題

ひと通り開発プロセスに乗せるための仕組みはできていますが、一つだけ課題がありまだ実際の運用では使っていません。それは、現在のDockerを使用したSelenium Gridの仕組みがシングルホストですべて動かす前提になっているので、1VMの性能上限がSelenium Gridの規模の上限となってしまうことです。具体的には、同時に起動される大量のブラウザがCPUを使い尽くしてしまいそれ以上スケールしなくなってしまうのです。

改善するためにはマルチホストでSelenium Gridを組めるようにする必要があるため、現在Dockerfileや起動スクリプトをいじくりまわしているところです。うまいこと運用に乗ったらまたどこかで共有させていただくと思います。もし、「大規模なSelenium Grid運用のよい知見があるぜ!」という方がいらっしゃいましたらぜひ教えてください!

おわりに

WEB+DB PRESSに記事を書いた話と、Selenium Gridのクラウド移行について軽く紹介しました。Seleniumがオープンソースであるおかげで様々な恩恵をいただいているため、今後も得られたノウハウの共有などで少しでも世の中の自動テストに貢献できればと思います。皆さまもぜひ楽しいSeleniumライフを!