はじめに
今月の関ジャバはSelenium特集でした。Selenideの現場での活用事例からSeleniumプロジェクトの動向など幅広い内容でE2Eテストに取り組んでいるエンジニアにとってはためになる内容なのではないかと思います。
途中からMacのバッテリーが足りなくて雑なメモになっています。すみません。
概要
関西Javaエンジニアの会 8/5 - Selenium
日時:2017/08/05(土) 14:00 〜 17:00
場所:貸し会議室「ユーズ・ツウ」富士株式会社
会場アンケート
使ったことがある人
- Selenium…7割ぐらい
- Selenide…2割ぐらい
- FluentLenium…1人
Selenideを使ったテストで工夫していることとこれからやろうとしていること
発表者: backpaper0
Selenide とは
- Selenium WebDriverを使いやすくラップしたフレームワーウ
- E2Eテスト向き
- CodeBorne社(エストニア)
- seleide-appiumもある
詳しくは Web+DB Press vol.100 の「【第9回】Selenideでブラウザ自動テスト ……使い方から現場で遭遇する問題まで」 に投稿
- jQueryっぽい書き方ができる
- Ajaxのテストが簡単
- リトライの仕組みがある
- ベースURLとかWebDriverの設定をシステムプロパティできて簡単
現在の取組み
- 手動で操作してスクショをExcel⇒Selenideでテスト自動化を上司へプッシュ
- SelenideでE2Eテストを自動化しつつスクショも撮る
- 受け入れの人たちがスクショを確認
工夫していること
想定通りのページが表示されているか検証したい
meta要素に画面名を入れて検証
⇒業務アプリなので画面単位にはtitleタグが変わらない
初期処理の完了を待ちたい
初期表示したデータもAjaxで取得しているためshouldBe
を使った。waitを書かなくてもリトライしてくれる。
// 状態を確認
$("#state").shouldBe(exactText("initialized"))
IEが期待通りの動作をしない
- Chromeならいい感じにテストできる
- お客様の標準ブラウザがIE⇒期待通り動作しなかったりしてつらい
IEの場合
valメソッドを呼ぶとちゃんと入力できない
(sendKeyで1文字ずつ入力すればうまくいくが…)
⇒ Commands#add
でCommandを上書きできるのでこのへんをhackしてIEの動作を調整
IEが遅い
(Commandをhackしたせいもある)
別のPCでリモート実行
- 実装中に軽く動作確認したい場合のためにローカル開発ではChromeで動くようにしている
- StackTraceを取ってIEとChromeの立ち上げを切り替え
コードをVCSからチェックアウトしたらなる早でテスト実行したい
環境に合わせて設定ファイルを書き換えるのが面倒
- JDBC接続情報
- 一時ファイル置き場
- Chromeドライバー、IEドライバーの場所
↓
- Spring Bootの
Condition
やProfile
を活用 -
TestRule
でベースURLや対象ブラウザなどを設定
if (System.getProperty("selenide.baseUrl") == null) {
System.setProperty("selenide.baseUrl", "http://localhost:8080");
}
これから
- テストデータの投入、DBの検証はDBUnit
- ページオブジェクトを半自動生成したい
例)
ページオブジェクトにアノテーションでセレクタを書いたら値を取得してその変数にセットする
- 日本語メソッド+メソッドチェーン
※イメージ
fooに値をセットする("ふー")
.barをクリックする()
質問
Q. 非同期処理の待ちで不安定(遅くなる)ようなことはなかったか?
- それほど待ちが発生するような重い処理が今のところない
- タイムアウトのMAXを変えられる
※Selenideは非同期検証時にリトライ時間とは別に内部的に0.1秒のポーリングを行っている
Q. スクショはどのように管理?
- テストクラスごとにフォルダ管理
Q. ファイルのアップロードでD&Dや複数ファイルアップロードできる?
- D&Dは共通のライブラリなどを使うのでテスト対象から外すかも?
Q. BASIC認証できる?
- やったことない。テストの時だけ変えられない?
- URLに書いて回避する方法がある
- SeleniudのOpenメソッドの引数にIDとPWを指定することができる
Q. ヘッドレスは使う?
- 使わない
- 開発者に実際に動きを目で見て動作確認してもらっている
Q. テストコードは実装者が実装時に書いているのか?
- 実装者が実装時にE2Eテストも書いている
- 実装者がE2Eテストの都合でセレクタを付けている
Q. Selenideを選んだ理由
- 使いやすそう
- 何かあった時に拡張性できそう
SelenideよるDSL風E2Eテスト基盤開発の実例 in Osaka
発表者: @shimashima35 さん
発表資料
元ネタは以下の記事
SelenideによるDSL風E2E自動テスト基盤開発の実例
基盤開発の目的
- 高い保守性、生産性
- 可能であれば使用策定者が自分でテストでを書けるようにする
階層化Page Object Pattern導入
BasePage
- 抽象クラス
- セレクタのみが記述される
- WebDriver/Selenide API依存
- メソッドシグネチャにもSelenideの型が現れる
Page
- BasePageを継承
- テストクラスからシナリオ化して操作
- 原則セレクタ記述がない
Selenium/Selenideの直接操作排除
- Page ObjectによりテストシナリオからSelenium/Selenide実装を隠蔽
- シナリオに注力
- 仕様策定者にテストを書いてもらう
全面的な日本語メソッド化
- 税務会計給与を対象としているため
- 非プログラマでもテストが書けるように
疑似Builder Patternによるデータ登録
- テストシナリオで使うデータはシナリオ内で作成
- 疑似Builder Patternで登録メソッドを準備
- IDEの補完機能が使える
Mix-inによる画面共通項目の一元化
- 画面横断処理はJava8のInterfaceのdefaultメソッドを使用
画面要素の細かいObject化
- コンテキストをすべてClass化(inner Class)
擬似的なDSLのために戻り値をObject化
- IDEの補完が使える
録画機能
- 基本的に全ての操作を録画
- テスト成功したら消す
- 失敗した時の動画だけ残る
- 画面キャプチャ用のコーデックを使うことで1/100に削減できる
- Monte media Library
- BrowserStack などを使えば不要
基盤作成その後…
- 基盤は作ったがシナリオ実装が進まず
- AWSに移行したら録画できない
- シナリオがメンテされず
FluentLenium の導入で困った話
発表者: @kitkat_twit さん
FluentLenium
- Quickstart のままでは動かない
- Webdriverの設定が必要
- そもそもSeleniumの知識が前提として必要
テストデータの準備
- DBUnit…大量データ投入
- DBSetup…DAO/Repository のユニットテスト
テストプロジェクトの扱い
- 同一プロジェクトにする?
- ユニットテストと一緒に動かす?
⇒別プロジェクトのほうがいいのではないか?
ただし、別にすると動かすのを忘れがち
Selenium Committer Day 2017 代演 in Osaka
発表者:Naoya Kojima/@jugemix
元ネタ:
コミッターが語るSeleniumのいま,そして未来 ―「Selenium Committer Day 2017」レポート
Jim Evans - Seleniumのこれから
Jim Evans…元MS、現Salseforce
Seleniumの現在
Slenium v3
- FirefoxのテストにはGecko Driverが必須となった
- WebDriver⇒W3C勧告手前
Seleniumの今後
Selenium v4
- W3C勧告
- 今後は仕様に則って各ブラウザベンダーがWebDriverを開発
遠い将来
- ドライバをブラウザベンダーが開発することでプロジェクトはスリム化するだろう
- ドキュメントの課題
- 公式ドキュメントがまだv2
- ボランティアプロジェクトなのでリソースは充足しているわけではない
Marcus Merrell - Analyticsテスト自動化
Marcus Merrell…QAエンジニア
User Analytics
- B2C向け
- Google Analytics
A/B Testでの失敗談
- 通常はQAがテストしてからリリース
- クーポンの表示がQAの知らないところでリリース
- 人気の低いクーポンが表示されるバグ発生
AnalyticsのQA
- QAが設計工程から隔離されている
- QAが積極的に関与していくべき
- そのために使うツールとして browsermob-proxy がある
- テストに組み込むことでブラウザのresponseなどを捕捉できる
- kibanaで集計して把握できる
Manoj Kumar - コンテナを使ったテスト
dockerを使ったテスト
- Selenium Gridを使って分散実行してくるとDockerが便利
- 起動が早い
- docker-selenium
QAパネルディスカッション
Slido.com を使った
Selenium Committer Day 2017『Q&Aパネルディスカッション』聴講レポート #Seleniumjp
所感
- Selenium周辺のツールやノウハウが充実してきており、開発プロジェクトでE2Eテストの自動化に取組みやすくなってきている
- 特にSelenideはjQueryライクで実装できるため実装者にとって敷居が低く現場の理解も得られやすそう
- テストコード作成の生産性やメンテナンス性にまじめに取り組むにはPage Objectなどの共通設計は必要
- 共通基盤を作ってテストしやすくすることは生産性やメンテナンス性のうえでは重要だが、継続的にE2Eテストを活用できるかは恐らく別の問題で開発プロジェクト全体でのE2Eテストへの理解が必要
- 録画機能は便利かもしれない
- テスト用のデータはDBUnitなどのツールで作る手法が一般的(この領域のノウハウはまだまだこれからという気がした)
- W3C勧告とその後のブラウザベンダーによるWebDriver提供には期待したいが不安はある(IEがちゃんと準拠してくれるか?とか)
- selenium-dockerは活用したい(というか必要になるほどE2Eテストを増やすのが先…)