- 弊社の注力サービスである 楽楽精算 での Selenium の活用事例について紹介します
- 取り組みの紹介が中心のため、今回はコードは出てきません
- テックブログにて後日実装方法などの解説をする...かもしれません
課題
リリース時の本番動作確認に時間がかかる
- リリース作業において、アプリケーションのデプロイ後に毎回、本番サーバに1台ずつログインして手動で動作確認を行っていた
- しかも、確認手順や観点はほとんどリリース担当者まかせ
- 1回のリリース作業につき数10クラスタのサーバ群(オンプレ)
- 1人で確認すると2時間くらいかかる
それ Selenium で自動化できますよ
動作イメージ
- サーバ一覧を舐めて順番に動作確認テストを実行する
自動化した結果(効果)
- (定量的)動作確認にかかる時間が、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 を活用できるのは開発時のリグレッションテストだけではない
- 定量的な効果に加えて、定性的・副次的な効果も見逃せない
- 新しい仕組みを作るの楽しいし、効果がでれば嬉しい!
おまけ
- 弊社でも今年からデベロッパーブログが始まりました!来年も技術ネタを拡充していきます
- 楽楽精算では新卒、中途ともに一緒に開発を盛り上げてくれるエンジニアを絶賛募集中です!