テスト
作成日時:2024-08-01以前
更新日時:2024-08-29
定義
- 単体:クラス/モジュール単位で、xUnit的に検証
- 結合:複数モジュールの検証。BDD
- E2E:≒UIテスト。実際にユーザが扱うかのように。シナリオ。
単体と結合の分類は曖昧。現場による。
品質保証できていればなんでもいい。
モック使わずに上位モジュールを呼んで、下位モジュールの網羅をするとか。
いつものは1画面を単一コンポーネントと捉えて試験する = 単体試験なんだろうなと
「別画面の操作が別画面で出る内容に反映されていること」はE2Eっぽい。結合試験と言われたけど。
単体テスト
- ブラックボックス
- 同値分割
- 境界値
- 状態遷移
- デシジョンテーブル
- 組み合わせ
- pair-wise法
- ホワイトボックス
- C0
- C1
- C2
- MCC
自動化
- アイスクリームコーン
- ピラミッド
- トロフィー
E2Eの量が多くなるのはデメリット。
主に実行速度とコードのメンテ。
自動テストが無い現場ではまずE2Eを作成。
その状態だとE2E塗れになる。
徐々に単体テストに移行し、E2EはE2Eでしか検知できない試験のみを行う。
自動テストが無いならば
まず手動テストをE2Eテストに置き換える。
E2Eテストならソースがぐちゃぐちゃでも書けるから。
E2Eレベルで振る舞いが変更されていないことを確認しつつ、リファクタリング。
テストコードが書きやすい構造になったら、xUnitを書く。
E2EとxUnitで重複するものがあるならば、E2Eを削っていく。
E2EはあくまでE2Eでしか検知できないテストケースのみを実施すべき。
そうしてテストピラミッドを作る。
参考文献:テスト自動化実践ガイド
テスト手法
スナップショットテスト
UIが変更されていないかを確認する。
スナップショット(UIの構造情報、DOMやJSON)を比較する。
コンポーネント単位。
ビジュアルレグレッションテスト(VRT)
UIが変更されていないかを確認する。
スクリーンショットを比較する。
画面単位。
スナップショットテストとVRTの違い
前者は構造の比較。
後者は見た目の比較。
ステートテスト
テスト対象のコードが正しい結果を返すかどうかを確認すること。
ステートテスト VS インタラクションテスト|くぼぴー
インタラクションテスト
テスト対象のコードが特定のメソッドを正しく呼び出すかどうかを検証すること。
※ステートテストのリンクを参照。
スモークテスト
探索的テスト
ハッピーパステスト
モンキーテスト
負荷テスト
セキュリティテスト
- SAST
- DAST
- IAST
フロント
- アサーションテスト
- 対象の要素が指定した状態であるかを確認。書いたassertしか確認してくれない。
- スナップショットテスト
- 対象のDOMを取得して、前回の結果と比較。壊れやすい。
- ビジュアルレグレッションテスト
- スナップショットテストのスクショ版。
シフトレフトの考え方
V字モデルの左側でもテスト(レビュー)する。
顧客に画面のプロトタイプを渡すとか。
→受け入れ時の手戻りを防ぐ。
Wモデル(だぶりゅーもでる):情報システム用語事典 - ITmedia エンタープライズ
privateメソッドへのテスト
プライベートメソッドのテストは書かないもの? - t-wadaのブログ
privateなメソッドは実装の詳細なのでテストすべきでは無い。
そのようなメソッドをテストしたい場合はクラスが責務を持ち過ぎているので分離すべき。
ケント・ベックの答え。
Should I Test Private Methods?
コンポーネントテスト
コンポーネントテストの手法と その効果を考える - Speaker Deck
vitestは動作環境を色々なものに切り替えられるらしい(p.19)
Playwrightとかも。
JUnitメモ
okhttp
jsonpath
@DisplayName