Windows環境でTurnip+Seleniumの受入試験シナリオを動かす

背景

るびまエンドツーエンドテストの自動化は Cucumber から Turnip へという記事からすでに四半世紀が過ぎ去ろうとしていますが、私の手元の環境(Windows7 64bit)ではTurnipがうまく動いていませんでした。

原因はこのissueだったりするのかなと思いつつ、色々と試して、結論としては、私のWin環境では、 Ruby 2.0.0 の32bit版インストーラーを入れれば動く という状態でした。

TurnipのためにRubyのバージョンが固定されるのは大変遺憾であると思いつつも、大元の問題を解決する自信もなく、結局しばらく二の足を踏んでいました。

ちなみに、仮想OSを使ってテストすることも考えたのですが、エンドツーエンド試験として、違うOSでブラウザを動かすのがテストとして正しいのか疑問で、実施していませんでした。

この流れの中で、最近ふと、「仮想OSからWindowsのブラウザを動かせば良いのでは?」と思い付いて、実際やってみました、というのが背景になります。

システムテスト自動化 標準ガイド (CodeZine BOOKS)

システムテスト自動化 標準ガイド (CodeZine BOOKS)

  • 作者: Mark Fewster,Dorothy Graham,テスト自動化研究会,伊藤望,玉川紘子,長谷川孝二,きょん,鈴木一裕,太田健一郎,森龍二,近江久美子,永田敦,吉村好廣,板垣真太郎,浦山さつき,井芹洋輝,松木晋祐,長田学,早川隆治
  • 出版社/メーカー: 翔泳社
  • 発売日: 2014/12/16
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (3件) を見る

Selenium Serverというものがあります

SeleniumにはSelenium Serverというツール(?)があって、クライアント/サーバの関係で、クライアント側からサーバ側のブラウザを動かすことが出来ます。

今回は、クライアント側を仮想OS(CentOS)にして、サーバ側をWindows7にすることで、テストシナリオを仮想OS側で動かし、実際のブラウザ操作はWindows上で行う、という環境を作りました。

環境について

当初の目的を達成するだけであれば、単にWindowsと疎通出来るクライアントがいればそれで良いはずですが、社内の環境として、Vagrant + Dockerという環境がすでにあったので、それを利用して環境構築をしました。

ちなみに私のチームは、普段メインの環境がRubyなわけではなく、私が何とかして何かにRubyをねじ込めないかと日々画策している状態なのですが、Docker イメージとしてRuby環境を配布すれば、個々に環境構築する必要もなく、普段メインで使っている環境(Windowsと仮想OS環境の両方)にも影響しませんので、似たような推進活動をしている人にはお薦めです。

サーバ側

クライアント側

  • CentOS
  • Docker
  • Rubyをインストールしたimageを作成(Docker Hubから取得しても良のではないかと思います)

Windows上に置いたプログラムソースをRubyコンテナから実行するように設定

  • プログラムソースそのものは、Windows上に配置(編集はWinでやりたかったので)
  • Vagrant のファイルsyncとDockerのマウント(-v オプション)を使って、WindowsのプログラムとCentOS側のプログラムを同期
  • bundle installCentOS上のRubyコンテナで実施。インストールしたgemのファイルはWinに保存(ファイルsyncされる状態にしておく)

今回はVagrantやDockerについては、あまり深掘りはしませんが、やっていること自体はドットインストールを見ればすぐ出来るような、そこまでややこしいものではないと思います。

今後のTodoとして、プログラムの実行の度にvagrant sshしてRubyコンテナを実行するのも甚だ面倒ですので、Windows側から簡単にDocker経由でプログラムを実行するための何かは作っておこうと考えています。

サーバ側の設定(Selenium)

Javaが実行出来る状態が必要ですので、入っていない場合にはインストールをして下さい。

Selenium Serverのjarがこちらからダウンロード出来ますので、好きな場所に配置します。ダウンロードした場所でコマンドプロンプトから、java -jar selenium-server-standalone-x.xx.x.jar -role hubと実行すれば任務完了です。

IPアドレス:4444という形でアクセスすることになりますので、念のためクライアント/サーバ間で疎通が出来る状態かを確認しておくと良いかもしれません。

クライアント側の設定(Selenium)

クライアント側は、普通にSeleniumを動かす場合とあまり違いはないです。イメージとしては、Driverのインスタンスを作成するときに、リモートを指定してあげればあとは普通に動く、という印象です。

自分のローカルPCにあるFirefoxを動かす場合の書き方

driver = Selenium::WebDriver.for :firefox

リモートのブラウザを動かす場合には、ここをリモートとして設定すれば良いです

リモートサーバにあるFirefoxを動かす場合の書き方

caps = Selenium::WebDriver::Remote::Capabilities.new(:browser_name => :firefox)
driver = Selenium::WebDriver.for :remote, :url => "http://(サーバのIPアドレス):4444/wd/hub", :desired_capabilities => caps

Selenium::WebDriver::Remote::Capabilitiesというクラスがありますので、そこに諸条件を設定してDriverに渡せば、動いてくれます。

より詳しくはリファレンス:WebDriverリファレンス:Capabilities を参照下さい

こちらの書籍も参照して作りました。(言語はJavaですのでご注意ください)

実践 Selenium WebDriver

実践 Selenium WebDriver

Turnipについて

本当は、Turnipについても書こうかと思っていたのですが、冒頭のるびまの記事以上のものが特に書けなさそうでしたので、割愛します。