Contenu connexe
Similaire à サイボウズLiveのSeleniumテスト並列化 (20)
サイボウズLiveのSeleniumテスト並列化
- 2. • サイボウズLiveのテスト 3400個
• Seleniumテスト
• Firefoxのみ
• モバイル
• Firefox Mobile Simulatorアドオン
• APIテスト
• HttpUnit
- 3. 実行時間 テスト数
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
- 5. • その前にテストの流れ
1. 最初のテストの前にDBダンプ
2. ブラウザ起動
3. 各テスト実行
1. テストデータ投入(JDBC経由でSQL実行)
2. ブラウザ操作
3. 画面のアサーション
4. DBのアサーション(JDBC経由)
5. DBリストア
4. ブラウザ終了
5. 2に戻る
- 9. • Jenkinsレベルで並列化
• マルチ構成プロジェクトで条件を変えて並
列実行できる
• 本来は複数のブラウザ(IE, Firefox,
Chrome)を同時並列実行させる機能
• プロセス単位で並列化
• これしかない
- 12. • 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 );
}
}
- 13. 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
- 15. • Selenium1だと途中で止まる( )
• 仕方なくSelenium2化
• Selenium1はFirefox4以上で動かないので結果
的におk
• Selenium2にSelenium1ラッパーがあったので
移行コストは少なくて済む
- 16. 実行時間 テスト数
8hour 4,000
7.9
6hour
3030 3169 3,000
5.1
4hour 2,000
2hour 1,000
0hour 0
2011/11 3並列化
- 18. 実行時間 テスト数
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最適化
- 21. 実行時間 テスト数
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最適化 実マシン化
- 25. 実行時間 テスト数
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最適化 実マシン化 ポート分散
- 28. • 最初のテスト開始前にブラウザを起動して、最後のテスト
終了後にブラウザを終了させる
• ブラウザ起動が1回で済む
• @BeforeClassと@AfterClasssしか使えないので難しい
• 終了タイマー方式を閃く
• @AfterClassで終了タイマースレッドを起動して、次テス
トの@BeforeClassでタイマーを止める
• タイマーが止められなければ一定時間後にブラウザを
終了
- 31. • 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 );
}
}
- 32. 実行時間 テスト数
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最適化
実マシン化 ポート分散ラウザ起動抑制
ブ
- 34. 実行時間 テスト数
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
- 35. • 3並列化で実行時間が約1/3に
• 結果的にSelenium2に対応できた
• まだまだ並列化できる余地あり
• 16並列までいけるかも?
JenkinsサーバのCPU
- 36. • 課題
• Seleniumのメソッドを変更しているので、
バージョンアップには注意が必要になってしまった
• Jenkinsの設定がややこしい
• 並列実行でMavenローカルリポジトリを同時変更するとリポジト
リが壊れる
• オフラインオプション(-o)を付けて回避
• ローカルリポジトリを更新させるには、-oを外して、単独実行
させて、と面倒
• 専用のJenkinsプラグインを作るとある程度解決できるのかも
Notes de l'éditeur
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n
- \n