Slide 1

Slide 1 text

SelenideによるDSL風E2Eテスト基 盤開発の実例 in Osaka 関西Javaエンジニアの会 8/5 - Selenium 島根 義和 @shimashima35 https://srad.jp/~shimashima

Slide 2

Slide 2 text

はじめに ● 社内で開発したWebDriver(Selenide)を使ったE2Eテスト基盤の実例を紹介します。 ● 基本的にJavaが前提ですが、静的型付けのメリット以外は他言語でも利用可能で す。

Slide 3

Slide 3 text

注意 ● Test Engeneer MeetUp #2 の発表内容がベースになっています。 ● 基本的にQiitaで公開した内容とほぼ同じです。 ○ http://qiita.com/shimashima35/items/6d39be9a4fea05dcc84f

Slide 4

Slide 4 text

Selenideとは? ● JavaのSelenium WebDrvierラッパーライブラリ。 ● http://selenide.org/ ● WebDriverの実装を抽象化し、UI Testに特化したAPIを提供している。 ● 読みやすいAPI。 ● IDEによるサポートを意識した作り。

Slide 5

Slide 5 text

基盤開発の目的 ● 高い保守性 ● 高い生産性 ● 可能であれば仕様策定者が自分でテストをかけるようにする

Slide 6

Slide 6 text

階層化Page Object Pattern導入 ● 一般的なPage Object Patternを拡張 ○ BasePage ■ 抽象クラス ■ セレクタのみが記述される ■ WebDriver/Selenide API依存 ■ メソッドシグネチャにも Selenideの型が現れる ○ Page ■ 具象クラス ■ 抽象化した画面操作 APIを提供する層 ■ メソッドシグネチャは Java標準APIの型のみ

Slide 7

Slide 7 text

階層化Page Object Pattern導入 サンプル

Slide 8

Slide 8 text

Selenium/Selenideの直接操作の排除 ● テストシナリオでSelenium/Selenideの実装を隠蔽する。 ○ シナリオの注力する ○ 実装隠蔽による変更耐性向上 ○ 特別なAPI学習の必要性を排除

Slide 9

Slide 9 text

全面的な日本語メソッド化 ● 税務・会計・給与を対象しているため ○ 一般的なWeb画面に比べて入力項目が多数 ○ 似たような名前で且つ業務的に特殊な用語が使われることが多い ○ 日本語化することで画面の項目とメソッド名とのギャップを埋める ● 非プログラマでもテストをかけるように ○ 心理的障壁をさげる

Slide 10

Slide 10 text

全面的な日本語メソッド化 サンプル  

Slide 11

Slide 11 text

疑似Builder Patternによるデータ登録 ● ユーザ登録などで入力項目が多数になる ● シナリオで記述は大変 ● 共通メソッド化を行うにしても引数が多い、また入力しなくても良い項目の存在 ● Builder Patternを導入することでわかりやすくする

Slide 12

Slide 12 text

疑似Builder Patternによるデータ登録 サンプル

Slide 13

Slide 13 text

Mix-inによる画面共通項目の一元化 ● 画面単位の処理はPage Objectで対応 ● 画面横断的な処理はどうするか? ● Mix-inで対応 ● Java8 interface の default method で実現

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

Mix-inによる画面共通項目の一元化 サンプル

Slide 16

Slide 16 text

画面要素の細かいObject化 ● 画面上の項目数が多い & コンテキスト(配置場所)違いで同じ名称が存在している ● コンテキストをすべてClass化 (Page Objectのinner class) ● コンテキストへのアクセスはメソッド経由

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

疑似的なDSLのために、戻り値をObject化 ● Selenideのように、IDEの力を借りるため ● 戻り値をObjectにすることでIDEの補完機能が使える

Slide 20

Slide 20 text

デモ

Slide 21

Slide 21 text

終わりに ● テスト自動化は大変ですが、様々な手法を使うことで苦労を軽減することができま す。 ● IDEの力も、可能なかぎり借りましょう。 ● 自動化はコストがかかるので、頼り過ぎには注意を。 ● 目的をはっきりさせた上で使いましょう。

Slide 22

Slide 22 text

最初の実装 ● 開発直後からすべてできていたわけではない。 ● 以下は最初から対応。 ○ 階層化Page Object Pattern ○ Selenium/Selenideの直接操作の排除 ○ 全面的な日本語メソッド化 ● 残りは途中で改良 ● 設計方針が決まれば実装はさほど手間ではない。

Slide 23

Slide 23 text

録画機能の追加 ● ローカルで成功するがCI環境で失敗することは結構ある。 ○ 明示的なwaitを入れていても。 ● ログだけでは原因追求が難しいため、操作を録画する機能を追加。 ● 基本的にすべての操作を録画しておき、テスト成功時には削除する。 ○ つまり、失敗時の動画のみのこる。 ● H.264やmpeg2などでは数分で200MByte程度。(記憶) ● 画面キャプチャ用のコーデックを使うことで1/100程度に削減。 ○ TechSmith Screen Capture Codec ○ 録画用ライブラリはMonte Media Library ● BrowserStackなどを使っていれば実は不要。

Slide 24

Slide 24 text

基盤作成のその後… ● 当初目標大幅未達! ● 基盤は作ったもののシナリオ実装が進まず。 ○ 現在担当者不在。 ● 実行基盤をAWSに移行したが、その結果録画が機能せず。 ○ ローカルのフレームバッファーがないためだと思う。 ● 現在メンテされず絶賛放置中。 ○ でもJenkinsで定期実行はされています。 ● 私も半年以上Selenide触っていません。

Slide 25

Slide 25 text

ご静聴ありがとうございました