狠狠撸

狠狠撸Share a Scribd company logo
システムテストの自動化による
大規模分散検索プラットフォームの	
開発工程改善	
Mar/07/2014
荻野 恒太郎, パランデ アビジート, 松本 幹, 鵜飼 大志
Search Platform Group, Search Section, Big Data Department, Rakuten Inc.
http://www.rakuten.co.jp/
2
本日お持ち帰りして頂きたい事
3
本日お持ち帰りして頂きたい事
本発表の趣旨
自動化とCIやTDDを組み合わせ
“継続的システムテスト”を実現し
開発のアジリティを改善した
? 誰がためのシステムテスト自動化?
? アジャイルな世界でのテスターの役割は?
4
バックグラウンド	
? ウェブサービス開発の特徴
? システムテスト自動化の目的
5
ウェブサービス
6
ウェブサービス開発の特徴
要求スコープ
時
間
軸
? 永続的開発
フェーズ
日々サービスを成長
させるため
- 市場要求の変化
- 技術トレンドの変化	
“Development and Deploy in Facebook”, Facebook, 2013,
継続的なサービス改善
 → 絶え間ないリリース
7
バックグラウンド	
? ウェブサービス開発の特徴
? システムテスト自動化の目的
8
クオリティ vs アジリティ
アジリティ
高
低
遅い 速い
サービス
クオリティ
機能開発のリードタイム
バグ修正日数 など
9
クオリティ vs アジリティ
アジリティ
高
低
遅い 速い
サービス
クオリティ
開発
- 機能追加
- 機能改善
- パフォーマンス改善
機能開発のリードタイム
バグ修正日数 など
10
クオリティ vs アジリティ
アジリティ
高
低
遅い 速い
サービス
クオリティ
開発
- 機能追加
- 機能改善
- パフォーマンス改善
開発
開発
開発
継続的な
サービス改善
→ 小さく産んで
大きく育てる
機能開発のリードタイム
バグ修正日数 など
11
クオリティ vs アジリティ
アジリティ
高
低
遅い 速い
サービス
クオリティ
開発
開発
開発
開発
品質の門番としての
システムテスト
- 新機能の振る舞い
- デグレード ?
機能開発のリードタイム
バグ修正日数 など
12
品質の門番:システムテスト
機能テスト
- 検索機能など
- 検索ランキング	
探索的テスト (ET)
受け入れテスト (UAT)
単体テスト (UT)
コンポーネントテスト (CT)
パフォーマンス
/負荷テスト
「?性」テスト
- 運用性
- 可用性
ビジネス面
支
援
製
品
批
評
ISBN:9784798119977“ 実践アジャイルテスト” p.96
技術面
*以前結合テスト
と呼んでいた
? アジャイルテスト4象限
13
品質の門番:システムテスト
機能テスト
- 検索機能など
- 検索ランキング	
探索的テスト (ET)
受け入れテスト (UAT)
単体テスト (UT)
コンポーネントテスト (CT)
パフォーマンス
/負荷テスト
「?性」テスト
- 運用性
- 可用性
ビジネス面
支
援
製
品
批
評
ISBN:9784798119977“ 実践アジャイルテスト” p.96
技術面
*以前結合テスト
と呼んでいた
? アジャイルテスト4象限
システムテスト(ST) その他
14
クオリティ vs アジリティ
アジリティ
高
低
遅い 速い
サービス
クオリティ
開発
開発
開発
開発
機能開発のリードタイム
バグ修正日数 など
15
クオリティ vs アジリティ
アジリティ
高
低
遅い 速い
サービス
クオリティ
機能開発のリードタイム
バグ修正日数 など
16
クオリティ vs アジリティ
アジリティ
高
低
遅い 速い
サービス
クオリティ
? 技術的負債
? システムテストの
 肥大化
開発	
50%	
 ST	
