Slide 1

Slide 1 text

テストコード文化を0から作り、変 化し続けた組織 2024/12/07 ソフトウェアテスト自動化カンファレンス2024 @zosokh

Slide 2

Slide 2 text

ヒエイカザト 株式会社ウエディングパーク エグゼクティブエンジニア +Creation本部 TECH戦略室   @zosokh #野球観戦 #ちなヤク #二児の父

Slide 3

Slide 3 text

運営メディア 結婚の各領域に特化した専門メディアを運営。ITを活用し、カップルと 様々なウエディングサービスのベストマッチを実現します。 海外挙式の日本最大級クチコミ& フォトサイト ドレス選びがもっと楽しくなるクチコミ サイト フォトウエディングの決め手が見つか るクチコミサイト 指輪選びの決め手が見つかるクチ コミサイト 経営理念:「結婚を、もっと幸せにしよう。」 ビジョン:「21世紀を代表するブライダル会社を創る」

Slide 4

Slide 4 text

運営メディア ノーコードツール デジタル広告 オンラインスクール DX推進 結婚式費用試算サービス

Slide 5

Slide 5 text

今日の話 組織にテストコード設置を根付かせたい方に、自チームや全社組織にテ ストコード導入のナレッジを話します チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後

Slide 6

Slide 6 text

チームとテストコード まずは1チームにテストコードを書く文化醸成 チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後

Slide 7

Slide 7 text

チームとテストコード| 導入編

Slide 8

Slide 8 text

以前所属していた開発チームの話 ● 当時はテストコードを書く文化は無かった ● アプリケーション内に、僅かなテストコードが設置 ○ 動いているか分からない状態 ● 障害時に人的フロー対策体制を敷く。自動テストなど人的に頼 らない仕組みで防御する対応を行えていない 一つのチームにテストコード文化醸成

Slide 9

Slide 9 text

● チーム内にテストコードを書く習慣がない ○ 書く方法がわからない・テスト実行環境もない ● 書いて何が良くなるのかわからない なんとなく書かれているテストコードがある チームにテストコード導入を検討したいが

Slide 10

Slide 10 text

● テストコードを書くための環境づくり ● 目標を決めたテストコード拡張 の行動を始める テストコードを書く体制を模索

Slide 11

Slide 11 text

テストコードを書くための環境づくり ┗ローカル環境 Dockerでテスト環境を用意 ● テスト用ローカルDB ● 1コマンドでDockerコン テナ上でのPHPUnitを実 行 ● 他アプリケーションに依 存させない設計

Slide 12

Slide 12 text

テストコードを書くための環境づくり ┗CI環境

Slide 13

Slide 13 text

テストコードを書くための環境づくり ┗CI環境 レビュー時のテスト状態とカバレッジ値表示 Readmeにメインブランチのカバレッジ数値表示と カバレッジレポートを閲覧できる環境を用意

Slide 14

Slide 14 text

coverage: 2% まぁそんなもんか・・・ そして当時のカバレッジは・・

Slide 15

Slide 15 text

● 書きやすいところから書いていこうというラフなルール感を設定 ● とにかくテストの量を増やす事を目的 👉 カバレッジ値をチームの目標におく 初回は、「カバレッジ10%まで上げよう」を活動目標に掲げる ここで辛さを感じる・・ ではテストを書いていきましょう。目標設定編

Slide 16

Slide 16 text

どんなに頑張っても1%を上げるのに苦労 ┗テストを書いていない箇所が多すぎて、数メソッドテストを書い てもカバレッジに変化が起きない ┗テストコード書ける設計になっていない 範囲を指定してカバレッジを計測する目標にすれば良かった 既存のPJ(テスト無し) にテストを書く難しさ

Slide 17

Slide 17 text

テストになっていない・・ チームとしても、テストコード実装の熱量に差がある 👉 書き方がわからないメンバーを救済できていない 目標に追われてこんなテストコードが量産 public function test_selectRecords() { $response = $this->model->getAll(); $this->assertIsArray($response->records); }

Slide 18

Slide 18 text

● 新規実装部分にだけ、テストを設けていこう(既存機能にテス トを設けるのは辛い) ● ペアプロを用いてテストコードの書き方をレクチャー。コード レビューで議論を多く行う事も ここでやり方を変える

