勉強会メモ：関西Javaエンジニアの会 8/5 - Selenium

# はじめに

今月の関ジャバはSelenium特集でした。Selenideの現場での活用事例からSeleniumプロジェクトの動向など幅広い内容でE2Eテストに取り組んでいるエンジニアにとってはためになる内容なのではないかと思います。
途中からMacのバッテリーが足りなくて雑なメモになっています。すみません。

# 概要

[関西Javaエンジニアの会 8/5 - Selenium](https://kanjava.connpass.com/event/61819/)
日時：2017/08/05(土) 14:00 〜 17:00
場所：貸し会議室「ユーズ・ツウ」富士株式会社

## 会場アンケート

使ったことがある人

- Selenium…7割ぐらい
- Selenide…2割ぐらい
- FluentLenium…1人

# Selenideを使ったテストで工夫していることとこれからやろうとしていること

発表者: [backpaper0](https://twitter.com/backpaper0)

## [Selenide](http://selenide.org/) とは

- Selenium WebDriverを使いやすくラップしたフレームワーウ
- E2Eテスト向き
- CodeBorne社（エストニア）
- seleide-appiumもある

詳しくは [Web+DB Press vol.100 の「【第9回】Selenideでブラウザ自動テスト ……使い方から現場で遭遇する問題まで」](http://gihyo.jp/magazine/wdpress/archive/2017/vol100) に投稿

- jQueryっぽい書き方ができる
- Ajaxのテストが簡単
  - リトライの仕組みがある
- ベースURLとかWebDriverの設定をシステムプロパティできて簡単

## 現在の取組み

- 手動で操作してスクショをExcel⇒Selenideでテスト自動化を上司へプッシュ
- SelenideでE2Eテストを自動化しつつスクショも撮る
- 受け入れの人たちがスクショを確認

## 工夫していること

### 想定通りのページが表示されているか検証したい

meta要素に画面名を入れて検証
⇒業務アプリなので画面単位にはtitleタグが変わらない

### 初期処理の完了を待ちたい

初期表示したデータもAjaxで取得しているため`shouldBe` を使った。waitを書かなくてもリトライしてくれる。

``` java
// 状態を確認
$("#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や対象ブラウザなどを設定

``` java
if (System.getProperty("selenide.baseUrl") == null) {
  System.setProperty("selenide.baseUrl", "http://localhost:8080");
}
```

## これから

- テストデータの投入、DBの検証はDBUniｔ
- ページオブジェクトを半自動生成したい

例）
ページオブジェクトにアノテーションでセレクタを書いたら値を取得してその変数にセットする

- 日本語メソッド＋メソッドチェーン

※イメージ

```java
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 さん
[発表資料](https://speakerdeck.com/shimashima35/example-of-e2e-automation-test-architecture-by-selenide-in-osaka)

元ネタは以下の記事
[SelenideによるDSL風E2E自動テスト基盤開発の実例](http://qiita.com/shimashima35/items/6d39be9a4fea05dcc84f)

## 基盤開発の目的

- 高い保守性、生産性
- 可能であれば使用策定者が自分でテストでを書けるようにする

## 階層化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](https://github.com/chenry/monte)
- [BrowserStack](https://www.browserstack.com/) などを使えば不要

### 基盤作成その後…

- 基盤は作ったがシナリオ実装が進まず
- AWSに移行したら録画できない
- シナリオがメンテされず

# [FluentLenium](http://fluentlenium.org/) の導入で困った話

発表者： [@kitkat_twit](https://twitter.com/kitkat_twit) さん

## FluentLenium

- [Quickstart](http://fluentlenium.org/docs/) のままでは動かない
- Webdriverの設定が必要
- そもそもSeleniumの知識が前提として必要

## テストデータの準備

- DBUnit…大量データ投入
- DBSetup…DAO/Repository のユニットテスト

## テストプロジェクトの扱い

- 同一プロジェクトにする？
- ユニットテストと一緒に動かす？

⇒別プロジェクトのほうがいいのではないか？
ただし、別にすると動かすのを忘れがち


# Selenium Committer Day 2017 代演 in Osaka

発表者：Naoya Kojima／[@jugemix](https://twitter.com/jugemix)

元ネタ：
[コミッターが語るSeleniumのいま，そして未来 ―「Selenium Committer Day 2017」レポート](ttp://gihyo.jp/news/report/2017/07/2601)

## 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](https://bmp.lightbody.net) がある
  - テストに組み込むことでブラウザのresponseなどを捕捉できる
  - kibanaで集計して把握できる

## Manoj Kumar - コンテナを使ったテスト


dockerを使ったテスト

- Selenium Gridを使って分散実行してくるとDockerが便利
- 起動が早い
- [docker-selenium](https://github.com/SeleniumHQ/docker-selenium)

## QAパネルディスカッション

[Slido.com](https://www.sli.do) を使った

[Selenium Committer Day 2017『Q&Aパネルディスカッション』聴講レポート #Seleniumjp](http://nihonbuson.hatenadiary.jp/entry/2017/07/05/090000)

# 所感

- Selenium周辺のツールやノウハウが充実してきており、開発プロジェクトでE2Eテストの自動化に取組みやすくなってきている
- 特にSelenideはjQueryライクで実装できるため実装者にとって敷居が低く現場の理解も得られやすそう
- テストコード作成の生産性やメンテナンス性にまじめに取り組むにはPage Objectなどの共通設計は必要
- 共通基盤を作ってテストしやすくすることは生産性やメンテナンス性のうえでは重要だが、継続的にE2Eテストを活用できるかは恐らく別の問題で開発プロジェクト全体でのE2Eテストへの理解が必要
- 録画機能は便利かもしれない
- テスト用のデータはDBUnitなどのツールで作る手法が一般的（この領域のノウハウはまだまだこれからという気がした）
- W3C勧告とその後のブラウザベンダーによるWebDriver提供には期待したいが不安はある（IEがちゃんと準拠してくれるか？とか）
- selenium-dockerは活用したい（というか必要になるほどE2Eテストを増やすのが先…）