Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
テストコード文化を0から作り、変化し続けた組織
Search
zosokh
December 07, 2024
Programming
2
950
テストコード文化を0から作り、変化し続けた組織
2024/12/07 ソフトウェアテスト自動化カンファレンス2024
zosokh
December 07, 2024
Tweet
Share
More Decks by zosokh
See All by zosokh
開発生産性を取り入れたばかりの組織が、スキルと生産性向上を紐づける
kazatohiei
1
96
アプリケーションをリプレイスしたら チームとサービス運用に向き合えた
kazatohiei
1
530
PhinxによるDBマイグレーションとサービス運用
kazatohiei
0
1k
エラー監視とテスト体制への改善作戦 / PHPerKaigi2022
kazatohiei
7
4.6k
サービス運用エンジニアによるPHP8バージョンアップ奮闘記 / PHPカンファレンス2021
kazatohiei
0
1.1k
Other Decks in Programming
See All in Programming
CSC305 Lecture 26
javiergs
PRO
0
110
複雑な仕様に立ち向かうアーキテクチャ
myohei
0
130
今からはじめるAndroidアプリ開発 2024 / DevFest 2024
star_zero
0
780
Flutterを言い訳にしない!アプリの使い心地改善テクニック5選🔥
kno3a87
3
400
Djangoの開発環境で工夫したこと - pre-commit / DevContainer
hiroki_yod
1
660
CSC509 Lecture 14
javiergs
PRO
0
120
社内活動の取り組み紹介 ~ スリーシェイクでこんな取り組みしてます ~
bells17
0
390
Java 23の概要とJava Web Frameworkの現状 / Java 23 and Java web framework
kishida
2
380
【re:Growth 2024】 Aurora DSQL をちゃんと話します!
maroon1st
0
560
急成長期の品質とスピードを両立するフロントエンド技術基盤
soarteclab
0
760
Recoilを剥がしている話
kirik
1
2.1k
新規学習のハードルを下げる方法とは?/ How to Make Learning Something New Easier?
nobuoooo
1
130
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
490
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
780
The Cost Of JavaScript in 2023
addyosmani
45
6.9k
Unsuck your backbone
ammeep
669
57k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
890
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Transcript
テストコード文化を0から作り、変 化し続けた組織 2024/12/07 ソフトウェアテスト自動化カンファレンス2024 @zosokh
ヒエイカザト 株式会社ウエディングパーク エグゼクティブエンジニア +Creation本部 TECH戦略室 @zosokh #野球観戦 #ちなヤク #二児の父
運営メディア 結婚の各領域に特化した専門メディアを運営。ITを活用し、カップルと 様々なウエディングサービスのベストマッチを実現します。 海外挙式の日本最大級クチコミ& フォトサイト ドレス選びがもっと楽しくなるクチコミ サイト フォトウエディングの決め手が見つか るクチコミサイト 指輪選びの決め手が見つかるクチ
コミサイト 経営理念:「結婚を、もっと幸せにしよう。」 ビジョン:「21世紀を代表するブライダル会社を創る」
運営メディア ノーコードツール デジタル広告 オンラインスクール DX推進 結婚式費用試算サービス
今日の話 組織にテストコード設置を根付かせたい方に、自チームや全社組織にテ ストコード導入のナレッジを話します チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後
チームとテストコード まずは1チームにテストコードを書く文化醸成 チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後
チームとテストコード| 導入編
以前所属していた開発チームの話 • 当時はテストコードを書く文化は無かった • アプリケーション内に、僅かなテストコードが設置 ◦ 動いているか分からない状態 • 障害時に人的フロー対策体制を敷く。自動テストなど人的に頼 らない仕組みで防御する対応を行えていない
一つのチームにテストコード文化醸成
• チーム内にテストコードを書く習慣がない ◦ 書く方法がわからない・テスト実行環境もない • 書いて何が良くなるのかわからない なんとなく書かれているテストコードがある チームにテストコード導入を検討したいが
• テストコードを書くための環境づくり • 目標を決めたテストコード拡張 の行動を始める テストコードを書く体制を模索
テストコードを書くための環境づくり ┗ローカル環境 Dockerでテスト環境を用意 • テスト用ローカルDB • 1コマンドでDockerコン テナ上でのPHPUnitを実 行 •
他アプリケーションに依 存させない設計
テストコードを書くための環境づくり ┗CI環境
テストコードを書くための環境づくり ┗CI環境 レビュー時のテスト状態とカバレッジ値表示 Readmeにメインブランチのカバレッジ数値表示と カバレッジレポートを閲覧できる環境を用意
coverage: 2% まぁそんなもんか・・・ そして当時のカバレッジは・・
• 書きやすいところから書いていこうというラフなルール感を設定 • とにかくテストの量を増やす事を目的 👉 カバレッジ値をチームの目標におく 初回は、「カバレッジ10%まで上げよう」を活動目標に掲げる ここで辛さを感じる・・ ではテストを書いていきましょう。目標設定編
どんなに頑張っても1%を上げるのに苦労 ┗テストを書いていない箇所が多すぎて、数メソッドテストを書い てもカバレッジに変化が起きない ┗テストコード書ける設計になっていない 範囲を指定してカバレッジを計測する目標にすれば良かった 既存のPJ(テスト無し) にテストを書く難しさ
テストになっていない・・ チームとしても、テストコード実装の熱量に差がある 👉 書き方がわからないメンバーを救済できていない 目標に追われてこんなテストコードが量産 public function test_selectRecords() { $response
= $this->model->getAll(); $this->assertIsArray($response->records); }
• 新規実装部分にだけ、テストを設けていこう(既存機能にテス トを設けるのは辛い) • ペアプロを用いてテストコードの書き方をレクチャー。コード レビューで議論を多く行う事も ここでやり方を変える
• カバレッジ数値が微妙に上がってくる • 不具合発見時に、テストコードへ恒久的な対策を施せる事例が 出る 👉 テスト自動化の効果を実感 変化①
中途で新入社員が入社 • テストコード状況への課題感に共感してくれる • 2人(私・新入社員)で背中を見せる行動が増える。チームのテ ストコードへの意識変化が加速 • テストコードのためのリファクタリング、チーム全体でテスト コードを拡張する時間が増える 変化②
テストコードへの角度が高いメンバー数が増えたことで • 2人が行う実装はテストコードを混ぜたPRをガンガン出しまく る • コードレビューでは、2人でテストコード実装面のノウハウを他 メンバーにも布教やサポートを行う • テストコード実装の意思1人に近かった状態から、あっという間 にチームに蔓延する
変化② | ここで良かったこと深掘り
チームとテストコード| ぜんぶ書く編
アプリケーションリプレイスの話がやってくる このタイミングでテストコードを全て網羅したアプリケーションを 立ち上げようと決意 「テストコードぜんぶ書く」を始める
テストコード全部書く 個人的には、テストを全て設置したアプリケーションを作成するの は初めて 初回は工数感が予定より遅れながらも、実装の仕方を掴んでいき、 徐々に進捗が進む(慣れ)
そしてリプレイス完了。リリースへ その時のカバレッジは 92%!! フロントのReactコンポーネントにもテストを都度実装 やった〜!!!!
この時のCI環境 アプリケーション複数のカバレッジ値を GitHub上でoctcovsを利用して管理 https://engineers.weddingpark.co.jp/github_actio ns_octocov/
開発中の話 常時composer(PHPのパッケージ管理システム)の内容をアップ デート。テストが通る安心感からスピード感高くマージができる 👉毎日最新アプリケーションに更新 ┗これはリリース後も継続
• 毎日composer アップデート • PHP・フレームワークアップデートが簡単にできるようになる 👉この後詳細を話します • 「人的に頼らない仕組みで防御」の形が一つ環境が築けた リリース後の変化
チームとテストコード| まとめ
テストコードを書かなかったチームが、今では、テストコードの設 置が当たり前になる 👉 現在私はチームから離れているが、チームとしてはテストコード 拡張が完全に自己組織化 チームとテストコード(まとめ)
全社推進に向けた テストコード効果検証 全社水準へ変化 チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後
全社推進に向けたテストコード効果検証| 社内施策の実施編
「TECH PASS」という社内施策がある。技術研究期間を与えられ、事業 ・組織に貢献を目指した開発期間を与えられる事に 👉 チームから全社へ、テストコードを導入する手法を模索するミッ ションを持った 半年間、技術検証や開発のリソースを割ける事に https://www.wantedly.com/companies/weddingpark/post_articles/455459 社内施策の実施
なにをやろうか検討する に着目 👉 テストコード整備による効果を示せる用になれば、導入への強い 判断材料となるのではと考える 全社テストコード推進のため
弊社にはQAテストというスプレッドシートにまとめたテスト項目 (以降テスト仕様書)をブラウザテストしていくフローがある ※リリース前の必須フロー 👉このテスト仕様書が、テストコードでどれぐらいカバーできるか 検証する。定量的にカバー率を出し、QAテスト削減へ恩恵があるこ とを証明したい テストコード効果を立証してみよう
リリースしたリプレイスアプリケーションのテストコードが、どれ ぐらいテスト仕様書を網羅されているが調べる テスト仕様書とテストコードのカバー率
リプレイス案件リリース時にQAテストを行った時の、テスト仕様書 項目数 合計 6928 のテスト項目 テスト仕様書項目数
テスト仕様書のテストコード網羅状態 リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 1 24 15 7
2 2 674 143 318 213 3 3735 2866 160 709 4 2206 1817 122 267 5 289 35 20 234 6928 4876 627 1425
リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 1 24 15 7 2
2 674 143 318 213 3 3735 2866 160 709 4 2206 1817 122 267 5 289 35 20 234 6928 4876 627 1425 テスト仕様書のテストコード網羅状態 テストコードでテストできている 項目 データ内容のテストはできている けれど、表示面のテストはできて いない テストコードでテストできていな い
リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 1 24 15 7 2
2 674 143 318 213 3 3735 2866 160 709 4 2206 1817 122 267 5 289 35 20 234 6928 4876 627 1425 テスト仕様書のテストコード網羅状態 ・データが保存される ・バリデーションにかかる ・◦件表示されている ・データのアサインのテストはできているが、表示面(ボ タンをプッシュ、文字やボタンの色)も指定されたテスト は網羅できていない ・ボタンを押したら公開ステータスが非公開となる。該当 の公開ステータスもグレーとなる。 →更新について、サーバーサイド側の更新やデータ整 合性のテストはできているが、フロント表示面をカバーで きていない ・チェックボックスのONOFFができる ・〇〇の項目(文字列・ボタン・リンク ・・)が表示されている ・フロントでの出し分け表示テスト →テストコード元々無い →テストコード実装漏れ・範囲漏れ →テストコードが実装に苦戦した項目
リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 1 24 15 7 2
2 674 143 318 213 3 3735 2866 160 709 4 2206 1817 122 267 5 289 35 20 234 6928 4876 627 1425 テスト仕様書のテストコード網羅状態 テストコードで完全整備され、テスト 仕様書項目を削減できる
リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 1 24 15 7 2
2 674 143 318 213 3 3735 2866 160 709 4 2206 1817 122 267 5 289 35 20 234 6928 4876 627 1425 テスト仕様書のテストコード網羅状態 一部テスト項目漏れがあるが、テスト コードによるカバーができている。 しかし同範囲をリリース時はテストデ バッグが必要。
リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 1 24 15 7 2
2 674 143 318 213 3 3735 2866 160 709 4 2206 1817 122 267 5 289 35 20 234 6928 4876 627 1425 テスト仕様書のテストコード網羅状態 全くテストコードが整備されていない
テスト仕様書のテストコード網羅状態 70.38% 79.43% 20.57% リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 1
24 15 7 2 2 674 143 318 213 3 3735 2866 160 709 4 2206 1817 122 267 5 289 35 20 234 6928 4876 627 1425
テスト工数 リリースフェーズ テスト仕様書作成(人日) テスト工数(人日) 1 0.2 0.4 2 1.5 14
3・4 3 18 5 2 16 合計 6.7人日 48.4人日
テスト工数を省けるか リリースフェーズ テスト仕様書作成(人日) テスト工数(人日) 1 0.2 0.4 2 1.5 14
3・4 3 18 5 2 16 6.7 × 48.4 × テストコード未カバー 20.57% テストコード未カバー 20.57%
テストコードで、テスト工数を省けるか リリースフェーズ テスト仕様書作成(人日) テスト工数(人日) 1 0.2 0.4 2 1.5 14
3・4 3 18 5 2 16 6.7 × 48.4 × 0.25人日 9.95人日 40人日以上削減できる事になる ※単純計算なので実際はそこまで極端では ないと思います テストコード未カバー 20.57% テストコード未カバー 20.57%
テストコード作成の工数がかかった事も忘れてはならない 以下の方法で算出 • テストコード含めた PRを洗い出し、初回commit時間〜最後のcommit時間 をテストコード作成工数と捉える 開発全体にかかった工数も割り出す • リプレイス開発期間中の給料明細から、稼働時間などを算出 テストコード作成工数計算
スクリプト実行 テストコード作成工数計算
テストコード作成にかかった割合 テストコード工数合算(人日) スクリプトから作成 開発完了までの人日 給料明細の稼働時間から作成 全開発の中でテストコード作成 の割合 **.2 ***.815 34.52%
テストコード作成にかかった割合 テストコード工数合算(人日) スクリプトから作成 開発完了までの人日 給料明細の稼働時間から作成 全開発の中でテストコード作成 の割合 **.2 ***.815 34.52%
開発期間(9ヶ月)の中、 単純計算で 3.1ヶ月をテストコード作成に充てていた
ローンチ後3ヶ月のリリース 案件 回数 開発工数 テスト工数 composer update 15 0 0
Github移行 1 7 0 フレームワークVer Up 1 6 2 リリース後の施策 1 4 1
ローンチ後3ヶ月のリリース 案件 回数 開発工数 テスト工数 テストコードが無かった時 のテスト工数 composer update 15
0 0 ??? Github移行 1 7 0 0 フレームワークVer Up 1 6 2 40 リリース後の施策 1 4 1 4
ローンチ後3ヶ月のリリース 案件 回数 開発工数 テスト工数 テストコードが無かった時 のテスト工数 composer update 15
0 0 ??? Github移行 1 7 0 0 フレームワークVer Up 1 6 2 40 リリース後の施策 1 4 1 4 計り知れない。テストコードが無 かったら定期的なアップデートは 出来ないかもしれない 他のPJのアップデート時を参考
全社推進に向けたテストコード効果検証| テストコードの効果定量化、結論編
工数面の恩恵 • リプレイスアプリケーションでは、テストコード作成工数を差 し引いても、リリース時のQAテスト工数やバージョンアップな どの保守運用工数の削減ができる計算だった テストコードの効果・恩恵 テストコード作成工数 テストコードで削減でき たQAテスト工数 テストコードで削減でき
たバージョンアップ工数 効果 1ヶ月20人日 × 3.1ヶ月 = 62人日 -40人日 -38人日 -16人日 ※効果の数値は運用していく時間が増えるほど増えていく
リリース数の恩恵 • 定期的なライブラリのバージョンアップと、工数をかけない バージョンアップ対応が可能 リプレイスアプリケーションは、バージョンアップを工数をかけず に行えている テストコードの効果・恩恵
疑問
それは・・・・ 確かにそうかもですが、この検証の機会があった事に感謝していま す 定量的な効果を示す活動に時間を割けた事は、エンジニア人生の中 でも貴重な調査期間 この検証をする時間で、テスト書けたのでは?
全社推進に向けたテストコード効果検証| まとめ
推進のための提案材料が整ってきた • テストコードの運用面の有効さは証明できた • テストコードを設置したいと思っているエンジニアも多い(ヒアリ ング) • もちろんテストコードは、リリース物のクオリティアップにつなが る 👉
じゃあ是非テストコード体制設置を!の話に持っていきたい 全社推進に向けたテストコード効果検証(まとめ)
全社推進へのアクションと その後 全社にテストコード取り組みへ チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後
全社推進へのアクションとその後| 方針模索編
課題:エンジニアがテストを書く意思決定ができない • スキルがない ◦ テストコードを書けない・書き方が分からない • 工数がない ◦ テスト作成の工数が分からない。工数の取り方が分からない 👉
経験が無いのでエンジニア個人から、事業インパクトと有効性の説 明を事業メンバーにできる人が少ない 効果証明だけでは足らない
前提:テストコードを書かなくても、今までやってきたQAテストで バグを検知はできる QAテストでの不便な点や、テストコード有効さは分かっていても、 テスト作成のスキル獲得へコストがネックになり、 QAテスト実行 を選択してしまうという声もあった ※テストコードとQAテストは、互いにテストを設けやすい項目や特化したテスト範囲が違うので、良いところを使い分けていく のがベター QAテストについて
書かない事が必ずしも悪い事ではない テストコードを書く≠ 正義 テストコードを書かない ≠ 悪 例: 事業フェーズや事業都合による、テストコードを書かないという意思決定自 体は尊重されるべき •
新規事業立ち上げ時など、高速サイクルでプロトタイピングを行いたい そもそもテストコードを書く事について
QAテストだけに頼る課題は無視できない じゃあ書かなくても良いわけでも無い
目標を変えた 事業やプロダクトの状態を見て、適切な判断でテストコード導入を 検討できる状態にしたい > 中長期な運用面効率化をしていきたい > 現状のテスト負荷増加の課題を軽減したい > リリースサイクルをさらに早めていきたい >
恒久的なバグ対策を仕込みたい 上記のために戦術として、テストコードを設ける手法を選択できる 組織を作る
課題: エンジニアから、事業インパクトと有効性の説明をできる人が少な い テストコードを戦術として採用するには、プレイヤーのスキルと経 験が足らない 適切な判断でテストコード導入検討できるか
戦略: • テストコードを書ける • 自分のPJでテストコードを書く経験をさせる 👉 テストコードを書ける前提で、テストコードの戦術を選択ができる状態にする 上記に向けて、社内エンジニアがテストコードを書くために全面サ ポートするべきと考えた 今やるべき事
テストコードの研修とコンサルティングを行う 結論
他部署のエンジニアに対し、テストコードの研修とコンサルティン グを行う • PHPUnitテストの設け方の研修を行う • 担当のPJコードから設けられるテストコードの提案とレク チャーを行う • テストコードの入ったPRを全面的にレビューを行う 方針
他部署のエンジニアに対し、テストコードの研修とコンサルティン グを行う • PHPUnitテストの設け方の研修を行う • 担当のPJコードから設けられるテストコードの提案とレク チャーを行う • テストコードの入ったPRを全面的にレビューを行う 方針
この取り組みから、上記の事例を作っていく取り組み
全社推進へのアクションとその後| 実行編
研修カリキュラムとフローを実行 カリキュラムカテゴリ 内容 目的 PHPUnitテストの設け方の講義と基本ワーク ・テストコードの効果とプロジェクトの実例・扱 い方を紹介 ・PHPUnit基本講座とワーク 基本的な扱い方を学び、実際に手を動かし PHPUnitを知る
既存のPJコードから設けられるテストコードを 提案とレクチャー ・自プロジェクトからどんなテストコードを作れ るか知る ・自プロジェクトでPHPUnit環境を立ち上げる ・自プロジェクトでテストコードを書く 今後自身でテストコード拡張を作れるよう にする テストコードの入ったPRを全面的にレビュー ・継続的なテストコード作成とレビュー 拡張したテストコードのレビュー体制を経 験し、テストコードを書き続ける
• 研修実行するエンジニアチームを決め、研修実行 • カリキュラム外にも、担当PJの環境作成の整備サポートに入っ た 👉基礎研修などを通しても、結局は担当PJでのテストコード実装と レビューが一番理解度が上がることを知る やったこと
良い点 • テストコードを組み込むチームが増える • スキルアップ観点でテストコード実装を目標に入れる人が出る ◦ 個人の目標からチームミッションに昇華する事例も出てきた 課題点 • 定着にはまだ遠い。現状もテストコード実装が、「追加タスク」で
あり「優先度が低」の認識状態がある 結果
まとめ
一番最初は1チームでテスト コード実装文化醸成の事例がで きた テストコード全面実装事例を出 し、テストコードがある効果を 実感できる状態も作った まとめ テストコードの有益性を立証す るため、定量的な効果をまとめ る
効果証明だけでは組織は動かせず、エン ジニア個人のスキル向上を狙っていく ┗事業やプロダクトの状態を見て、適切 な判断でテストコード導入を検討できる 状態を目指す テストコード研修実施。まだ定着率は低 いが、自発的なテストスキル確立や方針 にテスト設置を置くチームが出てくる チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後
🌱が見えてきた形だが、組織全体がテストコードを書いていくため にはまだまだ障壁がある 「テストコード実装は追加工数ではない」 当たり前にテストコード設置を模索できる組織を目指していく 結論
会社として、「小さく・早く」をモットーにしている 企業カルチャーの精神を取り組みに。個人に収めず、組織全体の力にしていく行動 「チームウエディングパークでいく。チームでしかいけないところがある。」 小さな人数でプロトタイピングを繰り返し、成果事例を作り、取り組みを拡大していく 取り組みに全員で協力し、同じ未来へ全員でいく 結論 チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション
とその後 https://speakerdeck.com/weddingpark/weddingpark-culture-book
ご清聴ありがとうございました