Slide 19

Slide 19 text

● カバレッジ数値が微妙に上がってくる ● 不具合発見時に、テストコードへ恒久的な対策を施せる事例が 出る 👉 テスト自動化の効果を実感 変化①

Slide 20

Slide 20 text

中途で新入社員が入社 ● テストコード状況への課題感に共感してくれる ● 2人(私・新入社員)で背中を見せる行動が増える。チームのテ ストコードへの意識変化が加速 ● テストコードのためのリファクタリング、チーム全体でテスト コードを拡張する時間が増える 変化②

Slide 21

Slide 21 text

テストコードへの角度が高いメンバー数が増えたことで ● 2人が行う実装はテストコードを混ぜたPRをガンガン出しまく る ● コードレビューでは、2人でテストコード実装面のノウハウを他 メンバーにも布教やサポートを行う ● テストコード実装の意思1人に近かった状態から、あっという間 にチームに蔓延する 変化② | ここで良かったこと深掘り

Slide 22

Slide 22 text

チームとテストコード| ぜんぶ書く編

Slide 23

Slide 23 text

アプリケーションリプレイスの話がやってくる このタイミングでテストコードを全て網羅したアプリケーションを 立ち上げようと決意 「テストコードぜんぶ書く」を始める

Slide 24

Slide 24 text

テストコード全部書く 個人的には、テストを全て設置したアプリケーションを作成するの は初めて 初回は工数感が予定より遅れながらも、実装の仕方を掴んでいき、 徐々に進捗が進む(慣れ)

Slide 25

Slide 25 text

そしてリプレイス完了。リリースへ その時のカバレッジは 92%!! フロントのReactコンポーネントにもテストを都度実装 やった〜!!!!

Slide 26

Slide 26 text

この時のCI環境 アプリケーション複数のカバレッジ値を GitHub上でoctcovsを利用して管理 https://engineers.weddingpark.co.jp/github_actio ns_octocov/

Slide 27

Slide 27 text

開発中の話 常時composer(PHPのパッケージ管理システム)の内容をアップ デート。テストが通る安心感からスピード感高くマージができる 👉毎日最新アプリケーションに更新 ┗これはリリース後も継続

Slide 28

Slide 28 text

● 毎日composer アップデート ● PHP・フレームワークアップデートが簡単にできるようになる 👉この後詳細を話します ● 「人的に頼らない仕組みで防御」の形が一つ環境が築けた リリース後の変化

Slide 29

Slide 29 text

チームとテストコード| まとめ

Slide 30

Slide 30 text

テストコードを書かなかったチームが、今では、テストコードの設 置が当たり前になる 👉 現在私はチームから離れているが、チームとしてはテストコード 拡張が完全に自己組織化 チームとテストコード(まとめ)

Slide 31

Slide 31 text

全社推進に向けた テストコード効果検証 全社水準へ変化 チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後

Slide 32

Slide 32 text

全社推進に向けたテストコード効果検証| 社内施策の実施編

Slide 33

Slide 33 text

「TECH PASS」という社内施策がある。技術研究期間を与えられ、事業 ・組織に貢献を目指した開発期間を与えられる事に 👉 チームから全社へ、テストコードを導入する手法を模索するミッ ションを持った 半年間、技術検証や開発のリソースを割ける事に https://www.wantedly.com/companies/weddingpark/post_articles/455459 社内施策の実施

Slide 34

Slide 34 text

なにをやろうか検討する                   に着目 👉 テストコード整備による効果を示せる用になれば、導入への強い 判断材料となるのではと考える 全社テストコード推進のため

Slide 35

Slide 35 text

弊社にはQAテストというスプレッドシートにまとめたテスト項目 (以降テスト仕様書)をブラウザテストしていくフローがある ※リリース前の必須フロー 👉このテスト仕様書が、テストコードでどれぐらいカバーできるか 検証する。定量的にカバー率を出し、QAテスト削減へ恩恵があるこ とを証明したい テストコード効果を立証してみよう

Slide 36

Slide 36 text

リリースしたリプレイスアプリケーションのテストコードが、どれ ぐらいテスト仕様書を網羅されているが調べる テスト仕様書とテストコードのカバー率