33%	
QA	
17%	
機能開発のリードタイム
バグ修正日数 など
17
システムテストの問題:バグ修正日数
0
2
4
6
8
10
UT/CT ST
バグ修正日数
Q3	
Q1	
中央値	
Q3	
Q1	
中央値	
システムテストで
見つかったバグは
修正コストが高い
ST
18
クオリティ vs アジリティ
アジリティ
高
低
遅い 速い
サービス
クオリティ
機能開発のリードタイム
バグ修正日数 など
19
クオリティ vs アジリティ
アジリティ
高
低
遅い 速い
サービス
クオリティ
サービス
機能開発のリードタイム
バグ修正日数 など
20
システムテスト自動化の目的
アジリティ
高
低
遅い 速い
サービス
クオリティ
サービス目的:
アジリティ改善のため
システムテストを自動化
機能開発のリードタイム
バグ修正日数 など
21
継続的
システムテスト	
? コンセプト
? 課題と解決方法
22
アジャイルなテストのアプローチにおけるシステムテスト
23
アジャイルなテストのアプローチにおけるシステムテスト
継続的インテグレーション
24
アジャイルなテストのアプローチにおけるシステムテスト
品質の門番
検索ランキングのデグレ
運用性、可用性のデグレ
25
システムレベルの検証が必要な項目①: 検索ランキング
26
システムレベルの検証が必要な項目①: 検索ランキング
検索キーワード
検索キーワードへの関連順で並べる
27
検索ランキングに関連するコンポーネント
Storage
component
Indexing
component
Search
component
Search
API
Storage
API
ドキュメント
検索結果
クエリ
GSP
Admin
28
検索ランキングに関連するコンポーネント
Storage
component
Indexing
component
Search
component
Search
API
Storage
API
ドキュメント
検索結果
クエリ
GSP
Admin
同義語辞書
スキーマ
データ処理
Disjunction Max
形態素解析
29
システムレベルの検証が必要な項目②: 可用性?運用性
バランサ
ノード
検索クラスター 検索クラスター
... ノード ノード …ノード
30
システムレベルの検証が必要な項目②: 可用性?運用性
バランサ
ノード
検索クラスター 検索クラスター
... ノード ノード …ノード
31
システムレベルの検証が必要な項目②: 可用性?運用性
バランサ
ノード
検索クラスター 検索クラスター
... ノード ノード …ノード
Fail overするか?
復旧出来るか?
32
運用性?可用性に関連するコンポーネント
Storage
component
Indexing
component
Search
component
Search
API
Storage
API
ドキュメント
検索結果
クエリ
GSP
Admin
インデックス再構築
システム状態監視
ヘルスチェック
自動閉塞
ヘルスチェック
33
“継続的システムテスト”
? コンセプト
検索ランキングや、運用性、可用性などの
システムレベルの検証も継続的に実行
34
“継続的システムテスト”
? コンセプト
検索ランキングや、運用性、可用性などの
システムレベルの検証も継続的に実行
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
システムテスト
自動化前
35
“継続的システムテスト”
? コンセプト
検索ランキングや、運用性、可用性などの
システムレベルの検証も継続的に実行
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
システムテスト
自動化前
36
“継続的システムテスト”
? コンセプト
検索ランキングや、運用性、可用性などの
システムレベルの検証も継続的に実行
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
システムテストで検証している
項目は顧客にとっての価値が高い
システムテスト
自動化前
37
“継続的システムテスト”
? コンセプト
検索ランキングや、運用性、可用性などの
システムレベルの検証も継続的に実行
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
システムテストで検証している
項目は顧客にとっての価値が高い
リリース直前にバグが見つかり
継続的な改善が困難
システムテスト
自動化前
38
“継続的システムテスト”
? コンセプト
検索ランキングや、運用性、可用性などの
システムレベルの検証も継続的に実行
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
システムテスト
自動化前
39
“継続的システムテスト”
? コンセプト
検索ランキングや、運用性、可用性などの
システムレベルの検証も継続的に実行
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
分析
設計
実装
UT
要求スコープ
ST
時
間
軸
システムテスト
自動化前
システムテスト
自動化後
40
“継続的システムテスト”
? コンセプト
検索ランキングや、運用性、可用性などの
システムレベルの検証も継続的に実行
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
分析
設計
実装
UT
要求スコープ
ST
時
間
軸
システムテスト
自動化前
システムテスト
自動化後
41
“継続的システムテスト”
? コンセプト
検索ランキングや、運用性、可用性などの
システムレベルの検証も継続的に実行
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
システムテスト
自動化前
分析
設計
実装
UT
要求スコープ
ST
時
間
軸
システムテスト
自動化後
顧客にとって価値の高い領域での
開発者や分析者の継続的な改善をサポート
42
継続的
システムテスト	
? コンセプト
? 課題と解決方法
43
継続的インテグレーション
コンポーネント
ソースコード
レポジトリ
ビルド	
ビルド
サーバー
UT	
システムテスト	
…
…
コンポーネント
…
…
…
… STG
44
継続的インテグレーションから継続的システムテストへ
コンポーネント
ソースコード
レポジトリ
ビルド	
ビルド
サーバー
UT	
システムテスト	
…
…
コンポーネント
…
…
…
…
自動化!!
STG
45
継続的システムテスト概要図
コンポーネント
ソースコード
レポジトリ
ビルド	
ビルド
サーバー
UT	
自動化された
システムテスト	
…
…
コンポーネント
…
…
…
… STG
毎日、継続的に実行
46
継続的システムテスト:課題
コンポーネント
ソースコード
レポジトリ
ビルド	
ビルド
サーバー
UT	
自動化された
システムテスト	
…
…
コンポーネント
…
…
…
… STG
47
継続的システムテスト:課題
コンポーネント
ソースコード
レポジトリ
ビルド	
ビルド
サーバー
UT	
自動化された
システムテスト	
…
…
コンポーネント
…
…
…
… STG
① 複数のチームや
コンポーネントの
スムーズな結合
48
継続的システムテスト:課題
コンポーネント
ソースコード
レポジトリ
ビルド	
ビルド
サーバー
UT	
自動化された
システムテスト	
…
…
コンポーネント
…
…
…
…
② システムテストの
自動化は高コスト?
STG
① 複数のチームや
コンポーネントの
スムーズな結合
49
継続的システムテスト:課題
コンポーネント
ソースコード
レポジトリ
ビルド	
ビルド
サーバー
UT	
自動化された
システムテスト	
…
…
コンポーネント
…
…
…
…
① 複数のチームや
コンポーネントの
スムーズな結合
③ テストと開発の
サイクルを作るには?
STG
② システムテストの
自動化は高コスト?
50
自動化された継続的システムテストの課題①:
スムーズな結合
インデクサー	
 サーチストレージ	
