2023/04/25 フロントエンドのテスト設計とアーキテクチャ
#QA
from: モダンなテストレベル設計(ユニットテスト~システムテスト等をどう設計するか)の原則
koushisa.iconのフロントエンドのテスト設計とアーキテクチャについてのメモ書き
関連
フロントエンドでAIと協働する#640e7fa98660300000f640e6
テスト設計はユーザーとシステムにとって意味のある振る舞いを主体にしたい
E2Eテストやa11y観点を増やしたい
ドメインイベント(Domain Event )をテストしたい
インフラ周りの基盤や実行環境整備、コケたテスト対応など管理コストが高く断念することが多い
仕様定義もテストケースの運用と二重管理対策など織り込まないとうまく回らない
探索的テスト
本質的にステートフルなGUIのテストケースを事前に網羅するのは難しい
組合わせ爆発
バグ修正は環境づくりが80%
バグは正常に動いている2つの機能の狭間に発生する
ミスをカバー出来たら一人前は前世紀の考え方
基本的に失敗を前提とする上でリグレッション管理していく
開発者視点で「自身の担当する責任範囲」が問題空間の境界上で意図通り振る舞うかのテストも書きたい
E2Eテストのみでは管理コストが高く網羅率(カバレッジ)も微妙
コンポーネントのテストはわりと不毛でリファクタリング耐性が低い
実装もある程度意識しないといけない
テストのためのContainer/Presenterパターンとかも目的置換が発生しやすく意義を見出すのが難しい
ロジックはhooksへ移動したとはいえhooksのテストはモックで自作自演になりがち
状況によってプレゼンテーションだけを切り離すとかはやるが、テスト目的で毎回やるわけではない
この辺が辛くてEnzymeとかはtesting-libraryへ置き換えられつつある
書くとしたらhooksの内部でカプセル化する際に利用する純粋関数の単体テストぐらい?
setterとかReducerは漸化式にできるのでテストしやすい
本当に意味のあるテストになっているかは疑問視している
ユーザーにとって意味のある振る舞いのテストになっているか?
その関数はコンポーネントに依存していないか?
そもそも設計の単位がデザイン上の問題空間の分割に依存する
デザインと密結合なのでチームとして動く際にオーナーシップの問題が出てくる
正直ここが一番の変数
一つずつ方針を立てていく必要がある
自身が改修してコケたテストは本当に意味のあるテストになっているか?
必要性を見いだせないテストは生産性を下げる
チームの共通認識が持てなければメンテしなくなるので捨てられる
例えば
「このテスト、こういう風に実装をリファクタリングしたら消せそう」
「このテスト、こういう風にデザインを変えたら不要になりそう」
「あ、デザイン変えたら機能的にも実装的にもシンプルになりそう」
フロントエンドで顕在化する問題のほとんどは、フロントエンドの外にある
BIZ Team, Design Team, DB設計, API設計...巻き込まねばならないステークホルダは多い
現実の中大規模開発ではマイクロフロントエンドとかでもしない限り境界づけられたコンテキストは作れない
他、本質的なフロントエンドの複雑性もある
分業が進みすぎた大組織だと、部門の壁を越えられずにアイデアが出ない
過剰な分業によるオーナーシップ欠如
なぜゲーム作りをまるごと理解できる人が増えないのか?
など考えてる間に、変数が多くて沼にハマる
learningテストという意味であれば書いてもよさそう
仕様を学ぶためだったり、TDD的にフィードバックを得るための後から捨てても良いテスト
Finite State Machine(FSM),Model-based testing, Property-based testing
主張
ロジックを可視化してコラボレーションしようぜ!
関数のパラメータの敷居値を自動生成しようぜ!
世界観は分かるが、学習ハードルが高い
DSL的というか
最初は綺麗に見えても、運用したり、締め切り駆動開発になった時に分析と設計の乖離が発生するのが目に見えてる
現実世界はTODOアプリを一番綺麗に書けるコンテストではない
Statelyが進化して良い感じに書けるようになるのを待ってる
形式手法的な路線で次世代AIとの協働にはマッチしそう
ValidationもAIが担う
AIをソフトウェア開発へ取り込む際のテストにLLMsを活用する可能性に想いを馳せる
以前のツイート
@koushisa: Chakra UIのFigPilotとZagはよく考えるとAIフレンドリーだな
@koushisa: FigPilot: Figma to Chakra UI
Zag: a11yに配慮したUIのFinite State Machine
Figmaからアクセシブルなコンポーネントが出力できて、かつ状態遷移が静的解析できる基盤になる可能性を秘めている
@koushisa: ここまでくればtesting libraryとStorybookのスケルトンを出力できるはずで、UI開発はFigmaからポチポチすればよくなる
@koushisa: UIの実装は任せてしまって、開発者はSpec定義とtesting libraryでその振る舞いを担保するのが主な仕事になる
このページを書いたときのツイート
@koushisa: うーん、フロントエンドのテストの理想を追求してくとやっぱ形式手法に辿り着くな...これ現代も研究されてるのかな?運用するにはツールが整ってないように感じる
https://t.co/v647Jk4Kke
@koushisa: Generative AIのアウトプットから理想に近いのを選ぶように形式手法もpromptで生成して「機械で大枠を生成して人間が選ぶ」だとチャンスはある。ただし仕様変更や差分管理はまだ難しそう。
@koushisa: そう言えばChakra UIがUIの描画と状態をframework-agnosticにしようとしてたな、政治力高いので静的解析方面で発展するのに期待
https://t.co/RellZwoj4P
→割と堅実に進んでいる
→The future of Chakra UIへ動向をまとめた
2023/10/20
Vercelは最近はshadcn/uiがお気に入りのよう
フロントエンドでテストやアーキテクチャに拘りすぎるのは微妙
( ちゃぶ台返し)
現時点で理想を追求するにはツールやフレームワークが追いついていない
実行環境、モック、振る舞いごとテストケース定義とその管理コストが高い
ユーザーのモチベーションと現状仕様を理解して、機能徹底的にシンプルにするよう働きかけるほうがROIは高い
フロントエンドの価値とは
フロントエンドでガチガチなテストが必要な機能は本当にユーザーにとって使いやすいUI/UXなのか?
複雑GUIなら確かにテストは必要そう。WYSIWYGエディタとか。
自分の関心はここにある。E2E寄りのテストを増やすためにはシンプルな機能を目指さねばならない
アプリケーション層が十分にシンプルであるのでE2Eテストで補なえる
治療的哲学っぽい
デザインとデータ構造とそのつながりに目を向ける。状態を減らしたい
情報設計の領域かも
UIデザイナーのスキルとOOUI観点の構造設計
無駄を削ぎ落とすことはステークホルダ全方位にメリットしかない
SPAでのレイヤードアーキテクチャの考察と不確実性へのマインドセット
interaction test
E2Eテストと結合テストの中間となるinteraction test
koushisa.iconの理想が詰まっていて、ちょうどいい塩梅
Storybook上で何がテストされてるか可視化されるのも嬉しい
網羅率(カバレッジ)も出せる
mswも使える
PolicyなどServer Stateに依存するテスト自己完結できる
ここに賭ける価値はある
E2EテストのSaaSの台頭
Autify, mabl
気になる
試してみたい
エンジニアからしたら、
「入れない理由がない」レベル
ユーザーから見た振る舞いのテストケースというのは、それだけで無形資産になる
リグレッション管理できるだけでも十分ありがたい
最大の難点はコストとビジネスサイドの理解
費用対効果が説明できないものに投資はできない
一定の学習ハードルがある
以下のような仕組みで、まず作る/試すを実践しつつビジネスを開発プロセスに巻き込む気概が必要
知識の差、考え方や文化の違いはあるので茨の道である
事業組織全体で取り組むドメインモデリングのすすめ
スタートアップでのmabl導入事例とリーディングテクニック
関連
良いプロセスとは
アーキテクチャレベルの高凝集
単方向データフロー(unidirectional data flow)での状態遷移は絶対やる
それ以外の細かい部分はデザインの戦略に適した戦術を使う
JSの this. はコンパイラや静的解析に易しくない
GUIのデータアーキテクチャと状態管理の変遷
宣言的UIのデータアーキテクチャはコンポーネントを中心に考える
App Routerがどうなるかわからないけど期待している
マイクロフロントエンドとキャッシュを前提としたCQSアーキテクチャを考えるとかはそれっぽい