Slide 37

Slide 37 text

リプレイス案件リリース時にQAテストを行った時の、テスト仕様書 項目数 合計 6928 のテスト項目 テスト仕様書項目数

Slide 38

Slide 38 text

テスト仕様書のテストコード網羅状態 リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 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

Slide 39

Slide 39 text

リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 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 テスト仕様書のテストコード網羅状態 テストコードでテストできている 項目 データ内容のテストはできている けれど、表示面のテストはできて いない テストコードでテストできていな い

Slide 40

Slide 40 text

リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 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ができる ・〇〇の項目(文字列・ボタン・リンク ・・)が表示されている ・フロントでの出し分け表示テスト →テストコード元々無い →テストコード実装漏れ・範囲漏れ →テストコードが実装に苦戦した項目

Slide 41

Slide 41 text

リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 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 テスト仕様書のテストコード網羅状態 テストコードで完全整備され、テスト 仕様書項目を削減できる

Slide 42

Slide 42 text

リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 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 テスト仕様書のテストコード網羅状態 一部テスト項目漏れがあるが、テスト コードによるカバーができている。 しかし同範囲をリリース時はテストデ バッグが必要。

Slide 43

Slide 43 text

リリースフェーズ テスト項目行数 カバー済み 一部カバー済み 未カバー 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 テスト仕様書のテストコード網羅状態 全くテストコードが整備されていない

Slide 44

Slide 44 text

テスト仕様書のテストコード網羅状態 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

Slide 45

Slide 45 text

テスト工数 リリースフェーズ テスト仕様書作成(人日) テスト工数(人日) 1 0.2 0.4 2 1.5 14 3・4 3 18 5 2 16 合計 6.7人日 48.4人日

Slide 46

Slide 46 text

テスト工数を省けるか リリースフェーズ テスト仕様書作成(人日) テスト工数(人日) 1 0.2 0.4 2 1.5 14 3・4 3 18 5 2 16 6.7 ×          48.4 ×          テストコード未カバー 20.57% テストコード未カバー 20.57%

Slide 47

Slide 47 text

テストコードで、テスト工数を省けるか リリースフェーズ テスト仕様書作成(人日) テスト工数(人日) 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%

Slide 48

Slide 48 text

テストコード作成の工数がかかった事も忘れてはならない 以下の方法で算出 ● テストコード含めた PRを洗い出し、初回commit時間〜最後のcommit時間 をテストコード作成工数と捉える 開発全体にかかった工数も割り出す ● リプレイス開発期間中の給料明細から、稼働時間などを算出 テストコード作成工数計算

Slide 49

Slide 49 text

スクリプト実行 テストコード作成工数計算

Slide 50

Slide 50 text

テストコード作成にかかった割合 テストコード工数合算(人日) スクリプトから作成 開発完了までの人日 給料明細の稼働時間から作成 全開発の中でテストコード作成 の割合 **.2 ***.815 34.52%

Slide 51

Slide 51 text

テストコード作成にかかった割合 テストコード工数合算(人日) スクリプトから作成 開発完了までの人日 給料明細の稼働時間から作成 全開発の中でテストコード作成 の割合 **.2 ***.815 34.52% 開発期間(9ヶ月)の中、 単純計算で 3.1ヶ月をテストコード作成に充てていた

Slide 52

Slide 52 text

ローンチ後3ヶ月のリリース 案件 回数 開発工数 テスト工数 composer update 15 0 0 Github移行 1 7 0 フレームワークVer Up 1 6 2 リリース後の施策 1 4 1

Slide 53

Slide 53 text

ローンチ後3ヶ月のリリース 案件 回数 開発工数 テスト工数 テストコードが無かった時 のテスト工数 composer update 15 0 0 ??? Github移行 1 7 0 0 フレームワークVer Up 1 6 2 40 リリース後の施策 1 4 1 4

Slide 54

Slide 54 text

ローンチ後3ヶ月のリリース 案件 回数 開発工数 テスト工数 テストコードが無かった時 のテスト工数 composer update 15 0 0 ??? Github移行 1 7 0 0 フレームワークVer Up 1 6 2 40 リリース後の施策 1 4 1 4 計り知れない。テストコードが無 かったら定期的なアップデートは 出来ないかもしれない 他のPJのアップデート時を参考

