はじめてのテスト
テスト
テストに関する重要な概念とかをメモしたい
DI
依存性注入
そもそもテスト系から生まれた言葉なのかどうか不明だが、オブジェクトや関数同士が依存していると当然テストしずらいから、依存関係は引数とかで外から入れましょう、っていうこと?そうすれば別々にテストしやすいし、モックとかも使いやすいやん、という
もともとはSOLID原則関連の話らしい
DIは制御の反転の一種で、オブジェクトの作成と利用について関心の分離を行い、疎結合なプログラムを実現することを目的としている。
DIをするとテスタブルになるものの、インスタンスの生成が面倒になる(new ObjectA(new ObjectB, new ObjectC)
みたいになる)。それを解決するためにDIフレームワークというものがあるらしい(バックエンドの話?)
Property Based Testing
Property Based Testing は、Haskell のライブラリ QuickCheck からはじまったテストスタイルで、定義された条件に合わせて自動生成された膨大な値に対してテストを行う手法です。
ランダムに値を生成しまくって、テストしまくる手法。
fast-checkというjsライブラリでいうと、標準で100回テスト、pre/filter/mapを使い生成値を調整してテストする。
対して、開発者が特定のシナリオやケースを考え、それに対する期待結果を定義する僕らが普通にイメージするテストはExample Based Testing。
たぶん、こういう時はバグる可能性があるかもなという具体的な値(Example)ベースでテストを考えるか、このPropertyはXXという条件のある整数値であるべきだ、みたいなあるべき姿を定義してランダムにテストするか、的な
パターン、ベストプラクティス
arrange-act-assertパターン
// Arrange(準備)
var guid = new Guid("01234567-89ab-cdef-0123-456789abcdef");
// Act(実行)
var actual = guid.ToString("D");
// Assert(検証)
Assert.AreEqual("01234567-89ab-cdef-0123-456789abcdef", actual);
テストの分類
粒度?フェーズ?による分類
- 単体テスト:モジュール単位
- 結合テスト:複数モジュール
- システムテスト:システム全体
- 受け入れテスト:顧客の受け入れテスト
実行方法?による分類
- 動的:実行してテスト。jest/playwrightとか
- 静的:実行せずテスト。静的コード解析とか。Linterとかtypescriptとか
技法?による分類
- ホワイトボックス:内部構造を理解してテスト
- ブラックボックス:内部構造分からずテスト
- グレーボックス:中間
テストの目的?による分類
- 機能テスト:ソフトウェアが仕様どおりに動作するかどうかを検証
- 非機能テスト:ソフトウェアの性能、安全性、セキュリティなどの品質を検証
テスト手法?
- スナップショットテスト
- リグレッションテスト
- ビジュアルリグレッションテスト
マーケティング文脈?
スナップショットテスト
DOM構造を変更前後で比較するテスト?画面スクショを撮る(→VRT)わけではない?
ビジュアルリグレッションテスト(VRT)
こっちは画像をとって比較する。スナップショットテストより正確だけど重い
そもそもリグレッションテスト
スモークテスト
storybookでスナップショットテストのスナップショットファイルを見てたらsmoke-test
と書いてあった
コンパイルやビルドのエラーは出なくなった後、できあがったソフトウェアが機能テストなどの本格的なテストを実施可能か判断するための予備的なテストという位置づけになります。
スモークテストという名称の語源は、電気工作の分野の通電テストにおいて、基板に電流を流して発煙の有無を確認したことに由来すると言われています。
サニティテストというのも出てきた。
みんな好き勝手テストを増やしてないか?笑
うーん、なんかいまいち具体性がないが、最低限動くのかどうかみたいなテスト?
テストの目的