Flakyとその判別方法の解説 #D3QA /FlakyTests
by
nihonbuson
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
GoogleのJohn Micco氏による Flakyなテストと その判別方法の解説 @nihonbuson
Slide 2
Slide 2 text
はじめに ● 今回の発表は、John Micco氏の発表を イベント参加者が勝手にまとめたものです。 – 一応、John Micco氏から許可は貰っています。 ● John Micco氏の基調講演資料はこちら – http://jasst.jp/symposium/jasst18tokyo/pdf/A1.pdf ● JaSST'18 Tokyoの開催レポート(公式)はこちら – http://jasst.jp/symposium/jasst18tokyo/report.html
Slide 3
Slide 3 text
はじめに ● 私はJohn Micco氏の発表を日本で3回聴講 – ICST2017 (ソフトウェアテストの国際カンファレンス) – JaSST'18 Tokyo(テストシンポジウム) 基調講演 – JaSST'18 Tokyo チュートリアル ● これらの内容から、今回は以下の2つに絞って紹介 – Googleの自動テストについて – Flakyについて ● イベント記事はこちら(今回の発表内容も含む) – http://nihonbuson.hatenadiary.jp/entry/2018/03/10/110000 この記事が長いので スライドを作成することに…
Slide 4
Slide 4 text
本スライドの狙い ● John Micco氏の発表内容を元に、 Googleの取り組みを知ろう。 ● Googleといえど、特殊なことをしているわけではない ということを知ろう。 ● 「JaSSTで有益な発表があったんだ」と知ってもらい、 次回以降のJaSSTに参加したいと感じてもらおう。
Slide 5
Slide 5 text
Agenda ● はじめに ● Googleの自動テストの内容 ● Googleの自動テストリソースを減らす取り組み ● Flaky Testsとは何か ● チュートリアルから見るFlakyの世界 ● おわりに
Slide 6
Slide 6 text
Googleの 自動テストの内容 基調講演資料ページ数 基調講演資料ページ数
Slide 7
Slide 7 text
Googleの自動テスト ● 自動テストは2種類ある – Presubmit Testing と Postsubmit Testing ● 継続的に420万件のテストケースが実行されている。 ● 1日に1億5千万のテストケースが動いている。 ● 全ての結果はDBに保存している。 ● ほぼすべてのテストが自動化されている – 手動なのは、UXと多言語対応のみ P2 P2
Slide 8
Slide 8 text
Regression Test Selection(RTS) ● 依存関係から対象となるテストケースを見つける。 ● 下記のfoo.hの場合はfoo_testとbar_testが対象。 http://jasst.jp/symposium/jasst18tokyo/pdf/A1.pdf#page=5 P5 P5
Slide 9
Slide 9 text
Presubmit Testing ● RTSを用いて、依存関係からテストする ● コミットごとに分離してテストする ● テストがPass→提出OK ● コードレビュー画面にもテスト結果情報が掲載される ● だいたい2秒に1回はテスト実行 P6 P6
Slide 10
Slide 10 text
Postsubmit testing ● 「420万件のテストケースが実行」はコッチの話。 ● ある程度の塊(約45分)で1回の実行を行う。 http://jasst.jp/symposium/jasst18tokyo/pdf/A1.pdf#page=8 1回のテスト実行 1回の変更 P8 P8
Slide 11
Slide 11 text
Postsubmit testing ● テストが失敗したら、そのテストケースが実行される 原因となったプロダクトコードの変更を探す ● すべてのテスト結果をDBに保存する(2年間) P12 P12 http://jasst.jp/symposium/jasst18tokyo/pdf/A1.pdf#page=12
Slide 12
Slide 12 text
理想的な自動テスト ● その1…テストが失敗した瞬間に原因のコードが分かる – テストとプロダクトコードが1:1なUnitテストはまさにこれ – 影響が大きなプロダクトコードが存在(ライブラリとか) ● その2…コミットが入るたびに、全テストが流れる – リソースの問題で実現できない ● その3…コミットが入るたびに、影響がある 失敗するテストだけが流れる – 「影響がありそう」「失敗する可能性が高い」テストなら 見つけられるかも
Slide 13
Slide 13 text
影響があるテスト 38 90 2604 http://jasst.jp/symposium/jasst18tokyo/pdf/A1.pdf#page=14 P14 P14
Slide 14
Slide 14 text
影響があるテスト ● 420万件のテストケースのうち… – コード全体の半分の箇所のいずれかを変更した場合、 38のテストケースは失敗する可能性がある。 ● 38のテストケースは影響範囲が大きいテスト – コード全体の90%の箇所のいずれかを変更した場合、 2604のテストケースを実行する必要がある。 ● 420万件の残りのテストケースは局所的な部分のテストである。 P14 P14
Slide 15
Slide 15 text
失敗するテスト ● 実行したテストの99.8%はテストが成功する。 – 残り0.2%のテストのみを実行したい! – プロジェクトに関係ない失敗は無視したい! P15 P15 http://jasst.jp/symposium/jasst18tokyo/pdf/A1.pdf#page=15
Slide 16
Slide 16 text
Googleの 自動テストリソースを 減らす取り組み 基調講演資料ページ数 基調講演資料ページ数
Slide 17
Slide 17 text
取り組み1. Greenish Service ● 各サービス毎にテストを紐づけている ● 決定論的ではなく確率論を用いて、 リスクを持って各サービス毎にリリースしている http://jasst.jp/symposium/jasst18tokyo/pdf/A1.pdf#page=19 P19 P19
Slide 18
Slide 18 text
取り組み2. Skip Tests ● 必要ないテストをスキップして、 テスト結果が変わる可能性が高いテストのみ実施 ● 失敗し続けているテストよりも、「成功→失敗」や 「失敗→成功」の、結果遷移したテストが気になる。 スキップ 成功 失敗 Flaky ※後述で 説明 http://jasst.jp/symposium/jasst18tokyo/pdf/A1.pdf#page=21 P21 P21
Slide 19
Slide 19 text
取り組み2. Skip Tests 1. 全体の96%はテスト結果の遷移が発生しなかった。 2. アルゴリズムがうまくいくと、全体の98%のテストをSkip しても、結果遷移が発生するテストをすべて拾えた。 1 2 http://jasst.jp/symposium/jasst18tokyo/pdf/A1.pdf#page=33 P33 P33
Slide 20
Slide 20 text
Googleでのテスト結果分析 ● 成功→失敗の遷移の84%はFlakyテストが原因だった – これが厄介 ● 全体のテストの1.23%で不具合を発見した。 ● 以下の場合に破損する可能性が高くなる – ファイルが頻繁に変更される – 3人以上の開発者がファイル変更に関わっている ● ペアプロ、モブプロの人数ではなく、別案件での人数 – 特定の人、自動テストが関わっている – 特定の言語が関わっている P34 P34
Slide 21
Slide 21 text
Flaky Testsとは何か 基調講演資料ページ数 基調講演資料ページ数
Slide 22
Slide 22 text
Flaky Tests ● あてにならないテストのこと ● 同じコードで成功と失敗の両方が観測できるテスト ● 420万件のうち16%のテストケースはFlakyである ● Flakyテストを再実行するのに、 リソースの2~16%を費やす ● Googleでは、Flaky Testsを全力で解決したい! – Flaky Testsを無視したいわけではない P35 P35
Slide 23
Slide 23 text
Flaky Testsの定義 ● 以下の2パターンが存在する – 1. テストが失敗したが、そのまま(コード変更せずに) リトライしたら成功した ● 例えば、タイムアウトが5秒で、約4.9秒かかるページ遷移など – 2. テストが成功(失敗)したが、次のタイミングで もう一度テストを実行したら失敗(成功)した。 ● おそらく、John Micco氏は、このどちらも Flaky Testsと表現しているようだ。 ● どちらにせよ、このFlaky Testsを見極めることが大切
Slide 24
Slide 24 text
チュートリアルから見る Flakyの世界 チュートリアル資料ページ数 チュートリアル資料ページ数
Slide 25
Slide 25 text
チュートリアルの概要 ● GoogleのテストケースをBigQueryを用いて実行。 ● チュートリアルで使用したSQLなどは 以下のサイトにあります。 – https://github.com/jmicco/JaSST_tutorial ● チュートリアル資料は未公開 ● 資料には の文字が! – 私「Micco, これって公開しちゃまずいもの?」 – Micco「すまん、テンプレのままだったわ。公開OKさ!」 P2 P2
Slide 26
Slide 26 text
対象データ ● 対象データは以下の通り – シンプルなデータ ● 1万件のテストケース ● 340万件のテスト結果 – Fullデータ ● 143万件のテストケース ● 5億件のテスト結果 P2,3 P2,3 testcase_id pullrequest_id 読み替えるなら、
Slide 27
Slide 27 text
テスト結果の分類 ● テスト結果を以下のように分類している。 – PASSED…テスト成功 – FAILED_TO_BUILD…ビルド失敗 – FAILED…テスト失敗 – INTERNAL_ERROR…テスト開始準備が失敗 – PENDING…実行開始しようとしたができなかった – ABORTED_BY_TOOL…開始後15分超過で強制終了 – FLAKY…テスト失敗後、リトライしたら成功 ● 失敗の責任者を明確にしている。 インフラの 責任 開発の 責任 P6 P6
Slide 28
Slide 28 text
Flakyを見極める ● 自動テスト失敗時に、 そのテストケースがFlakyである確率が高いかどうかの 情報も一緒に提供している ● Flakyかどうかの情報は以下の2つのアプローチがある – 1. Flakyなテスト候補を特定する – 2. Flakyでないテストを特定する ● これらは単純なSQLで示すことができる – 次のページ以降で紹介
Slide 29
Slide 29 text
1. Flakyなテスト候補を特定する ● テスト結果の遷移に注目する。 ● より多くの遷移があるテストはFlakyの疑いあり。 Flakyっぽい→ P7,8 P7,8
Slide 30
Slide 30 text
1. Flakyなテスト候補を特定する (特定方法) ● テストケース毎の遷移数を抽出するSQL – https://github.com/jmicco/JaSST_tutorial/blob/master/count_transitions.sql P9 P9 結果例
Slide 31
Slide 31 text
1. Flakyなテスト候補を特定する (結果) P10,11 P10,11 ● 884回/月も結果の遷移が発生するケースが存在 ● 4回/月以上の遷移は、340万件中7590ケース – 3回/月以下は Flakyではない(?) ● テスト結果を保存すれば 簡単にFlaky候補を 特定できる例
Slide 32
Slide 32 text
2. Flakyではないテストを特定する ● Flakyなテストケースは結果にランダム性あり ● Flakyではないテストケースはパターンが存在 ● t4,t6やt2,t3,t5,t7は同パターンなのでFlakyではない P12,13 P12,13
Slide 33
Slide 33 text
2. Flakyではないテストを特定する (特定方法) ● 手順1. テストケースごとに遷移が起こった チェンジリストIDを抽出するSQL – https://github.com/jmicco/JaSST_tutorial/blob/master/target_transitions.sql 結果例 P16 P16
Slide 34
Slide 34 text
2. Flakyではないテストを特定する (特定方法) ● 手順2. 手順1の結果を元に、同じ遷移のパターンに なっているテストケースを抽出するSQL – https://github.com/jmicco/JaSST_tutorial/blob/master/shared_history.sql 結果例 ● 下記のような結果を基に グラフを作成(次ページ) P18 P18
Slide 35
Slide 35 text
2. Flakyではないテストを特定する (結果) ● 横軸…同じパターンのテストケース数 ● 縦軸…1ヶ月で遷移が発生した回数 ● 赤…Flaky 5000ケース 以上が 同じパターン →ライブラリの 修正が影響? 2ケースで 20以上の遷移が まったく同じ パターン →Flakyでない 縦軸に接して いるデータは 同じパターンが 存在せず P15 P15
Slide 36
Slide 36 text
おわりに
Slide 37
Slide 37 text
おわりに ● Googleは、シンプルな内容を愚直に実施 – 特殊なことはしていない ● ここまで分析できる前提として、 自動テストによる大量なテストと そのテスト結果をDBに保存、の2つの取り組みが存在 – 地道なテスト文化を作り上げたからこそ ● そのデータを分析することで、Flakyの判別にも活用 ● Flakyの判別などを基に、 さらにリソースを省略したテスト実施を考えている。
Slide 38
Slide 38 text
参考文献 ● JaSST'18 Tokyo基調講演 「Advances in Continuous Integration Testing @Google」 – http://jasst.jp/symposium/jasst18tokyo/pdf/A1.pdf ● GoogleのJohn Micco氏によるFlakyなテストと その判別方法の解説 #JaSST – http://nihonbuson.hatenadiary.jp/entry/2018/03/10/110000 ● #JaSST '18 TokyoのMicco氏のチュートリアルを 復習し、少しデータで遊んでみる – http://www.kzsuzuki.com/entry/flakyTest