SlideShare une entreprise Scribd logo
1  sur  36
サイボウズLive
Seleniumテスト並列化
      サイボウズ
    福嶋一史(@kazfuku)
• サイボウズLiveのテスト         3400個

• Seleniumテスト


 • Firefoxのみ


 • モバイル


  • Firefox   Mobile Simulatorアドオン

• APIテスト


 • HttpUnit
実行時間              テスト数

8hour                                                                           4,000



6hour                                                                           3,000



4hour                                                                           2,000



2hour                                                                           1,000



0hour                                                                              0
     2009/6   2009/10   2010/2   2010/6   2010/10   2011/2   2011/6   2011/10
• 朝までに終わらない   \(^o^)/

• 並列化に取り組む
•   その前にテストの流れ

    1. 最初のテストの前にDBダンプ

    2. ブラウザ起動

    3. 各テスト実行

     1. テストデータ投入(JDBC経由でSQL実行)

     2. ブラウザ操作

     3. 画面のアサーション

     4. DBのアサーション(JDBC経由)

     5. DBリストア

    4. ブラウザ終了

    5. 2に戻る
• 方式はどうしよう
• JUnitレベルで並列化


• スレッド単位で並列化


• 既存テストコードをスレッドセーフにしな

 いといけない

• 依存ライブラリがスレッドセーフであると

 は限らない

• 工数がエラいことになりそう
• Seleniumレベルで並列化(Selenium   Grid)

 • DBのリセット(リストア)が必要なので厳し

 い

 • APIなどSeleniumを使っていないテストもあ

 る
• Jenkinsレベルで並列化


 • マルチ構成プロジェクトで条件を変えて並

 列実行できる

  • 本来は複数のブラウザ(IE, Firefox,

  Chrome)を同時並列実行させる機能

 • プロセス単位で並列化


 • これしかない