アドミン	
問題点:
- チームの属人的な設計
→ テスト自動化可能性に問題
- 低レイヤのコンポーネントのバグ
→ 他のコンポーネントの結合やテストに支障	
… … … …
51
課題①への取り組み: Software Engineer in Test (SET)	
役割:自動化の専門部隊
テスト自動化方針に則った自動化
http://googletesting.blogspot.jp/2010/03/google-is-hiring-sets.html
52
課題①への取り組み: Software Engineer in Test (SET)	
コンポーネント	
 開発者	
Software
Engineer in Test	
Search	
Indexer	
Storage	
Admin	
開
発
機能の開発工程 テスト自動化方針
分析
設計
実装
テスト
役割:自動化の専門部隊
テスト自動化方針に則った自動化
分析
設計
実装
テスト
…
…
…
…
http://googletesting.blogspot.jp/2010/03/google-is-hiring-sets.html
53
課題①への取り組み: Software Engineer in Test (SET)	
コンポーネント	
 開発者	
Software
Engineer in Test	
Search	
Indexer	
Storage	
Admin	
開
発
機能の開発工程 テスト自動化方針
分析
設計
実装
テスト
役割:自動化の専門部隊
テスト自動化方針に則った自動化
分析
設計
実装
テスト
自動化の観点から
分析や設計に
積極的に関わる
…
…
…
…
http://googletesting.blogspot.jp/2010/03/google-is-hiring-sets.html
54
課題①への取り組み: :スモークテスト	
? 最低限の結合を保証するスモークテストを自動化
55
課題①への取り組み: :スモークテスト	
? 最低限の結合を保証するスモークテストを自動化
Smoke
Test
機能テスト	
非機能テスト
Pass	
Version	
Pass	
Yes	
No	
大規模
データ
UT&Build	
Yes	
	
	
Jenkins	
STG	
手動システムテスト
No	
A A
56
課題①への取り組み: :スモークテスト	
? 最低限の結合を保証するスモークテストを自動化
Smoke
Test
機能テスト	
非機能テスト
Pass	
Version	
Pass	
Yes	
No	
大規模
データ
UT&Build	
Yes	
	
	
Jenkins	
STG	
手動システムテスト
No	
A A
? スモークテストを
パスしたバージョン
を記録
? 上記のバージョンを
システムテストで
  対象とする
57
自動化された継続的システムテストの課題②:
テストにまつわるコスト	
テストケース
手動 自動
フレームワーク
手動 自動
58
自動化された継続的システムテストの課題②:
テストにまつわるコスト	
テストケース
手動 自動
フレームワーク
手動 自動
学習
開発
59
自動化された継続的システムテストの課題②:
テストにまつわるコスト	
テストケース
手動 自動
フレームワーク
手動 自動
学習
開発
フレームワークの
学習や開発は
必要な投資
60
自動化された継続的システムテストの課題②:
テストにまつわるコスト	
テストケース
手動 自動
フレームワーク
手動 自動
学習
開発
テスト実行
フレームワークの
学習や開発は
必要な投資
61
自動化された継続的システムテストの課題②:
テストにまつわるコスト	
テストケース
手動 自動
フレームワーク
手動 自動
学習
開発
テスト実行
フレームワークの
学習や開発は
必要な投資
実行コストは自動化で0に
62
自動化された継続的システムテストの課題②:
テストにまつわるコスト	
テストケース
手動 自動
フレームワーク
手動 自動
学習
開発
テスト実行
テスト実装
フレームワークの
学習や開発は
必要な投資
実行コストは自動化で0に
63
自動化された継続的システムテストの課題②:
テストにまつわるコスト	
テストケース
手動 自動
フレームワーク
手動 自動
学習
開発
テスト実行
テスト実装
フレームワークの
学習や開発は
必要な投資
実行コストは自動化で0に
原因調査
原因調査
テスト保守
テスト保守
64
自動化された継続的システムテストの課題②:
テストにまつわるコスト	
テストケース
手動 自動
フレームワーク
手動 自動
学習
開発
テスト実行
テスト実装
フレームワークの
学習や開発は
必要な投資
実行コストは自動化で0に
原因調査
原因調査
テスト保守
テスト保守
テスト実装や、原因調査、保守の
コストを抑えるための工夫が重要
65
課題②への取り組み:
ドメイン固有テスト言語	
検索結果のテストケースを表現する
ドメイン固有テスト言語(DSTL)を定義
 → 実装?保守コストを低減
66
テストツール: Ngauto
ドメイン固有テスト
言語で記述された
シナリオ
? アクション1
  デプロイ
? アクション2
  データ投入
? アクション3
  検索クエリ
テストツールの中で
アクションに対する実際の
振る舞いを定義
“検索クエリ” アクションの例)
---
Report report
   = issueSapiQuery(testId,query);
…
int expectedHttpStatus
= getExpectedHttpstatus(testId);
int actualHttpstatus
= report.getActualHttpStatus()
TestCase.assertEquals(
message,
expectedHttpStatus,
actualHttpstatus );
…
Ngauto
(内製の
テストツール)
67
課題②への取り組み:
トレーサビリティ	
JUnitベースのテストツール
- JenkinsやIDEの画面からバグの追跡が可能
→ 原因調査コストの低減	
テストケースが失敗した場合の画面
68
APP
APP
自動化された継続的システムテストの課題③:
テストと開発のサイクル	
APP
検証環境
開発マシン
テスト
開発
69
APP
APP
自動化された継続的システムテストの課題③:
テストと開発のサイクル	
APP
検証環境
開発マシン
テスト
開発
環境差異による
テスト結果の再現性の問題
によって壊れる!!
70
APP
APP
課題③への取り組み:シナリオ実行の透過性	
テストツール
テストシナリオ
APP
検証環境
開発マシン
実行
71
APP
APP
課題③への取り組み:シナリオ実行の透過性	
テストツール
テストシナリオ
APP
検証環境
開発マシン
実行
開発マシンの
テスト環境を
仮想化により統一
72
APP
APP
課題③への取り組み:シナリオ実行の透過性	
テストツール
テストシナリオ
APP
検証環境
開発マシン
実行
開発マシンの
テスト環境を
仮想化により統一
プロファイル
ローカルマシン
プロファイル
STG
構成情報
構成情報
環境の構成情報を
テストシナリオから分離
環境の構成情報を
テストシナリオから分離
→ シナリオ実行の
透過性を担保
73
開発
サイクル
Implement	
GIT	
merge	
UT	
Smoke
Test
機能テスト	
非機能テスト
Smoke
Test	
Pass	
Pass	
Version	
Pass	
Yes	
No	
 No	
大規模
データ
UT&Build	
実装	
Yes	
	
	
システムテスト自動化後の開発サイクル	
LOCAL	
 Jenkins	
STG	
手動システムテスト
機能テスト	
 非機能テスト
No	
Yes	
A A A
A
Implement	
GIT	
merge	
UT	
Smoke
Test
機能テスト	
非機能テスト
Smoke
Test	
Pass	
Pass	
Version	
Pass	
Yes	
No	
 No	
大規模
データ
UT&Build	
実装	
Yes	
	
	
システムテスト自動化後の開発サイクル	
LOCAL	
 Jenkins	
STG	
手動システムテスト
機能テスト	
 非機能テスト
自動化されたすべてのテストを毎日、継続的に実行
→ リードタイム、バグ修正日数が最短1日に
No	
Yes	
A A A
A
76
評価
77
システムテスト自動化の効果の評価方法	
?自動化前後のバグ修正日数の比較
?継続的システムテスト適用後の累積バグ数
参考情報:自動化前後のテストの比較
継続的システムテスト 前 後
自動化テストの
カバレッジ
機能テスト
の一部
(604件)
機能テスト
非機能テスト
大規模テスト
(2887件)
SET ?
スモークテスト ? ?
ドメイン固有テスト言語 ?
バグのトレーサビリティ △
テストシナリオの透過性 △
?:最初から
△:途中から
78
0
2
4
6
8
10
UT/CT ST
0
2
4
6
8
10
UT/CT ST
評価結果:バグ修正日数の比較	
前
Q3	
Q1	
中央値	
Q3	
Q1	
中央値	
 Q3	
Q1	
中央値	
Q3	
Q1	
中央値	
最大値 59 最大値 64 最大値 75 最大値 87
ST
後
(10572*) (11453*)
*テストメソッド数
(日数) (日数)
79
0
2
4
6
8
10
UT/CT ST
0
2
4
6
8
10
UT/CT ST
評価結果:バグ修正日数の比較	
前
Q3	
Q1	
中央値	
Q3	
Q1	
中央値	
 Q3	
Q1	
中央値	
Q3	
Q1	
中央値	
システムテストで発見された
バグの修正日数が大幅に改善
最大値 59 最大値 64 最大値 75 最大値 87
ST
後
(10572*) (11453*)
*テストメソッド数
(日数) (日数)
80
自動化された継続的システムテスト適用後の累積バグ数	
0
20
40
60
80
100
非機能テスト
機能テスト
スモーク
3月 5月 7月 9月
開発
テスト
自動化
81
自動化された継続的システムテスト適用後の累積バグ数	
0
20
40
60
80
100
非機能テスト
機能テスト
スモーク
3月 5月 7月 9月
開発
テスト
自動化
82
自動化された継続的システムテスト適用後の累積バグ数	
0
20
40
60
80
100
非機能テスト
機能テスト
スモーク
3月 5月 7月 9月
機能テスト
自動化完了
大きな
機能要件
受け入れ
テスト開発
テスト
自動化
83
自動化された継続的システムテスト適用後の累積バグ数	
0
20
40
60
80
100
非機能テスト
機能テスト
スモーク
3月 5月 7月 9月
機能テスト
自動化完了
大きな
機能要件
受け入れ
テスト開発
テスト
自動化
84
自動化された継続的システムテスト適用後の累積バグ数	
0
20
40
60
80
100
非機能テスト
機能テスト
スモーク
3月 5月 7月 9月
機能テスト
自動化完了
シナリオの
透過性
大きな
機能要件
断続的な
小さな要件
受け入れ
テスト開発
テスト
自動化
85
自動化された継続的システムテスト適用後の累積バグ数	
0
20
40
60
80
100
非機能テスト
機能テスト
スモーク
3月 5月 7月 9月
機能テスト
自動化完了
シナリオの
透過性
大きな
機能要件
断続的な
小さな要件
受け入れ
テスト開発
テスト
自動化
86
自動化された継続的システムテスト適用後の累積バグ数	
0
20
40
60
80
100
非機能テスト
機能テスト
スモーク
3月 5月 7月 9月
機能テスト
自動化完了
シナリオの
透過性
大規模テスト
自動化完了
バグの
トレーサビリティ
大きな
機能要件
システム
リファクタリング
断続的な
小さな要件
受け入れ
テスト
受け入れ
テスト開発
テスト
自動化
87
自動化された継続的システムテスト適用後の累積バグ数	
0
20
40
60
80
100
非機能テスト
機能テスト
スモーク
3月 5月 7月 9月
機能テスト
自動化完了
シナリオの
透過性
大規模テスト
自動化完了
バグの
トレーサビリティ
大きな
機能要件
システム
リファクタリング
断続的な
小さな要件
受け入れ
テスト
受け入れ
テスト開発
テスト
自動化
88
継続的システムテストについてまとめ
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
自動化前
分析
設計
実装
UT
要求スコープ
自動化後
ST
時
間
軸
89
継続的システムテストについてまとめ
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
自動化前
分析
設計
実装
UT
要求スコープ
自動化後
ST
時
間
軸
自動化前:
リリース直前にバグが見つかり
てんやわんやしていた
90
継続的システムテストについてまとめ
分析
設計
実装
UT
ST
要求スコープ
時
間
軸
自動化前
分析
設計
実装
UT
要求スコープ
自動化後
ST
時
間
軸
自動化前:
リリース直前にバグが見つかり
てんやわんやしていた
自動化後:
開発者や分析者が積極的かつ安全な改善を
継続的に行う事が可能に!
91
まとめと
今後の課題
92
まとめ:継続的システムテストの意味
クオリティ
バグ修正日数の逆数
( アジリティ )
高
低
遅い 速い
自動化前
自動化前
93
まとめ:継続的システムテストの意味
クオリティ
バグ修正日数の逆数
( アジリティ )
高
低
遅い 速い
自動化前
自動化後自動化前
94
まとめ:継続的システムテストの意味
クオリティ
バグ修正日数の逆数
( アジリティ )
高
低
遅い 速い
自動化前
1/5 1/2
自動化後自動化前
95
まとめ:継続的システムテストの意味
クオリティ
バグ修正日数の逆数
( アジリティ )
高
低
遅い 速い
自動化前
1/5 1/2
自動化後自動化前
まとめ
? システムテスト自動化とCIやTDDの
アイデアを組み合わせる事で
継続的システムテストを実現
? バグ修正日数を改善
96
まとめ:継続的システムテストの意味
クオリティ
バグ修正日数の逆数
( アジリティ )
高
低
遅い 速い
自動化前
1/5 1/2
自動化後自動化前
97
まとめ:継続的システムテストの意味
クオリティ
バグ修正日数の逆数
( アジリティ )
高
低
遅い 速い
自動化前
1/5 1/2
自動化後自動化前
98
まとめ:継続的システムテストの意味
クオリティ
バグ修正日数の逆数
( アジリティ )
高
低
遅い 速い
自動化前
1/5 1/2
自動化後自動化前
今後の課題
? システムのリファクタリングによる
パフォーマンスの向上
? 検索ランキングの改善
→ どういった“クオリティ”に有効か?
99
謝辞
エバンジェリストの方たち、
社内勉強会の方たち、
ありがとうございました!!!
100
Good to see
system test
getting some

More Related Content

【JaSST'14 Tokyo】システムテストの自動化による 大規模分散検索プラットフォームの 開発工程改善 #JaSST