20161212 selenium adventcalender
-
Upload
naoya-kojima -
Category
Engineering
-
view
181 -
download
2
Transcript of 20161212 selenium adventcalender
![Page 1: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/1.jpg)
Selenium Serverをサービス化した時の話
Dec/12/2016
Naoya Kojima
@jugemix
![Page 2: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/2.jpg)
環境作りの前にやりたいこと(背景・要求)と、ユースケースによる実現手法の整理
![Page 3: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/3.jpg)
背景
Selenium を使って実装した自動テストを自分の端末で実行していた
画面を占有される為、他の作業をできなかった
自動テスト実行イメージ
時々遊んでいる(使われていない時間がある)端末が隣にあった
テストシステ
ム
Selenium Server
chrome driver etc…
Google Chrome etc…
自動テスト 自動テスト 自動テスト
自分の端末
![Page 4: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/4.jpg)
ビジネス要求
自分の端末で実行する場合は、自動テストが画面を占有しないようにしたい
自動テストは従来通り自分の端末で実行するが、利用者不在の稼働中端末があれば、そこでも実行出来るようにしたい
端末利用者が在席している場合は、自動テストがその仕事を邪魔しないようにしたい
![Page 5: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/5.jpg)
機能要求
自動テストは、バックグランドで実行されなければならない
ブラウザを操作するSelenium をバックグランドで実行する必要がある
バックグランドで実行
サービス/デーモンとして実行すること
課題
バックグランドでSelenium を実行できるのか確認する
このとき、意図するブラウザで自動テストを実行できるのか確認する
複数端末で互いに独立したテストケースが並列実行されなければならない
Selenium Gridの環境下で自動テストを実行する必要がある
課題
同一(種類、バージョン)ブラウザを複数のSelenium Grid Nodeで並列実行できるか確認する
![Page 6: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/6.jpg)
本資料の用語定義
自動テスト
テストにおけるブラウザの操作を、テストシステムへの入力として一定のアプローチに基づき定めたもの
テストシステムへの入力
今回はキーワード駆動アプローチを用いた為、テストステップファイルがそれに該当する
構造化スクリプトを使用したアプローチの場合は、テストコード(Javaならメソッド)がそれに該当する(データ駆動アプローチであるかどうかは無関係)
テストシステム
自動テストを一定のルールに基づき実行するプログラム
自動テストの識別や実行はJUnit、TestNG等のテストツールに委譲するよう設計するのが一般的である
自動テストをブラウザへのリクエストに変換する部分はSelenium に委譲する
自動テストが実行される仕組み(詳細は別スライドにて後日解説予定)
テストシステムは自動テストをselenium-java.jar等のライブラリを使用して実装する(一般的に、「Seleniumを使う」と言った場合、これを指す)
テストシステムの実行時に自動テストはWebDriverの提供するJSON Wire Protocolに準拠するHTTPリクエストに変換される
JSON Wire Protocolに準拠したHTTPリクエストは、selenium-server-standalone-x.x.x.jarやchoromedriver.exe等の各種ドライバが実装するRestful APIで受信できるようになる
この結果、各種ブラウザに対応したドライバによってブラウザの操作(自動テスト)が実行される
![Page 7: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/7.jpg)
ユースケース図
![Page 8: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/8.jpg)
主なユースケース記述1
テストシステムによる自動テストリクエストの送信
テストシステムは、Hub役のSelenium Serverへ従来通りJSON Wire Protocolに従った自動テストをHTTPリクエストとして送信する
参照
「本資料の用語定義」>「自動テストが実行される仕組み」
![Page 9: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/9.jpg)
主なユースケース記述2
Selenium Grid Hub の起動・停止
Selenium Server 搭載サーバは、起動時にGrid Hub をサービスとして起動する
Selenium Server 搭載サーバは、停止時にGrid Hubサービスを停止する
Selenium Grid Node の起動・停止
Selenium Server搭載クライアントは、起動時にGrid Nodeをサービスとして起動する
Node役のSelenium Serverは、サービス起動時に特定のブラウザの操作に特化したドライバのセッションを生成する
課題と対策
テストが複数種類のブラウザに跨る場合、複数クライアントに同一ブラウザのインスタンスを生成しても、Hub役はリクエストの転送しか行いません。つまり負荷分散をしないのでリクエストが偏る場合があります。その偏りを防ぐ為に、ここではNode役にブラウザの種類を1:1で紐付けます。
Selenium Server搭載クライアントは、停止時にGrid Nodeサービスを停止する
![Page 10: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/10.jpg)
主なユースケース記述3
Selenium Grid Hub のリクエストの送・受信
Hub役のSelenium Serverは、テストシステムからリクエストを受信する
Hub役のSelenium Serverは、Node役のSelenium Serverにリクエストを送信する
Selenium Grid Node のリクエストの受信
Node役のSelenium Serverは、受信したリクエストを指定されたブラウザドライバに送信する
ブラウザドライバは、受信したリクエストに基づきブラウザを操作する
![Page 11: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/11.jpg)
要求の実現イメージ
自動テスト実行イメージ
テストシ
ステム
Selenium Server Hub
Selenium Server Node
chrome driver etc…
Google Chrome
etc…
自動テスト
自分の端末 開発用サーバ等
テスト実行端末1
テスト実行端末2
テスト実行端末3
テスト実行端末…
ドライバへのHTTPリクエストの送受信はバックグラウンドで実行される
![Page 12: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/12.jpg)
課題
Selenium Serverの配布、設定が面倒
テスト実行用端末へのNode役のSelenium Server
開発用サーバ等へのHub役のSelenium Server
![Page 13: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/13.jpg)
Selenium Gridをサービス化する方法とポイント
![Page 14: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/14.jpg)
Selenium Server Grid Hub & Node のサービス化
用意するもの
Java Service Wrapper https://wrapper.tanukisoftware.com/doc/japanese/introduction.html
各種ドライバ
IEDriver , chrome driver , gecko driver
基本手順
実行環境に依存する為、次の躓きがちなポイントを抑える
ここでは下記公式の手順書を参照すれば分かることは割愛する
参考文献
https://wrapper.tanukisoftware.com/doc/japanese/integrate.html#method4
https://wrapper.tanukisoftware.com/doc/japanese/integrate-jar-win.html
![Page 15: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/15.jpg)
サービス化のポイント1
4種類のサービス化の方法のうち、今回はselenium-server-standalone-x.x.x.jarファイルが既に提供されていることから、WrapperJarAppヘルパークラスを使用する方法を採用する。
よってwrapper.confでは、wrapperクラスがselenium-serverは実行されるように指定する
![Page 16: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/16.jpg)
サービス化のポイント2
wrapperクラスがselenium-server-standalone-x.x.x.jar実行する時に必要なパラメータを指定する。
スペース区切りで1つずつパラメータを指定する。10個目のクォートで囲むパラメータは上記の通り指定する。
![Page 17: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/17.jpg)
サービス化のポイント3
これは、Windows 7(64bit)「services.msc」で参照したインストール後のサービスの状態。
4行目「ログオン」列を見ると、1~3行目とユーザが異なっていることが分かる。次スライドで理由を説明する。
![Page 18: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/18.jpg)
サービス化のポイント4
自動テストで証跡としてスクリーンショットを撮る場合の注意点
Internet Explorerは、ローカルシステムアカウントのサービスとして実行されない場合、スクリーンショットが真っ黒になる為、下記の通り設定する。
一方、Chromeはローカルシステムアカウントの場合、自動テストが実行されないため、以下の通り設定する。
![Page 19: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/19.jpg)
サービス化のポイント5
selenium-server-standalone-x.x.x.jar(Node役のSelenium)がJSON Wire Protcol
に基づくHTTPリクエストを送信するドライバは、binディレクトリに格納する
![Page 20: 20161212 selenium adventcalender](https://reader031.fdocuments.net/reader031/viewer/2022020203/5a6622f47f8b9a214f8b5a0b/html5/thumbnails/20.jpg)
結果
自分の端末で実行する場合も、自動テストが画面を占有しなくなった
利用者不在の稼働中端末でも、自動テストを実行出来るようになった
端末利用者が在席している場合も、自動テストがその仕事を邪魔しないようになった
Java Service Wrapperのお陰でSelenium Serverをパッケージ化できた為、開発用サーバ等やテスト実行端末へのSelenium Serverの配布、インストールが容易になった
Selenium Serverのサービス/デーモン化に挑戦してみよう!