はじめに
第1章 なぜテストを書くのか?
この章ではテストに関わる基本的な用語や考え方を紹介します。ここでテストに関する全体感を知ることで、あなたが担当しているプロジェクトでどのようなテストが必要なのか、何からはじめればいいのかをご自身で判断できるようになることができます。
1.1 テストがないと何が問題なのか?
テストの役割を紹介します。最初に思いつくものとしては「プログラムの動作を確認する・保証する」ことが考えられます。しかしテストを書くことの理由はそれだけではありません。例となる状況を過程し、テストを書く目的やメリットを紹介します。
1.2 何をテストするのか、どのくらいテストすればいいのか? - Testing PyramidとTesting Trophy
テストの手法として、代表的なものとして「ユニットテスト」、「インテグレーションテスト」、「エンドツーエンドテスト」が挙げられます。これらのテストの役割の違いとそれぞれのテストのコスト(作業量)についても説明します。それぞれのテストで導入する際のコストが異なります、そのため「Testing Pyramid」と「Testing Trophy」フレームワークを紹介します。どれくらいテストをするかについて「カバレッジ」を一つの基準として採用する場合があります。しかしカバレッジを気にするあまりテストが複雑になる、テストの作成に時間がかかるなどの問題もあります。そのためカバレッジをどう扱うかについても紹介します。
1.3 どうやってテストを始めればいいのか?
プロジェクトの状況やプロジェクトの種類によって、どのようなテストから導入すればいいのか異なります。例えば、これからプロジェクトを開発する場合は「ユニットテスト」から、既存プロダクトがすでに運用されいてる場合、「インテグレーション」もしくは「エンドツーエンドテスト」を導入するなど、プロジェクトの状況によってはじめに導入するテストが異なります。また、そもそもテストを導入できる下地があるかどうかも重要です。テストを導入したが、チームメンバー間でテストに対する認識が異なる、テストの粒度がことなる、テストが実行されていないコードがdefaultブランチに直接pushされているなど、さまざまな問題によってテストが活用されない場合もあります。そのため、プロジェクトの状況を踏まえ、どうやってテストを導入するかのステップを紹介します。
第2章 Jest入門
Jestの基本的な構文をTypeScriptを利用して紹介します。JestやTypeScriptのセットアップを1から行うため、はじめてJestやTypeScriptを利用する場合でも進めることができます。今回TypeScriptを利用するため、型が導入されます。型を導入することのメリットについても確認します。また、E2Eテスト実践例を追加したことにより、DBを利用する場合の初期化やより実践に近い形式でのE2Eテストを行います。
- 2.1 Jestとは?
- 2.2 TypeScriptとは?
- 2.3 セットアップとはじめてのテスト
- 2.4 テストのグループとテストの前後処理
- 2.5 テストの実行方法
- 2.6 テスト結果の評価(アサーション:Matcherマッチャー)
- 2.7 モックを利用したテスト
- 2.8 UIテスト
- 2.9 E2E(エンドツーエンド)テスト
- 2.10 実践例
第3章 リファクタリングとテストの改善
実際にテストを導入する段階で既存のコードをリファクタリングする機会が出てきます。またせっかく導入したテスト自体に問題があるケースもあります。いくつかの例を通じてコードのリファクタリングやテストの改善を紹介します。
- 3.1 関数外の変数の参照
- 3.2 関数の共通化
- 3.3 テストケースが曖昧
- 3.4 過剰なアサーション
- 3.5 過剰なMock
- 3.6 Unhandled Rejectionsで失敗したテストがPassしている
第4章 テストを開発フローの一部へ
テストを導入しただけでは、テストの実行やテスト結果の共有は開発者の判断に委ねられた状態となるため、適切に運用されない場合があります。テストが開発フローの一部として活用されることではじめて、プロジェクトの改善に活かすことができます。この章ではテストではカバーできていない部分を評価する静的解析ツールの紹介やCIツールの導入を紹介します。
- 4.1 Githubフローの導入
- 4.2 静的解析ツール(EsLint, Prettier, カバレッジ)の導入
- 4.3 CIツールを導入しテストを自動化
おわりに