フロントのテスト戦略!の知見が集まるところ
なぜテスト戦略を策定したいのか
目的・課題感
- フロントのテストはROIが読みづらいと思っている
- バックエンドとかのユニットテストは動作確認の手軽な方法としても効果わかりやすいから、とりあえず全部ちゃんと書いておきましょうとやりやすいが、フロントはブラウザでサクッと見られるのと、見た目に関する assertion がプログラミングではむずいので難しい
- なのでテストの粒度が個人の感覚ベースになってしまう。それはそれで正しい姿というかそうするしかないものかもしれないが、一度決まった指標みたいなのが言語化できないかを試みたい
成果物の定義
-
フロントエンドのベーシックな知識を持っているエンジニアが、自分が業務をしていく上で「ここはこういうテストを書いておかないとな」と迷いなく判断ができること。
-
フロントエンドのベーシックな知識のイメージ
- コンポーネントベースでアプリケーション組んだことがある
- 単体テストや Visual Regression Test の How についてはそんなに困ってない
あとテストできないのは単純にテストの書き方知らんだけみたいな話もありそうなので、めっちゃ詳細に色んなパターンのテストの書き方を集めるみたいなのも成果物の一つにはなるかも
バグはどんな時に起きるか
まずフロントエンドを作っていく上で起きるバグにどんなものがあるか分類を試みてみる
- 考慮できなかった状態 → これはバグではないか
- ある状態の時の表示をそもそも実装していない(empty, loading忘れたとか)
- 考慮しきれなかった状態の組み合わせ
- 副作用で不正な状態が作られてしまう
- mutable な操作をしてしまう
- Viewが変
- コンポーネントをアップデートしたら、他の場所でデザインが崩れてしまった
- モーダル消し忘れて
フロントエンドのバグ = 不正な状態を産んでしまうこと & 見た目のデグレを指すのではなかろうか。
ここからざっくり次のあたりが求めているものなんじゃないかという気がする
- ロジックがある・まあまあ複雑なコンポーネント、hooks、state を変換するところ(redux 使っているなら reducer とか)の単体テスト
- 見た目のデグレ検知 - Visual Regression Test
- ここでいう "見た目" は DOM としての表現とかではなく、実際にブラウザに描画されたときの見た目なので、コンポーネントのユニットテストとかスナップショットテストは違う気がしてる
- コンポーネント単体というよりは実際の画面上で動かした時が求めているところだから、E2Eを回すついでとかがベストか?
不正な状態を産んでしまうことを防ぐためのテスト
-
mutable な操作をなくす → テスト以前の話
- 昔オブジェクトを参照渡ししてそれを直接いじっていた。表示のためにオブジェクトをいじってしまい、それが状態としての表現からズレてバグを多発させてしまった
- 状態の操作を全て immutable にすることによって
-
コンポーネントの単体テスト
- 想定される状態全ての掛け合わせでのテスト
-
アクションを引数に状態を変える関数のテスト
-
どんな時に状態が変わるか
- Form
- mutation、APIに write 系のリクエストを行う
- ページ遷移をする
- lifecycleのテスト
- → 表示のために必要なデータを取るアクションをdispatchするくらいだから得られる安心感は低い
-
状態とは何か
- 外部のState
Howの話
jest
- GitHub - facebook/jest: Delightful JavaScript Testing.
- テストランナー
- コマンドでテストを走らせたり
- describe, it などの関数でテストケースを管理しやすくしたり、エラーがどこにあるか分かりやすくしたり
- setup, teardown → afterAll, afterEach, before とか
- expect などでテストの結果を判定するための utility を提供したりする(assertion)
- Mock
- snapshot
テストの難易度
- インタラクションの難易度
- フォームの入力やクリックは簡単
- スクロール、d&d とかは難しい → 手動で諦めるポイント
Visual Regression
Storybook とかと組み合わせるパティーンと E2E と組み合わせるパターンがありそうな
-
reg-suit
https://github.com/reg-viz/reg-suit -
Percy
https://percy.io/
E2E
-
Cypress
https://www.cypress.io/ -
Selenium
- 個人的にあまりいい思い出がないけど大御所
-
Autify
- 有料。個人で気軽に試す感じではない
- https://autify.com/ja
知見集。
他の会社さんがどうやってやっているのか集めたい
Kent C.Dodds
JS テスト界の大御所。Testing Trophy の提唱者
テスト関連の記事のリスト
Snapshot は Assertion と捉える
「何をテストしたらいいか」というドンピシャなタイトル
- テストの目的
- We write tests to be confident that our application will work when the user uses them
- Think less about the code you are testing and more about the use cases that code supports.
- どこが壊れたらビビるかを考える。優先度をつけてテストを書き始める
- What part of this app would make me most upset if it were broken?
- What would be the worst thing to break in this app?
- 優先度をつけられたら E2E から書き始めるのがオススメ
- E2Eではカバーしきれない(E2Eでカバーするのが割りに合わない)ものが出てきたら integration test を jest 使って書いていく
Vue に限らずフロントエンドのテストで何が effective かの知見がいろいろ
課金したら見れるJS testのコース。戦略というよりは How の話が多め
自分の過去ログ
意味のある単体テストと integration テストの書き方が分かりやすし
ロジックを持った単一モジュールにはユニットテストを書き、それ以外の機能仕様についてはインテグレーションテストでカバーする
こんな気持ちになってきた