フロントエンドのTDD作業 / 調査ログ
Kent C. Dodds 氏が提唱する「Testing Trophy」という概念について
Testing Libraryの開発者Kent C. Dodds氏
参照:https://testingjavascript.com/
- E2E
- Integration
- Unit
- Static
のそれぞれのテストにはトレードオフがあり、図の上側に記載されているテストほど工数が必要だが正しい動作の保証が大きい事を表している。
また、それぞれの体積が大きいテストほど多く書くべきとされている。
Testing Trophyの概念に従ったテストの方針
参考: https://qiita.com/naoking99/items/3fd211deb8711fae8204
1.実装の詳細をテストしない
リファクタリングはユーザーに対する振る舞いを変えずに実装の詳細(ユーザーから見えないもの)だけを変更する。
リファクタリングの際に実装の詳細をテストし、見た目は期待通りの動きをしている。しかし、テストが間違ってエラーを出してしまうことをしまうことがあり「壊れやすいテスト」になってしまう。
以下ポイントを参考記事より抜粋
・「ユーザーから見えるもの」という視点でテストする。
・「ユーザーから見えないもの」はテストしない。
・ テストで直接Component内のStateやメソッドをいじらない。
・ ユニットテストではなく、インテグレーションテストを最も書くようにする。
・ EnzymeのShallow Renderingは使わないようにする。
・ Snapshotテストをむやみに使わない。
2.外部システムに依存するテストはしない
外部システムと連動する部分はモックで置き換える。呼び出し回数と呼び出し時の引数をテストする。
3.モックはできるかぎり少なく
モックはあくまでもモック。システムが正しく動作する保証レベルが下がるので、モックの利用は「外部システムに依存する部分」など限定的に使用する。
4.コードカバレッジよりユースケースカバレッジを意識する
システムが正しく動作する保証レベルを上げる為にユースケースをテストでカバーすることこそが重要。
テスティングフレームワークのJestとCypressで「describe, it, expect」等の名前空間が競合して
Property 'toBe' does not exist on type 'Assertion'.
の様なエラーが発生。tsconfig.json
とnode_modules
をe2e
ディレクトリに分けて保存。package.json
の依存関係を分離させてエラー解消。
JestとReact Testing Libraryの関係
JestとReact Testing Libraryは相互に依存している。
Jestがテストの大枠を担当していてReact Testing Libraryがそれを拡張しているイメージ。
TDDのサイクル
TDD Boot Camp 2020 Online のアーカイブ
- タスクを分解して解決すべき目標(テスト容易性が高いものから)を決める
- 目標を示すテストを書く
- テストを即実行して失敗させる
- 目標を達成する為のコードを書く(この時コードの質は気にしない)
- テストを成功させる為にコードを修正
- テストが通っている間リファクタリング繰り返す(時間決めてやるのが良い)
- 1~6を繰り返す
=さらに要約=
テスト書いてとりあえず動くコード書く → テスト成功確認 → コードを綺麗にする → テスト成功確認 → 綺麗にする… をある程度繰り返す感じ。
TDD参考記事
下記の2記事を参考にすれば概要は把握できる