• Jenkins
• JUnit

 public class DistributedRunner extends BlockJUnit4ClassRunner
 {
   @Override
   public void runChild( FrameworkMethod method, RunNotifier notifier )
   {
     // テスト番号算出
         String testMethodMd5 = toMd5( this.testClass .getCanonicalName() + “#” + method.getMethod().getName() );
         String twoLowerDigitsHex = testMethodMd5.substring( testMethodMd5.length() - 2 );
         int testMethodNumber = Integer.parseInt( twoLowerDigitsHex, 16 );

         // 分散実行判別
         boolean skip = ( testMethodNumber % this.testHostCount .intValue() != this.testHostNumber.intValue() );
         if( skip )
         {
             notifier.fireTestIgnored( ... ); // スキップ通知
             return;
         }

         super.runChild( method, notifier );
     }
 }
test1     test2     test3     test4     test5     test6

testNumber     3         5         4         1         0         2


 parallel1   execute    skip      skip      skip     execute    skip


 parallel2    skip      skip     execute   execute    skip      skip


 parallel3    skip     execute    skip      skip      skip     execute
• こんな感じで並列化
• Selenium1だと途中で止まる(   )

• 仕方なくSelenium2化


 • Selenium1はFirefox4以上で動かないので結果

 的におk

 • Selenium2にSelenium1ラッパーがあったので

 移行コストは少なくて済む
実行時間     テスト数

8hour                             4,000
         7.9

6hour
        3030        3169          3,000


                     5.1
4hour                             2,000



2hour                             1,000



0hour                                0
        2011/11    3並列化
• 思ったほど速くならない


• Selenium2対応が十分でなかった


• クリック後のウェイトを手動でやっていたり


 • 自動で行われるので、ごっそり削除


• 長い文字列のtypeが1文字ずつ入力されてたり


 • JavaScriptでまとめて入力させた
実行時間         テスト数

8hour                                        4,000
         7.9

6hour
        3030      3169          3174         3,000


                   5.1
4hour                                        2,000


                                3.3
2hour                                        1,000



0hour                                           0
        2011/11   3並列化     Selenium2最適化
• オーバーヘッドがあるとしても、力が出し切

れていない気がする

• VMのせいだ!


• ディスクIOが遅いせいに違いない
• jenkinsサーバを実マシンに置き換える


• 本番運用サーバで余ったもの


              旧                   新

  サーバ     バーチャル                 リアル

  CPU   Xeon 2.53GHz x 4   Xeon 2.53GHz x 16

  メモリ         8GB                16GB
実行時間         テスト数

8hour                                             4,000
         7.9
                                         3472
6hour
        3030      3169      3174                  3,000


                   5.1
4hour                                             2,000


                             3.3          3
2hour                                             1,000



0hour                                                0
        2011/11   3並列化   Selenium2最適化   実マシン化
• (´・ω・`)
• ディスクIOじゃない


• ソースコードを読むしかない
• Firefox起動がマシン単位の排他処理になっている


• 固定ポートでロック


• おそらくFirefoxプロファイルのコピー中に割り

 込みを防ぐため

• 並列処理ごとに待つポートを分散


 • Seleniumの該当メソッドをオーバーライドし

  て処理を変更
実行時間       テスト数

8hour                                                4,000
         7.9
                                   3432     3432
6hour
        3030      3169     3174                      3,000


                   5.1
4hour                                                2,000


                           3.3       3       2.9
2hour                                                1,000



0hour                                                   0
        2011/11   3並列化 Selenium2最適化 実マシン化   ポート分散
• (´・ω・`)


• でも並列数が増えてくると効果があるはず
• Firefoxの起動そのものに6秒程度かかる


• プロファイルディレクトリを一時領域にコ

 ピーして、専用アドオンをインストールし
 ている様子

• テストクラスの数だけ、約470回起動して

 いる
•   最初のテスト開始前にブラウザを起動して、最後のテスト
    終了後にブラウザを終了させる

    •   ブラウザ起動が1回で済む

    •   @BeforeClassと@AfterClasssしか使えないので難しい

    •   終了タイマー方式を閃く

        •   @AfterClassで終了タイマースレッドを起動して、次テス
            トの@BeforeClassでタイマーを止める

        •   タイマーが止められなければ一定時間後にブラウザを
            終了
• JUnitがすべてのテスト終了後にユーザース

レッドを殺してくれる

• System.exit()を実行してるっぽい


• (#^ω^)
• 並列処理中で実行するかどうかの判定をテス

トメソッドごとからテストクラスごとに変更

• 起動回数を1/並列数(1/3)に改善
• JUnit

 public class DistributedRunner extends BlockJUnit4ClassRunner
 {
   @Override
   public void run( RunNotifier notifier )
   {
     // テスト番号算出
         String testClassMd5 = toMd5( this.testClass .getCanonicalName() );
         String twoLowerDigitsHex = testClassMd5.substring( testClassMd5.length() - 2 );
         int testClassNumber = Integer.parseInt( twoLowerDigitsHex, 16 );

         // 分散実行判別
         boolean skip = ( testClassNumber % this.testHostCount .intValue() != this.testHostNumber.intValue() );
         if( skip )
         {
             notifier.fireTestIgnored( ... ); // スキップ通知
             return;
         }

         super.run( notifier );
     }
 }
実行時間     テスト数

8hour                                                  4,000
         7.9
                                3432    3432   3432
6hour
        3030      3169   3174                          3,000


                   5.1
4hour                                                  2,000


                         3.3     3       2.9
2hour                                                  1,000
                                               2.2

0hour                                                     0
        2011/11   3並列化Selenium2最適化
                                 実マシン化 ポート分散ラウザ起動抑制
                                           ブ
• ∩(   ・ω・)∩
実行時間            テスト数

8hour                                                                 4,000



6hour                                                                 3,000



4hour                                                                 2,000



2hour                                                                 1,000



0hour                                                                    0
     2009/6 2009/10 2010/2   2010/6 2010/10 2011/2   2011/6 2011/10
•   3並列化で実行時間が約1/3に

•   結果的にSelenium2に対応できた

•   まだまだ並列化できる余地あり

•   16並列までいけるかも?

                     JenkinsサーバのCPU
•   課題

    •   Seleniumのメソッドを変更しているので、
        バージョンアップには注意が必要になってしまった

    •   Jenkinsの設定がややこしい

    •   並列実行でMavenローカルリポジトリを同時変更するとリポジト
        リが壊れる

        •   オフラインオプション(-o)を付けて回避

        •   ローカルリポジトリを更新させるには、-oを外して、単独実行
            させて、と面倒

    •   専用のJenkinsプラグインを作るとある程度解決できるのかも

Contenu connexe

Similaire à サイボウズLiveのSeleniumテスト並列化

1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)
Masahiro Nagano
 

Similaire à サイボウズLiveのSeleniumテスト並列化 (20)

Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新Rubyにおけるトレース機構の刷新
Rubyにおけるトレース機構の刷新
 
Firefox 3.1 & MozTech
Firefox 3.1 & MozTechFirefox 3.1 & MozTech
Firefox 3.1 & MozTech
 
Firefox 3.1 In Depth (?)
Firefox 3.1 In Depth (?)Firefox 3.1 In Depth (?)
Firefox 3.1 In Depth (?)
 
20121215 DevLOVE2012 Mahout on AWS
20121215 DevLOVE2012 Mahout on AWS20121215 DevLOVE2012 Mahout on AWS
20121215 DevLOVE2012 Mahout on AWS
 
Spock's world
Spock's worldSpock's world
Spock's world
 
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
JRoRの力をJava EE技術を使ってさらに高める10の方法(発動編)
 
Jenkins + awsで並列テスト
Jenkins + awsで並列テストJenkins + awsで並列テスト
Jenkins + awsで並列テスト
 
毎日が憧れの新築、反復可能なデリバリーによる常時新築システム
毎日が憧れの新築、反復可能なデリバリーによる常時新築システム毎日が憧れの新築、反復可能なデリバリーによる常時新築システム
毎日が憧れの新築、反復可能なデリバリーによる常時新築システム
 
Play ja 3_update
Play ja 3_updatePlay ja 3_update
Play ja 3_update
 
テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編テスティングフレームワークに入門してみた - Swift編
テスティングフレームワークに入門してみた - Swift編
 
Play jjug2012spring
Play jjug2012springPlay jjug2012spring
Play jjug2012spring
 
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
 
1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)
 
dimSTATから見るベンチマーク
dimSTATから見るベンチマークdimSTATから見るベンチマーク
dimSTATから見るベンチマーク
 
super_unkoをスーパーキレイにした
super_unkoをスーパーキレイにしたsuper_unkoをスーパーキレイにした
super_unkoをスーパーキレイにした
 
Java EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jpJava EE パフォーマンスTips #glassfish_jp
Java EE パフォーマンスTips #glassfish_jp
 
システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4
 
システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4システムパフォーマンス勉強会#4
システムパフォーマンス勉強会#4
 
Twitterのリアルタイム分散処理システム「Storm」入門
Twitterのリアルタイム分散処理システム「Storm」入門Twitterのリアルタイム分散処理システム「Storm」入門
Twitterのリアルタイム分散処理システム「Storm」入門
 
Web時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメWeb時代の大富豪的プログラミングのススメ
Web時代の大富豪的プログラミングのススメ
 

Dernier

Dernier (11)

論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

サイボウズLiveのSeleniumテスト並列化

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n