Slide 55

Slide 55 text

全社推進に向けたテストコード効果検証| テストコードの効果定量化、結論編

Slide 56

Slide 56 text

工数面の恩恵 ● リプレイスアプリケーションでは、テストコード作成工数を差 し引いても、リリース時のQAテスト工数やバージョンアップな どの保守運用工数の削減ができる計算だった テストコードの効果・恩恵 テストコード作成工数 テストコードで削減でき たQAテスト工数 テストコードで削減でき たバージョンアップ工数 効果 1ヶ月20人日 × 3.1ヶ月 = 62人日 -40人日 -38人日 -16人日 ※効果の数値は運用していく時間が増えるほど増えていく

Slide 57

Slide 57 text

リリース数の恩恵 ● 定期的なライブラリのバージョンアップと、工数をかけない バージョンアップ対応が可能 リプレイスアプリケーションは、バージョンアップを工数をかけず に行えている テストコードの効果・恩恵

Slide 58

Slide 58 text

疑問

Slide 59

Slide 59 text

それは・・・・ 確かにそうかもですが、この検証の機会があった事に感謝していま す 定量的な効果を示す活動に時間を割けた事は、エンジニア人生の中 でも貴重な調査期間 この検証をする時間で、テスト書けたのでは?

Slide 60

Slide 60 text

全社推進に向けたテストコード効果検証| まとめ

Slide 61

Slide 61 text

推進のための提案材料が整ってきた ● テストコードの運用面の有効さは証明できた ● テストコードを設置したいと思っているエンジニアも多い(ヒアリ ング) ● もちろんテストコードは、リリース物のクオリティアップにつなが る 👉 じゃあ是非テストコード体制設置を!の話に持っていきたい 全社推進に向けたテストコード効果検証(まとめ)

Slide 62

Slide 62 text

全社推進へのアクションと その後 全社にテストコード取り組みへ チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後

Slide 63

Slide 63 text

全社推進へのアクションとその後| 方針模索編

Slide 64

Slide 64 text

課題:エンジニアがテストを書く意思決定ができない ● スキルがない ○ テストコードを書けない・書き方が分からない ● 工数がない ○ テスト作成の工数が分からない。工数の取り方が分からない 👉 経験が無いのでエンジニア個人から、事業インパクトと有効性の説 明を事業メンバーにできる人が少ない 効果証明だけでは足らない

Slide 65

Slide 65 text

前提:テストコードを書かなくても、今までやってきたQAテストで バグを検知はできる QAテストでの不便な点や、テストコード有効さは分かっていても、 テスト作成のスキル獲得へコストがネックになり、 QAテスト実行 を選択してしまうという声もあった ※テストコードとQAテストは、互いにテストを設けやすい項目や特化したテスト範囲が違うので、良いところを使い分けていく のがベター QAテストについて

Slide 66

Slide 66 text

書かない事が必ずしも悪い事ではない テストコードを書く≠ 正義 テストコードを書かない ≠ 悪 例: 事業フェーズや事業都合による、テストコードを書かないという意思決定自 体は尊重されるべき ● 新規事業立ち上げ時など、高速サイクルでプロトタイピングを行いたい そもそもテストコードを書く事について

Slide 67

Slide 67 text

QAテストだけに頼る課題は無視できない じゃあ書かなくても良いわけでも無い

Slide 68

Slide 68 text

目標を変えた 事業やプロダクトの状態を見て、適切な判断でテストコード導入を 検討できる状態にしたい > 中長期な運用面効率化をしていきたい > 現状のテスト負荷増加の課題を軽減したい > リリースサイクルをさらに早めていきたい > 恒久的なバグ対策を仕込みたい 上記のために戦術として、テストコードを設ける手法を選択できる 組織を作る

Slide 69

Slide 69 text

課題: エンジニアから、事業インパクトと有効性の説明をできる人が少な い テストコードを戦術として採用するには、プレイヤーのスキルと経 験が足らない 適切な判断でテストコード導入検討できるか

Slide 70

Slide 70 text

