Selenium を活用してリリース時の本番動作確認を 80% 効率化した話

* 弊社の注力サービスである [楽楽精算](https://www.rakurakuseisan.jp/) での Selenium の活用事例について紹介します
* 取り組みの紹介が中心のため、今回はコードは出てきません
    * [テックブログ](http://tech-blog.rakus.co.jp/)にて後日実装方法などの解説をする...かもしれません

----

## 課題

----

## リリース時の本番動作確認に時間がかかる

* リリース作業において、アプリケーションのデプロイ後に毎回、本番サーバに１台ずつログインして**手動で**動作確認を行っていた
    * しかも、確認手順や観点はほとんどリリース担当者まかせ
* １回のリリース作業につき**数10クラスタ**のサーバ群(オンプレ)
* １人で確認すると**２時間**くらいかかる

----

## それ Selenium で自動化できますよ

----

## 動作イメージ

* サーバ一覧を舐めて順番に動作確認テストを実行する

![スクリーンショット 2017-12-11 12.26.04.png](https://qiita-image-store.s3.amazonaws.com/0/3899/a65cd4b3-cc66-6db0-e0dc-78842a33975e.png)

----

## 自動化した結果（効果）

* （定量的）動作確認にかかる時間が、１リリース作業あたり**約20分**に
    * ８３％（2時間→20分）の稼働削減
    * **これからずっと**８３％オフ
    * この時間はさらに短縮可能（※後述）
* （定性的）リリース担当者からめっちゃ楽になったという声
* （副次的）テストコード化するにあたり、確認手順や観点が整理された

----

## 工夫したこと

----

## かんたんに実行できる

* 動作確認対象のサーバ一覧ファイル（CSVファイル）を作って、コマンドを１つ実行するだけ
    * Selenium の知識がなくても実行できる
    
    ```bash
    # 実行例
    ./gradlew clean releaseCheck
    ```

* いちど実行開始すれば終るまで手放しで良いので、作業者は別の作業に取り組める
* サーバ一覧ファイルを分割して複数クライアントから実行すれば、かんたんに作業をスケールできる

----

## サーバ一覧ファイルのイメージ

* 誰でもつくれるCSVファイル

```
{リリースバージョン},{クラスタ名},{サーバ名},{ログインURL},{以降、テスト用パラメータ...}
8.3.3.0,cluster1,serverX,https://10.100.X.1/xxxxxxxx/,...
8.3.3.0,cluster2,serverY,https://10.100.X.2/xxxxxxxx/,...
8.3.3.0,cluster3,serverZ,https://10.100.X.3/xxxxxxxx/,...
 :
```
----

## かんたんに実行結果を確認できる

* 実行結果を２つのファイルに分けて出力
    * リリース担当者が結果を確認するためのサマリーログ
    * エラー発生時に開発者が確認するためのスタックトレースログ

----

## サマリーログのイメージ

* 実行結果の一覧性を重視
* エクセルにコピペしやすいようタブ区切り

```
2017-12-11 13:52:46,033  START   cluster1  serverX
2017-12-11 13:53:03,296  FINISH  cluster1  serverX
2017-12-11 13:53:03,296  START   cluster2  serverY
2017-12-11 13:53:10,277  ERROR   cluster2  serverY  com.example.LoginTest  testLogin
2017-12-11 13:53:46,165  FINISH  cluster2  serverY
2017-12-11 13:53:46,165  START   cluster3  serverZ
2017-12-11 13:54:27,580  FINISH  cluster3  serverZ
 :
```

----

## スタックトレースログのイメージ

* エラーの原因を特定するために Selenium(Selenide) のスタックトレースを出力

```
2017-12-11 13:53:10,277  ERROR   cluster2  serverY  com.example.LoginTest
org.openqa.selenium.TimeoutException: Expected condition failed: waiting for frame to be available: main (tried for 4 second(s) with 100 MILLISECONDS interval)
Build info: version: '3.0.1', revision: '1969d75', time: '2016-10-18 09:49:13 -0700'
System info: host: 'E2ETEST-MACHINE', ip: '192.168.71.151', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_25'
Driver info: driver.version: unknown
    at org.openqa.selenium.support.ui.FluentWait.timeoutException(FluentWait.java:296)
    at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:265)
    at com.codeborne.selenide.SelenideTargetLocator.frame(SelenideTargetLocator.java:32)
    at com.example.TopPage.<init>(TopPage.java:13)
    at com.example.LoginPage.login(LoginPage.java:26)
    at com.example.LoginTest.testLogin(LoginTest.java:43)
      :
```

----

## まとめ

----

## まとめ

* Selenium を活用できるのは開発時のリグレッションテストだけではない
* 定量的な効果に加えて、定性的・副次的な効果も見逃せない
* 新しい仕組みを作るの楽しいし、効果がでれば嬉しい！

---

## おまけ

* 弊社でも今年からデベロッパーブログが始まりました！来年も技術ネタを拡充していきます
    * http://tech-blog.rakus.co.jp/
* 楽楽精算では新卒、中途ともに一緒に開発を盛り上げてくれるエンジニアを絶賛募集中です！
    * http://fresh-recruit.rakus.co.jp/ (新卒採用)
    * https://www.rakus.co.jp/recruit/ (中途採用)