0 -> 1でフロントエンドのテストを書く文化を作っている話#組織拡大と共に発生するソフトウェア品質の課題と裏話LT@目黒2023.10.20 primeNumber Inc.
View Slide
©primeNumber Inc.2中根 直孝WHO AM I?株式会社primeNumberイネーブリングチーム(来月から)経歴2017:新卒でWebエンジニアのキャリアをスタート2018/11:primeNumberにジョイン(trocco®のローンチとほぼ同時期)趣味/好きなもの音楽/ギター、サウナ、飲酒、辛いもの(最近はCoCo壱20辛)SNSなどX: @gtnao, GitHub: @gtnao02191
会社概要会社名代表創業OfficeCOMPANY株式会社primeNumber代表取締役CEO 田邊 雄樹2015年11月東京都品川区上大崎3丁目1番1号JR東急目黒ビル5F3
あらゆるデータを、ビジネスの力に変える。primeNumberは、データテクノロジーカンパニー。あらゆるデータが爆発的に増えていく時代に、誰もがすばやく、簡単にデータを使える環境を構築し、データ活用までのプロセスを最適化。高度なテクノロジーと独自のアイデアで、世界中のビジネスを支援します。V I S I O N4
©primeNumber Inc.trocco®とはA B O U T5
©primeNumber Inc.6trocco®とはtrocco®とは、データ統合を自動化し、データエンジニアリングにかかる工数を削減するSaaSです。データをビジネスに活用するまでのステップ「データ統合」を自動化し、データエンジニアリングにかかる工数を削減
©primeNumber Inc.7trocco®とはデモ動画URL:https://trocco.io/lp/index.html
©primeNumber Inc.8trocco®とはフルマネージド ETL/ELT日本特有のサービスを含めた、約100種のコネクタに対応データ分析基盤のための技術スタックを提供するサービスです。GUI ワークフロー複雑なデータ処理フローを GUI 上で設定・運用データマネジメント機能データリネージ / Git 連携・コード管理 / スキーマ追従 /データカタログ etc.
©primeNumber Inc.9● trocco®はローンチから5年のSaaS● ありがたいことのお客様は増加の一途● 当たり前のように負債も蓄積● 当時、品質改善PJT(仮)が発足● 改善したい点を上げ出したら、朝まで飲めるが…背景何からやっていけばいいんや…
©primeNumber Inc.あれ、フロントエンドって全然テスト書かれてなくね?10
©primeNumber Inc.11● 現状ではサーバーサイド/クラウドインフラが得意なエンジニアがどちらかというと多い組織○ かくいう私も専門ではない● サービスの特性としても、データ処理の部分がクリティカルであり、フロントエンドは二の次になりやすい● とはいえ、お客様が直接触る箇所● フロントエンド起因の不具合も当然ある背景
©primeNumber Inc.CTO鈴木「このPJTが成功したらどんなタイトルで発表するかから決めましょう」12
©primeNumber Inc.13● PJTメンバーだけでテストを拡充していってもいいが…● 至極当たり前のこのサイクルを皆がフロントエンドでもできるように● 「0 -> 1でフロントエンドのテストを書く文化を作った話」● 最近流行ってるから「FrontendTestEnabling」PJTに改名○ 乗るしかない背景既存のrspecがコケる新機能実装テスト/実装を修正
©primeNumber Inc.イネーブリングやっていき!14
©primeNumber Inc.15● ところで、フロントエンドのテストって何を書けばいいの?○ 条件に応じてコンポーネントが表示/非表示されるか?○ フォーム周りの挙動?○ APIリクエスト?○ VisualRegression?○ etc…(巷には綺麗なサンプルが溢れているが…)● 原点に立ち戻る方針Q: 手っ取り早く皆がテストに触れるには?
©primeNumber Inc.A: テストを落とす16
©primeNumber Inc.17● 何か新しいフィールドを追加すると基本落ちる● 落ちたままだとよからぬバグに繋がる可能性が高い○ バリデーション表示のテストなどは見送った(後述)。最悪サーバーで弾かれるため● このテストを各ページに60点レベルでひたすら追加していく○ 「0 -> 1でReact書くのは厳しいけど、ちょっと修正するだけなら」といった人も多いのでテストファイルがあることが重要● まずはPJTメンバーで書いたテストのPRを、PJT外のメンバーにレビューアサインし、「こんな感じね」と知ってもらう方針フォームに値を入力保存ボタンを押下想定通りのHTTPリクエストボディが送信されることを確認✅
©primeNumber Inc.18方針コード例※ 簡略化してます
©primeNumber Inc.あとはやるだけ!…と思いきや19
©primeNumber Inc.20● データ転送の元/先が現在計100種類以上存在し、それぞれに固有のフォームがある● 人海戦術でやるにも流石に限度が…問題①コネクター多すぎ問題コネクター多すぎ問題自動化したいよ〜
©primeNumber Inc.TSコンパイラを使ってみる21
©primeNumber Inc.22● TSコンパイラAPIに各フォームのファイルを渡してASTに変換● どのようなフィールドがフォームに存在するか、自動で抽出できる○ それでも足りない情報は自サービスをスクレイピングという荒技● それを元にテストファイルを自動生成して手直し● まだ書ききれていないが、約80/100コネクターほどは対応完了!問題①
©primeNumber Inc.23● 外部パッケージにESModuleが使われている場合の対策をあれこれしたら激遅になってしまった○ ESModuleFirstなvitestへの乗り換え○ 幸い、既存テストが少なかったので楽だった● MonacoEditorなど特定のコンポーネントを使ってるページで激遅に○ 最終的にテストでは生のtextareaなどにモックするように○ 特定に時間がかかった(操作関係なく存在するだけで影響したため)● それでもまだ厳しい○ PJTメンバーのCI職人にチューニングしてもらう○ (あんまりやりたくなかったが)余分なケースを減らす■ 前述のバリデーションなど問題②CI速度低下問題
©primeNumber Inc.24● RTLは要素の取得にはa11yを考慮した方法を使いましょうという思想だが…○ 現実はそんなに甘くない(海外のデータ系のSaaSを見てもdata-testid振っていた)○ react-hook-formを使っており、各種フィールドにはname属性が付与されていることが多かったのでそれを利用○ 使ってない箇所は今回テストのためだけに属性を追加● z-index対策からか、モーダルのコンポーネントをReact.createPortalで階層外にレンダーしていた○ モーダル内にある要素の操作方法が他と異なる● etc…(上げるとキリがないのでまたの機会に)問題③その他の諸問題
©primeNumber Inc.25● 1週間のPRのうち、フロントエンドのファイルに変更があるPRにテストが書かれているか● trocco®(転送元GitHub)で取得○ 一部温もりのある手作業でフィルタリング● 週によって母数がまちまちに…○ 指標としては微妙だったふりかえり
©primeNumber Inc.26ふりかえりBefore After● 特にテストファイル数が大幅に増加○ ケース数は意外とあったが、対象ファイルが16ファイルしかなかった○ Reactコンポーネントのテストではなく、ほとんどがutil関数に対するテストだった
©primeNumber Inc.27● jsパッケージのDependabotのマージが気軽にできるようになった● テストを書いてたら既にあったバグを発見● テスト書いてくれる人が増えた○ 何かしらテストを追加してくれた方が0ベースから10人超え○ 業務委託など社外の方々も書いてくれている○ 「来月ここら辺いじる予定だから、先にテストのPR出しておくわ〜」とかも● 来月からフロントエンドに限らないイネーブリングチームが正式に誕生ふりかえり良かったこと
©primeNumber Inc.28● 成果を定量化するのが難しい● まだまだ浸透しているとは言い難い○ 実装自体が結構バラバラで抽象化しづらい■ このページはこの書き方をしないと〜、とかがある○ 落ちたときのエラーメッセージが非自明で分かりにくい■ デバッグTipsドキュメント整備中● フォームの入力→APIリクエスト以外のテストケースの拡充もしたい● そもそもプロダクトコードをリファクタリングしていきたい○ テストがほとんどなかった時代に比べてハードルが下がったふりかえり反省点とこれから
©primeNumber Inc.29● trocco®を一緒に創ってくれる方を探しています○ エンジニアのドメイン知識が活かせるSaaS■ 社内利用のドッグフーディングも活発○ 海外展開も進行中○ Hotなデータエンジニアリングの知識も身につくかも● 色々なポジションで募集中です○ ソフトウェアエンジニア○ SRE○ QAエンジニア○ ソフトウェアエンジニア(イネーブリングチーム)○ 詳しくはこちらから■ https://herp.careers/v1/primenumber/requisition-groups/b258370f-bf7b-4358-9631-d53f51decef6We Are Hiring!
ご清聴ありがとうございました