Upload
kotaro-ogino
View
4.218
Download
2
Embed Size (px)
DESCRIPTION
6月18日、CROOZ株式会社主催の第6回テックヒルズ 「Let’s study Jenkins~さまざまなケーススタディ~」で発表した、「検索基盤開発のための結合テスト自動化」の資料です。
Citation preview
検索検索検索検索基盤開発のための基盤開発のための基盤開発のための基盤開発のための結合テスト環境の自動化結合テスト環境の自動化結合テスト環境の自動化結合テスト環境の自動化
Jun/18/2013
荻野荻野荻野荻野 恒太郎恒太郎恒太郎恒太郎, アビジートアビジートアビジートアビジート パランデパランデパランデパランデ, 松本松本松本松本 幹幹幹幹, 鵜飼鵜飼鵜飼鵜飼 大志大志大志大志
Search Platform Group, Search Section, Big Data Department, Rakuten Inc.
http://www.rakuten.co.jp/
2
自己紹介自己紹介自己紹介自己紹介
氏名氏名氏名氏名 荻野恒太郎
所属所属所属所属 ビッグデータ部サーチプラットフォーム開発グループ
業務業務業務業務 - グローバルサーチプラットフォーム(GSP)のサーチコンポーネント周りの設計・開発・品質検証
- Jenkinsもももも使って
結合テスト環境の自動化
3
結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化
①①①①背景背景背景背景
4
ソフトウェア開発のソフトウェア開発のソフトウェア開発のソフトウェア開発の困難困難困難困難なポイントなポイントなポイントなポイント
5
ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合
コンポーネントA
コンポーネントA
コンポーネントB
コンポーネントB
コンポーネントC
コンポーネントC
pullpulluseuse
コンポーネントD
コンポーネントD
pushpush
コンポーネントE
コンポーネントE
useuse
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2
6
ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合
コンポーネントA
コンポーネントA
コンポーネントB
コンポーネントB
コンポーネントC
コンポーネントC
pullpulluseuse
コンポーネントD
コンポーネントD
pushpush
コンポーネントE
コンポーネントE
useuse
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2
1つのつのつのつのソフトウェアソフトウェアソフトウェアソフトウェア
7
ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合
コンポーネントA
コンポーネントA
コンポーネントB
コンポーネントB
コンポーネントC
コンポーネントC
pullpulluseuse
コンポーネントD
コンポーネントD
pushpush
コンポーネントE
コンポーネントE
useuse
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2
仮説:Eへの影響がない仮説:Eへの影響がない
8
ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合
コンポーネントA
コンポーネントA
コンポーネントB
コンポーネントB
コンポーネントC
コンポーネントC
pullpulluseuse
コンポーネントD
コンポーネントD
pushpush
コンポーネントE
コンポーネントE
useuse
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2
仮説:Dのスキーマに変更がない
仮説:Dのスキーマに変更がない
9
ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合
コンポーネントA
コンポーネントA
コンポーネントB
コンポーネントB
コンポーネントC
コンポーネントC
pullpulluseuse
コンポーネントD
コンポーネントD
pushpush
コンポーネントE
コンポーネントE
useuse
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2
仮説:Cには異常なデータは
含まれない
仮説:Cには異常なデータは
含まれない
10
ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合ソフトウェアの結合
コンポーネントA
コンポーネントA
コンポーネントB
コンポーネントB
コンポーネントC
コンポーネントC
pullpulluseuse
コンポーネントD
コンポーネントD
pushpush
コンポーネントE
コンポーネントE
useuse
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2 Developer 2Developer 2
Developer 2Developer 2
仮説:Bにはバグがない!仮説:Bには
バグがない!
11
コンポーネントの結合コンポーネントの結合コンポーネントの結合コンポーネントの結合====
仮説の検証仮説の検証仮説の検証仮説の検証
12
結合の開発期間に占める割合結合の開発期間に占める割合結合の開発期間に占める割合結合の開発期間に占める割合
CI導入前
開発50%
結合33%
QA17%
プロジェクト中のそれぞれのフェーズの期間割合プロジェクト中のそれぞれのフェーズの期間割合プロジェクト中のそれぞれのフェーズの期間割合プロジェクト中のそれぞれのフェーズの期間割合
仮説仮説仮説仮説の検証は高コストの検証は高コストの検証は高コストの検証は高コスト
13
開発者は多くの開発者は多くの開発者は多くの開発者は多くの仮説仮説仮説仮説を抱えているを抱えているを抱えているを抱えている
“Continuous Integration”, Paul M. Duvall [2006]
14
Continuous Integration
ローカルでのソースコードの変更単体テストの追加
ローカルでのソースコードの変更単体テストの追加
ソースコードのマージ、テストの実行、変更のコミット
ソースコードのマージ、テストの実行、変更のコミット
コミットビルド(ビルド&自動テスト)、自動デプロイ
コミットビルド(ビルド&自動テスト)、自動デプロイ
2次ビルド(結合テスト、性能テスト等)
2次ビルド(結合テスト、性能テスト等)
http://martinfowler.com/]
15
Continuous Integration
ローカルでのソースコードの変更単体テストの追加
ローカルでのソースコードの変更単体テストの追加
ソースコードのマージ、テストの実行、変更のコミット
ソースコードのマージ、テストの実行、変更のコミット
コミットビルド(ビルド&自動テスト)、自動デプロイ
コミットビルド(ビルド&自動テスト)、自動デプロイ
2次ビルド(結合テスト)
2次ビルド(結合テスト)
16
結合テスト結合テスト結合テスト結合テストのののの自動化自動化自動化自動化????
17
結合テスト結合テスト結合テスト結合テストのののの自動化自動化自動化自動化????
18
テストテストテストテストの性質の性質の性質の性質
単体テスト 結合テスト
対象コンポーネント
1 複数
コスト 低 高
対象機能 単純 複雑
可用性可用性
完全性完全性
検索精度検索精度
ドキュメント登録ドキュメント登録
クエリクエリ
サーチでの例)
19
単体テスト 結合テスト
対象コンポーネント
1 複数
コスト 低 高
対象機能 単純 複雑
テストテストテストテストの性質の性質の性質の性質
可用性可用性
完全性完全性
検索精度検索精度
ドキュメント登録ドキュメント登録
クエリクエリ
サーチでの例)
3000件以上の3000件以上の3000件以上の3000件以上のテストケーステストケーステストケーステストケース
3000件以上の3000件以上の3000件以上の3000件以上のテストケーステストケーステストケーステストケース
20
結合テスト結合テスト結合テスト結合テストのののの自動化自動化自動化自動化????
21
テスト実行のコストテスト実行のコストテスト実行のコストテスト実行のコスト
テストケース数テストケース数テストケース数テストケース数
Total cost (man-hour)
Manual
Automation
多
低
高
少
テスト実行のコスト
22
テストケース数テストケース数テストケース数テストケース数
Total cost (man-hour)
Manual
Automation
多
低
高
少
テスト実行のコストテスト実行のコストテスト実行のコストテスト実行のコスト
テスト実行のコスト毎日毎日毎日毎日大規模な大規模な大規模な大規模なテストケーステストケーステストケーステストケースをををを実行可能実行可能実行可能実行可能
毎日毎日毎日毎日大規模な大規模な大規模な大規模なテストケーステストケーステストケーステストケースをををを実行可能実行可能実行可能実行可能
23
結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化
結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化
ユーザーにユーザーにユーザーにユーザーに高付加高付加高付加高付加価値価値価値価値を提を提を提を提供する供する供する供する
“仮説仮説仮説仮説”のののの常時検証常時検証常時検証常時検証
ユーザーにユーザーにユーザーにユーザーに高付加高付加高付加高付加価値価値価値価値を提を提を提を提供する供する供する供する
“仮説仮説仮説仮説”のののの常時検証常時検証常時検証常時検証=
24
結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化
②②②②課題課題課題課題
25
結合テスト結合テスト結合テスト結合テスト自動化に自動化に自動化に自動化に向けての向けての向けての向けての課題課題課題課題
課題① テストの複雑さ
課題② テストの実装コスト
課題③ テストの実行時間
課題④ テスト結果の再現性
26
課題① テストの複雑さ
・テストの基本に則り品質を・テストの基本に則り品質を・テストの基本に則り品質を・テストの基本に則り品質を積み上げる積み上げる積み上げる積み上げる
・複雑な内部状態のテストは・複雑な内部状態のテストは・複雑な内部状態のテストは・複雑な内部状態のテストはUT・・・・CTでででで
・結合テストは原則・結合テストは原則・結合テストは原則・結合テストは原則ブラックボックステストブラックボックステストブラックボックステストブラックボックステスト
・テストの基本に則り品質を・テストの基本に則り品質を・テストの基本に則り品質を・テストの基本に則り品質を積み上げる積み上げる積み上げる積み上げる
・複雑な内部状態のテストは・複雑な内部状態のテストは・複雑な内部状態のテストは・複雑な内部状態のテストはUT・・・・CTでででで
・結合テストは原則・結合テストは原則・結合テストは原則・結合テストは原則ブラックボックステストブラックボックステストブラックボックステストブラックボックステスト
27
課題② テストの実装コスト
・テストフレームワークを開発・テストフレームワークを開発・テストフレームワークを開発・テストフレームワークを開発- シナリオベースでシナリオベースでシナリオベースでシナリオベースで
テストケースを表現テストケースを表現テストケースを表現テストケースを表現- 仕様変更に対しての保守性仕様変更に対しての保守性仕様変更に対しての保守性仕様変更に対しての保守性
・テストフレームワークを開発・テストフレームワークを開発・テストフレームワークを開発・テストフレームワークを開発- シナリオベースでシナリオベースでシナリオベースでシナリオベースで
テストケースを表現テストケースを表現テストケースを表現テストケースを表現- 仕様変更に対しての保守性仕様変更に対しての保守性仕様変更に対しての保守性仕様変更に対しての保守性
28
課題③ テストの実行時間
・・・・コミットビルドでコミットビルドでコミットビルドでコミットビルドで10分の分の分の分のSmoke Test
・結合テストのテストジョブは・結合テストのテストジョブは・結合テストのテストジョブは・結合テストのテストジョブは1時間で分割時間で分割時間で分割時間で分割
・・・・50台のテスト環境でスケール台のテスト環境でスケール台のテスト環境でスケール台のテスト環境でスケール
・・・・コミットビルドでコミットビルドでコミットビルドでコミットビルドで10分の分の分の分のSmoke Test
・結合テストのテストジョブは・結合テストのテストジョブは・結合テストのテストジョブは・結合テストのテストジョブは1時間で分割時間で分割時間で分割時間で分割
・・・・50台のテスト環境でスケール台のテスト環境でスケール台のテスト環境でスケール台のテスト環境でスケール
29
Smoke Test
30
Smoke Test
実行時間とカバレッジのバランス・ 実行時間は10分・ End to End のテスト
ドキュメント登録/削除,
日本語処理、平行性等
31
複数の複数の複数の複数のExecutor
32
複数の複数の複数の複数のExecutor
複数のExecutorを配置し、並列にテストジョブを実行
33
複数の複数の複数の複数のExecutor
複数のExecutorを配置し、並列にテストジョブを実行
1時間を超えるテストジョブは分割
34
重要なテスト重要なテスト重要なテスト重要なテストを優先して実行を優先して実行を優先して実行を優先して実行
Priority Sorter Pluginにて、jobの優先度を指定
35
重要なテスト重要なテスト重要なテスト重要なテストを優先して実行を優先して実行を優先して実行を優先して実行
Priority Sorter Pluginにて、jobの優先度を指定
36
課題④ テスト結果の再現性
・・・・ 原因:原因:原因:原因:- 環境差異環境差異環境差異環境差異- 連続したテスト実行のための連続したテスト実行のための連続したテスト実行のための連続したテスト実行のためのシステムの状態差異システムの状態差異システムの状態差異システムの状態差異
・・・・ 解決方法解決方法解決方法解決方法クリーンアップクリーンアップクリーンアップクリーンアップ + インストールインストールインストールインストール
・・・・ 原因:原因:原因:原因:- 環境差異環境差異環境差異環境差異- 連続したテスト実行のための連続したテスト実行のための連続したテスト実行のための連続したテスト実行のためのシステムの状態差異システムの状態差異システムの状態差異システムの状態差異
・・・・ 解決方法解決方法解決方法解決方法クリーンアップクリーンアップクリーンアップクリーンアップ + インストールインストールインストールインストール
37
結合テスト自動化の課題と解決方法結合テスト自動化の課題と解決方法結合テスト自動化の課題と解決方法結合テスト自動化の課題と解決方法
課題課題課題課題 解決方法解決方法解決方法解決方法結合テストの複雑さ ・品質の積み上げ
・結合テストではブラックボックステスト
テストの実装コストが高い
・シナリオベースで記述可能なフレームワーク
テストの実行時間が長い
・10分のSmoke Test
・1時間毎にジョブを分割・50台の環境でスケール
テスト結果の再現性 ・クリーンアップ + インストール
38
結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化
③③③③開発プロセス開発プロセス開発プロセス開発プロセス
開発プロセス
開発
GIT
merge
UT/CT
Smoke
TestIT1 IT2
Smoke Test
Pass
Pass
バージョン
Pass
Yes
No No
ST
UT&ビルド
Yes
Pass
開発開発開発開発
Yes
No
clone
手動手動手動手動システムテストシステムテストシステムテストシステムテスト
リリース
結合結合結合結合テストテストテストテスト
ビルドビルドビルドビルド
開発プロセス
開発
GIT
merge
UT/CT
Smoke
TestIT1 IT2
Smoke Test
Pass
Pass
バージョン
Pass
Yes
No No
ST
UT&ビルド
Yes
Pass
開発開発開発開発
Yes
No
clone
手動手動手動手動システムテストシステムテストシステムテストシステムテスト
リリース
結合結合結合結合テストテストテストテスト
ビルドビルドビルドビルド
{
“cassandra”:“2.4.0-20130228.125411-258.jar”,
“indexer”:“2.4.0-20130227.134019-53.jar”,
;.
}
41
結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化
④効果④効果④効果④効果
42
CI導入の効果導入の効果導入の効果導入の効果
CI導入前
開発50%
結合33%
QA17%
プロジェクト中のそれぞれのフェーズプロジェクト中のそれぞれのフェーズプロジェクト中のそれぞれのフェーズプロジェクト中のそれぞれのフェーズの期間の割合の期間の割合の期間の割合の期間の割合
結合テスト自動化後
結合
0%
QA
17%
開発
83%
43
Nu
mb
er
of
issu
es
IT2 CT
DevelopmentDevelopment QAQA
発見が期待されるテストタイプごとの積算発見バグ数発見が期待されるテストタイプごとの積算発見バグ数発見が期待されるテストタイプごとの積算発見バグ数発見が期待されるテストタイプごとの積算発見バグ数
44
Nu
mb
er
of
issu
es
IT2 CT
DevelopmentDevelopment QAQA
結合バグを開発初期から発見結合バグを開発初期から発見結合バグを開発初期から発見結合バグを開発初期から発見結合バグを開発初期から発見結合バグを開発初期から発見結合バグを開発初期から発見結合バグを開発初期から発見
発見が期待されるテストタイプごとの積算発見バグ数発見が期待されるテストタイプごとの積算発見バグ数発見が期待されるテストタイプごとの積算発見バグ数発見が期待されるテストタイプごとの積算発見バグ数
45
2013
-02-
10
2013
-02-
24
2013
-03-
10
2013
-03-
24
2013
-04-
07
Num
ber
of
issu
es
IT2 availability
IT2 field type
IT2 synonym
IT2 join
IT2 gateway
IT2 Search-API indexing/search
IT2 smoke
DevelopmentDevelopment QAQA
テストタイプごとの積算発見バグ数テストタイプごとの積算発見バグ数テストタイプごとの積算発見バグ数テストタイプごとの積算発見バグ数
46
2013
-02-
10
2013
-02-
24
2013
-03-
10
2013
-03-
24
2013
-04-
07
Num
ber
of
issu
es
IT2 availability
IT2 field type
IT2 synonym
IT2 join
IT2 gateway
IT2 Search-API indexing/search
IT2 smoke
DevelopmentDevelopment QAQA
テストタイプごとの積算発見バグ数テストタイプごとの積算発見バグ数テストタイプごとの積算発見バグ数テストタイプごとの積算発見バグ数
QA期間はサービス期間はサービス期間はサービス期間はサービスのののの高度な高度な高度な高度な付加価値のテスト付加価値のテスト付加価値のテスト付加価値のテストに集中に集中に集中に集中QA期間はサービス期間はサービス期間はサービス期間はサービスのののの高度な高度な高度な高度な付加価値のテスト付加価値のテスト付加価値のテスト付加価値のテストに集中に集中に集中に集中
47
コミットビルドとしてのコミットビルドとしてのコミットビルドとしてのコミットビルドとしてのSmoke Testの重要性の重要性の重要性の重要性
48
コミットビルドとしてのコミットビルドとしてのコミットビルドとしてのコミットビルドとしてのSmoke Testの重要性の重要性の重要性の重要性
6%のバグがのバグがのバグがのバグがSmoke Testで発見で発見で発見で発見6%のバグがのバグがのバグがのバグがSmoke Testで発見で発見で発見で発見
49
コミットビルドとしてのコミットビルドとしてのコミットビルドとしてのコミットビルドとしてのSmoke Testの重要性の重要性の重要性の重要性
バグ発見数バグ発見数バグ発見数バグ発見数 / テスト実行時間テスト実行時間テスト実行時間テスト実行時間
50
コミットビルドとしてのコミットビルドとしてのコミットビルドとしてのコミットビルドとしてのSmoke Testの重要性の重要性の重要性の重要性
バグ発見数バグ発見数バグ発見数バグ発見数 / テスト実行時間テスト実行時間テスト実行時間テスト実行時間
効果的な効果的な効果的な効果的なSmoke Testをををを実行する事実行する事実行する事実行する事が重要が重要が重要が重要
効果的な効果的な効果的な効果的なSmoke Testをををを実行する事実行する事実行する事実行する事が重要が重要が重要が重要
結合テストの自動化の効果の大きさ結合テストの自動化の効果の大きさ結合テストの自動化の効果の大きさ結合テストの自動化の効果の大きさ
効果効果効果効果 大大大大 効果効果効果効果 小小小小対象プロダクトの
寿命長い 短い
開発中のコンポーネント数
多い 少ない
要求・仕様・設計の変更頻度
多い 少ない
52
結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化
⑤まとめ⑤まとめ⑤まとめ⑤まとめ
53
まとめまとめまとめまとめ
結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化結合テストの自動化
・・・・ 結合の検証までを自動化結合の検証までを自動化結合の検証までを自動化結合の検証までを自動化→仮説仮説仮説仮説の検証を効率化の検証を効率化の検証を効率化の検証を効率化
・・・・ 結合バグを早期に発見結合バグを早期に発見結合バグを早期に発見結合バグを早期に発見→ユーザーに付加価値ユーザーに付加価値ユーザーに付加価値ユーザーに付加価値をををを
提供する機能提供する機能提供する機能提供する機能の検証の検証の検証の検証
・・・・ 結合の検証までを自動化結合の検証までを自動化結合の検証までを自動化結合の検証までを自動化→仮説仮説仮説仮説の検証を効率化の検証を効率化の検証を効率化の検証を効率化
・・・・ 結合バグを早期に発見結合バグを早期に発見結合バグを早期に発見結合バグを早期に発見→ユーザーに付加価値ユーザーに付加価値ユーザーに付加価値ユーザーに付加価値をををを
提供する機能提供する機能提供する機能提供する機能の検証の検証の検証の検証=
54
Automation
you