Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SelenideよるDSL風E2Eテスト基盤開発の実例 in Osaka /Example_of_E2E_Automation_Test_Architecture_By_Selenide_in_Osaka

SelenideよるDSL風E2Eテスト基盤開発の実例 in Osaka /Example_of_E2E_Automation_Test_Architecture_By_Selenide_in_Osaka

SHIMANE, Yoshikazu

August 05, 2017
Tweet

More Decks by SHIMANE, Yoshikazu

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. View Slide

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

    View Slide

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

    View Slide

  17. View Slide

  18. View Slide

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

    View Slide

  20. デモ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide