Slide 1

Slide 1 text

0 -> 1でフロントエンドのテストを 書く文化を作っている話 #組織拡大と共に発生するソフトウェア品質の課題と裏話LT@目黒 2023.10.20 primeNumber Inc.

Slide 2

Slide 2 text

©primeNumber Inc. 2 中根 直孝 WHO AM I? 株式会社primeNumber イネーブリングチーム(来月から) 経歴 2017:新卒でWebエンジニアのキャリアをスタート 2018/11:primeNumberにジョイン(trocco®のローン チとほぼ同時期) 趣味/好きなもの 音楽/ギター、サウナ、飲酒、 辛いもの(最近はCoCo壱20辛) SNSなど X: @gtnao, GitHub: @gtnao0219 1


Slide 3

Slide 3 text

会社概要 会社名 代表 創業 Office COMPANY 株式会社primeNumber 代表取締役CEO 田邊 雄樹 2015年11月 東京都品川区上大崎3丁目1番1号 JR東急目黒ビル5F 3

Slide 4

Slide 4 text

あらゆるデータを、 ビジネスの力に変える。 primeNumberは、データテクノロジーカンパニー。 あらゆるデータが爆発的に増えていく時代に、 誰もがすばやく、簡単にデータを使える環境を構築し、 データ活用までのプロセスを最適化。 高度なテクノロジーと独自のアイデアで、 世界中のビジネスを支援します。 V I S I O N 4

Slide 5

Slide 5 text

©primeNumber Inc. trocco®とは A B O U T 5

Slide 6

Slide 6 text

©primeNumber Inc. 6 trocco®とは trocco®とは、データ統合を自動化し、データエンジニアリングにかかる工数を削減するSaaSです。 データをビジネスに活用するまでのステップ 「データ統合」を自動化し、データエンジニアリングにかかる工数を削減

Slide 7

Slide 7 text

©primeNumber Inc. 7 trocco®とは デモ動画URL:https://trocco.io/lp/index.html

Slide 8

Slide 8 text

©primeNumber Inc. 8 trocco®とは フルマネージド ETL/ELT 日本特有のサービスを含めた、約100種のコネクタに対応 データ分析基盤のための技術スタックを提供するサービスです。 GUI ワークフロー 複雑なデータ処理フローを GUI 上で設定・運用 データマネジメント機能 データリネージ / Git 連携・コード管理 / スキーマ追従 / データカタログ etc.

Slide 9

Slide 9 text

©primeNumber Inc. 9 ● trocco®はローンチから5年のSaaS ● ありがたいことのお客様は増加の一途 ● 当たり前のように負債も蓄積 ● 当時、品質改善PJT(仮)が発足 ● 改善したい点を上げ出したら、朝まで飲めるが… 背景 何からやっていけばいいんや…

Slide 10

Slide 10 text

©primeNumber Inc. あれ、フロントエンドって 全然テスト書かれてなくね? 10

Slide 11

Slide 11 text

©primeNumber Inc. 11 ● 現状ではサーバーサイド/クラウドインフラが得意なエンジニアが どちらかというと多い組織 ○ かくいう私も専門ではない ● サービスの特性としても、データ処理の部分がクリティカルであ り、フロントエンドは二の次になりやすい ● とはいえ、お客様が直接触る箇所 ● フロントエンド起因の不具合も当然ある 背景

Slide 12

Slide 12 text

©primeNumber Inc. CTO鈴木 「このPJTが成功したらどんなタイトルで 発表するかから決めましょう」 12

Slide 13

Slide 13 text

©primeNumber Inc. 13 ● PJTメンバーだけでテストを拡充していってもいいが… ● 至極当たり前のこのサイクルを皆がフロントエンドでもできるように ● 「0 -> 1でフロントエンドのテストを書く文化を作った話」 ● 最近流行ってるから「FrontendTestEnabling」PJTに改名 ○ 乗るしかない 背景 既存のrspecがコケる 新機能実装 テスト/実装を修正

Slide 14

Slide 14 text

©primeNumber Inc. イネーブリング やっていき! 14

Slide 15

Slide 15 text

©primeNumber Inc. 15 ● ところで、フロントエンドのテストって何を書けばいいの? ○ 条件に応じてコンポーネントが表示/非表示されるか? ○ フォーム周りの挙動? ○ APIリクエスト? ○ VisualRegression? ○ etc…(巷には綺麗なサンプルが溢れているが…) ● 原点に立ち戻る 方針 Q: 手っ取り早く皆がテストに触れるには?

Slide 16

Slide 16 text

©primeNumber Inc. A: テストを落とす 16

Slide 17

Slide 17 text

©primeNumber Inc. 17 ● 何か新しいフィールドを追加すると基本落ちる ● 落ちたままだとよからぬバグに繋がる可能性が高い ○ バリデーション表示のテストなどは見送った (後述)。最悪サーバーで弾かれるため ● このテストを各ページに60点レベルでひたすら追加 していく ○ 「0 -> 1でReact書くのは厳しいけど、ちょっ と修正するだけなら」といった人も多いので テストファイルがあることが重要 ● まずはPJTメンバーで書いたテストのPRを、PJT外 のメンバーにレビューアサインし、「こんな感じ ね」と知ってもらう 方針 フォームに値を入力 保存ボタンを押下 想定通りの HTTPリクエストボディ が送信されることを確認 ✅

Slide 18

Slide 18 text

©primeNumber Inc. 18 方針 コード例 ※ 簡略化してます

Slide 19

Slide 19 text

©primeNumber Inc. あとはやるだけ! … と思いきや 19

Slide 20

Slide 20 text

©primeNumber Inc. 20 ● データ転送の元/先が現在計100種類以上存在 し、それぞれに固有のフォームがある ● 人海戦術でやるにも流石に限度が… 問題① コネクター多すぎ問題 コネクター多すぎ問題 自動化したいよ〜

Slide 21

Slide 21 text

©primeNumber Inc. TSコンパイラを使ってみる 21

Slide 22

Slide 22 text

©primeNumber Inc. 22 ● TSコンパイラAPIに各フォームのファイルを渡してASTに変換 ● どのようなフィールドがフォームに存在するか、自動で抽出できる ○ それでも足りない情報は自サービスをスクレイピングという荒技 ● それを元にテストファイルを自動生成して手直し ● まだ書ききれていないが、約80/100コネクターほどは対応完了! 問題①

Slide 23

Slide 23 text

©primeNumber Inc. 23 ● 外部パッケージにESModuleが使われている場合の対策をあれこれしたら激遅になって しまった ○ ESModuleFirstなvitestへの乗り換え ○ 幸い、既存テストが少なかったので楽だった ● MonacoEditorなど特定のコンポーネントを使ってるページで激遅に ○ 最終的にテストでは生のtextareaなどにモックするように ○ 特定に時間がかかった(操作関係なく存在するだけで影響したため) ● それでもまだ厳しい ○ PJTメンバーのCI職人にチューニングしてもらう ○ (あんまりやりたくなかったが)余分なケースを減らす ■ 前述のバリデーションなど 問題② CI速度低下問題

Slide 24

Slide 24 text

©primeNumber Inc. 24 ● RTLは要素の取得にはa11yを考慮した方法を使いましょうという思想だが… ○ 現実はそんなに甘くない(海外のデータ系のSaaSを見てもdata-testid振ってい た) ○ react-hook-formを使っており、各種フィールドにはname属性が付与されている ことが多かったのでそれを利用 ○ 使ってない箇所は今回テストのためだけに属性を追加 ● z-index対策からか、モーダルのコンポーネントをReact.createPortalで階層外にレン ダーしていた ○ モーダル内にある要素の操作方法が他と異なる ● etc…(上げるとキリがないのでまたの機会に) 問題③ その他の諸問題

Slide 25

Slide 25 text

©primeNumber Inc. 25 ● 1週間のPRのうち、フロントエン ドのファイルに変更があるPRに テストが書かれているか ● trocco®(転送元GitHub)で取得 ○ 一部温もりのある手作業で フィルタリング ● 週によって母数がまちまちに… ○ 指標としては微妙だった ふりかえり

Slide 26

Slide 26 text

©primeNumber Inc. 26 ふりかえり Before After ● 特にテストファイル数が大幅に増加 ○ ケース数は意外とあったが、対象ファイルが16ファイルしかなかった ○ Reactコンポーネントのテストではなく、ほとんどがutil関数に対するテストだった

Slide 27

Slide 27 text

©primeNumber Inc. 27 ● jsパッケージのDependabotのマージが気軽にできるようになった ● テストを書いてたら既にあったバグを発見 ● テスト書いてくれる人が増えた ○ 何かしらテストを追加してくれた方が0ベースから10人超え ○ 業務委託など社外の方々も書いてくれている ○ 「来月ここら辺いじる予定だから、先にテストのPR出しておくわ〜」 とかも ● 来月からフロントエンドに限らないイネーブリングチームが正式に誕生 ふりかえり 良かったこと

Slide 28

Slide 28 text

©primeNumber Inc. 28 ● 成果を定量化するのが難しい ● まだまだ浸透しているとは言い難い ○ 実装自体が結構バラバラで抽象化しづらい ■ このページはこの書き方をしないと〜、とかがある ○ 落ちたときのエラーメッセージが非自明で分かりにくい ■ デバッグTipsドキュメント整備中 ● フォームの入力→APIリクエスト以外のテストケースの拡充もしたい ● そもそもプロダクトコードをリファクタリングしていきたい ○ テストがほとんどなかった時代に比べてハードルが下がった ふりかえり 反省点とこれから

Slide 29

Slide 29 text

©primeNumber Inc. 29 ● trocco®を一緒に創ってくれる方を探しています ○ エンジニアのドメイン知識が活かせるSaaS ■ 社内利用のドッグフーディングも活発 ○ 海外展開も進行中 ○ Hotなデータエンジニアリングの知識も身につくかも ● 色々なポジションで募集中です ○ ソフトウェアエンジニア ○ SRE ○ QAエンジニア ○ ソフトウェアエンジニア(イネーブリングチーム) ○ 詳しくはこちらから ■ https://herp.careers/v1/primenumber/requisition-groups/b258370f- bf7b-4358-9631-d53f51decef6 We Are Hiring!

Slide 30

Slide 30 text

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