20161212 selenium adventcalender

Preview:

Citation preview

Selenium Serverをサービス化した時の話

Dec/12/2016

Naoya Kojima

@jugemix

環境作りの前にやりたいこと(背景・要求)と、ユースケースによる実現手法の整理

背景

Selenium を使って実装した自動テストを自分の端末で実行していた

画面を占有される為、他の作業をできなかった

自動テスト実行イメージ

時々遊んでいる(使われていない時間がある)端末が隣にあった

テストシステ

Selenium Server

chrome driver etc…

Google Chrome etc…

自動テスト 自動テスト 自動テスト

自分の端末

ビジネス要求

自分の端末で実行する場合は、自動テストが画面を占有しないようにしたい

自動テストは従来通り自分の端末で実行するが、利用者不在の稼働中端末があれば、そこでも実行出来るようにしたい

端末利用者が在席している場合は、自動テストがその仕事を邪魔しないようにしたい

機能要求

自動テストは、バックグランドで実行されなければならない

ブラウザを操作するSelenium をバックグランドで実行する必要がある

バックグランドで実行

サービス/デーモンとして実行すること

課題

バックグランドでSelenium を実行できるのか確認する

このとき、意図するブラウザで自動テストを実行できるのか確認する

複数端末で互いに独立したテストケースが並列実行されなければならない

Selenium Gridの環境下で自動テストを実行する必要がある

課題

同一(種類、バージョン)ブラウザを複数のSelenium Grid Nodeで並列実行できるか確認する

本資料の用語定義

自動テスト

テストにおけるブラウザの操作を、テストシステムへの入力として一定のアプローチに基づき定めたもの

テストシステムへの入力

今回はキーワード駆動アプローチを用いた為、テストステップファイルがそれに該当する

構造化スクリプトを使用したアプローチの場合は、テストコード(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で受信できるようになる

この結果、各種ブラウザに対応したドライバによってブラウザの操作(自動テスト)が実行される

ユースケース図

主なユースケース記述1

テストシステムによる自動テストリクエストの送信

テストシステムは、Hub役のSelenium Serverへ従来通りJSON Wire Protocolに従った自動テストをHTTPリクエストとして送信する

参照

「本資料の用語定義」>「自動テストが実行される仕組み」

主なユースケース記述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サービスを停止する

主なユースケース記述3

Selenium Grid Hub のリクエストの送・受信

Hub役のSelenium Serverは、テストシステムからリクエストを受信する

Hub役のSelenium Serverは、Node役のSelenium Serverにリクエストを送信する

Selenium Grid Node のリクエストの受信

Node役のSelenium Serverは、受信したリクエストを指定されたブラウザドライバに送信する

ブラウザドライバは、受信したリクエストに基づきブラウザを操作する

要求の実現イメージ

自動テスト実行イメージ

テストシ

ステム

Selenium Server Hub

Selenium Server Node

chrome driver etc…

Google Chrome

etc…

自動テスト

自分の端末 開発用サーバ等

テスト実行端末1

テスト実行端末2

テスト実行端末3

テスト実行端末…

ドライバへのHTTPリクエストの送受信はバックグラウンドで実行される

課題

Selenium Serverの配布、設定が面倒

テスト実行用端末へのNode役のSelenium Server

開発用サーバ等へのHub役のSelenium Server

Selenium Gridをサービス化する方法とポイント

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

サービス化のポイント1

4種類のサービス化の方法のうち、今回はselenium-server-standalone-x.x.x.jarファイルが既に提供されていることから、WrapperJarAppヘルパークラスを使用する方法を採用する。

よってwrapper.confでは、wrapperクラスがselenium-serverは実行されるように指定する

サービス化のポイント2

wrapperクラスがselenium-server-standalone-x.x.x.jar実行する時に必要なパラメータを指定する。

スペース区切りで1つずつパラメータを指定する。10個目のクォートで囲むパラメータは上記の通り指定する。

サービス化のポイント3

これは、Windows 7(64bit)「services.msc」で参照したインストール後のサービスの状態。

4行目「ログオン」列を見ると、1~3行目とユーザが異なっていることが分かる。次スライドで理由を説明する。

サービス化のポイント4

自動テストで証跡としてスクリーンショットを撮る場合の注意点

Internet Explorerは、ローカルシステムアカウントのサービスとして実行されない場合、スクリーンショットが真っ黒になる為、下記の通り設定する。

一方、Chromeはローカルシステムアカウントの場合、自動テストが実行されないため、以下の通り設定する。

サービス化のポイント5

selenium-server-standalone-x.x.x.jar(Node役のSelenium)がJSON Wire Protcol

に基づくHTTPリクエストを送信するドライバは、binディレクトリに格納する

結果

自分の端末で実行する場合も、自動テストが画面を占有しなくなった

利用者不在の稼働中端末でも、自動テストを実行出来るようになった

端末利用者が在席している場合も、自動テストがその仕事を邪魔しないようになった

Java Service Wrapperのお陰でSelenium Serverをパッケージ化できた為、開発用サーバ等やテスト実行端末へのSelenium Serverの配布、インストールが容易になった

Selenium Serverのサービス/デーモン化に挑戦してみよう!

Recommended