Selenium
Selenide
ラクスDay 11

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

  • 弊社の注力サービスである 楽楽精算 での Selenium の活用事例について紹介します
  • 取り組みの紹介が中心のため、今回はコードは出てきません
    • テックブログにて後日実装方法などの解説をする...かもしれません

課題


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

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

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


動作イメージ

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

スクリーンショット 2017-12-11 12.26.04.png


自動化した結果(効果)

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

工夫したこと


かんたんに実行できる

  • 動作確認対象のサーバ一覧ファイル(CSVファイル)を作って、コマンドを1つ実行するだけ

    • Selenium の知識がなくても実行できる
    # 実行例
    ./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/,...
 :

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

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

サマリーログのイメージ

  • 実行結果の一覧性を重視
  • エクセルにコピペしやすいようタブ区切り
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 を活用できるのは開発時のリグレッションテストだけではない
  • 定量的な効果に加えて、定性的・副次的な効果も見逃せない
  • 新しい仕組みを作るの楽しいし、効果がでれば嬉しい!

おまけ