戦略: ● テストコードを書ける ● 自分のPJでテストコードを書く経験をさせる 👉 テストコードを書ける前提で、テストコードの戦術を選択ができる状態にする 上記に向けて、社内エンジニアがテストコードを書くために全面サ ポートするべきと考えた 今やるべき事

Slide 71

Slide 71 text

テストコードの研修とコンサルティングを行う 結論

Slide 72

Slide 72 text

他部署のエンジニアに対し、テストコードの研修とコンサルティン グを行う ● PHPUnitテストの設け方の研修を行う ● 担当のPJコードから設けられるテストコードの提案とレク チャーを行う ● テストコードの入ったPRを全面的にレビューを行う 方針

Slide 73

Slide 73 text

他部署のエンジニアに対し、テストコードの研修とコンサルティン グを行う ● PHPUnitテストの設け方の研修を行う ● 担当のPJコードから設けられるテストコードの提案とレク チャーを行う ● テストコードの入ったPRを全面的にレビューを行う 方針 この取り組みから、上記の事例を作っていく取り組み

Slide 74

Slide 74 text

全社推進へのアクションとその後| 実行編

Slide 75

Slide 75 text

研修カリキュラムとフローを実行 カリキュラムカテゴリ 内容 目的 PHPUnitテストの設け方の講義と基本ワーク ・テストコードの効果とプロジェクトの実例・扱 い方を紹介 ・PHPUnit基本講座とワーク 基本的な扱い方を学び、実際に手を動かし PHPUnitを知る 既存のPJコードから設けられるテストコードを 提案とレクチャー ・自プロジェクトからどんなテストコードを作れ るか知る ・自プロジェクトでPHPUnit環境を立ち上げる ・自プロジェクトでテストコードを書く 今後自身でテストコード拡張を作れるよう にする テストコードの入ったPRを全面的にレビュー ・継続的なテストコード作成とレビュー 拡張したテストコードのレビュー体制を経 験し、テストコードを書き続ける

Slide 76

Slide 76 text

● 研修実行するエンジニアチームを決め、研修実行 ● カリキュラム外にも、担当PJの環境作成の整備サポートに入っ た 👉基礎研修などを通しても、結局は担当PJでのテストコード実装と レビューが一番理解度が上がることを知る やったこと

Slide 77

Slide 77 text

良い点 ● テストコードを組み込むチームが増える ● スキルアップ観点でテストコード実装を目標に入れる人が出る ○ 個人の目標からチームミッションに昇華する事例も出てきた 課題点 ● 定着にはまだ遠い。現状もテストコード実装が、「追加タスク」で あり「優先度が低」の認識状態がある 結果

Slide 78

Slide 78 text

まとめ

Slide 79

Slide 79 text

一番最初は1チームでテスト コード実装文化醸成の事例がで きた テストコード全面実装事例を出 し、テストコードがある効果を 実感できる状態も作った まとめ テストコードの有益性を立証す るため、定量的な効果をまとめ る 効果証明だけでは組織は動かせず、エン ジニア個人のスキル向上を狙っていく ┗事業やプロダクトの状態を見て、適切 な判断でテストコード導入を検討できる 状態を目指す テストコード研修実施。まだ定着率は低 いが、自発的なテストスキル確立や方針 にテスト設置を置くチームが出てくる チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後

Slide 80

Slide 80 text

🌱が見えてきた形だが、組織全体がテストコードを書いていくため にはまだまだ障壁がある 「テストコード実装は追加工数ではない」 当たり前にテストコード設置を模索できる組織を目指していく 結論

Slide 81

Slide 81 text

会社として、「小さく・早く」をモットーにしている 企業カルチャーの精神を取り組みに。個人に収めず、組織全体の力にしていく行動  「チームウエディングパークでいく。チームでしかいけないところがある。」  小さな人数でプロトタイピングを繰り返し、成果事例を作り、取り組みを拡大していく  取り組みに全員で協力し、同じ未来へ全員でいく 結論 チームとテストコード 全社推進に向けた テストコード効果検証 全社推進へのアクション とその後 https://speakerdeck.com/weddingpark/weddingpark-culture-book

Slide 82

Slide 82 text

ご清聴ありがとうございました