テストをするということ

2024/09/27に公開

今回は会社の勉強会で使ったMarpをそのまま持ってきました!


テストをするということ

~自動化に向けての第一歩~


目次

  1. テストの種類
  2. テストの目的
  3. テストの分量
  4. テストを支えるアプローチ
  5. 自動化しやすいテストの特徴
  6. テストの自動化

1. テストの種類

  • 単体テスト
  • 結合テスト
  • E2Eテスト(受け入れテスト)
  • パフォーマンステスト
  • セキュリティテスト
  • ユーザビリティテスト
  • etc......

<!-- テストには非常に豊富な種類がある。
その大部分が繰り返し実施する必要のあるもの。
自動化したほうが効率的である。
自動化出来ないテストももちろん存在する。
-->


2. テストの目的

  • 品質の向上
  • バグの早期発見
  • リファクタリングの安全性確保
  • ドキュメントの代替
  • etc......

信頼性の高い実行結果に短い時間で到達する状態を保つことで、
開発者に根拠ある自信を与え、
ソフトウェアの成長を持続可能にすること

by 和田卓人

速度と品質はトレードオフではない
品質が高いほど速度も上がる。


3. テストの分量

3.1 テストピラミッドとアイスクリームコーン(by T.Wada)


3.2 結局どのくらいのカバレッジが良いの?

  • 100%を目指すのは難しい。
  • なぜなら、100%を目指そうとするとSystem.out.println()などの
    コードもテストする必要が出てくるから。
  • ただし、ビジネスロジックに関しては100%を目指すことが望ましい。
  • 全体で60~80%程度を目指すのが現実的だと言われている。


4. テストを支えるアプローチ

1. TDD(テスト駆動開発)

  • 言わずと知れたKent Beckの提唱する開発手法。
  • テストを先に書くことで、設計を促進する。
  • テストが通る状態をキープし続けることで、品質を保つ。

テスト駆動開発(著: Kent Beck,訳:和田卓人)(Amazon)


2. BDD(振る舞い駆動開発)

  • テストコード、ではなくテストケースから書き始める。
  • テストケースからテストコードに落とし込み、振る舞いを保証する。
  • テストケースはビジネス要件を表現するため、
    非エンジニアとのコミュニケーションにも有効。
  • Gherkinなどの記述方法がある。

3. ATDD(受け入れテスト駆動開発)

  • ユーザーストーリーを元にテストケースを書く。
  • テストケースを元に開発を進める。
  • ユーザーストーリーを満たすことを保証する。
  • BDDとの違いは、ユーザーストーリーを元にするか、ビジネス要件を元にするか。

<!--
BDDもATDDも結局はテスト駆動開発の発展型である。
スピーディーかつ品質の高いものをつくるための工夫がなされている。
うちのチームはどうだろうか? 受け入れテスト駆動開発っぽいが、本当にそうだろうか?
-->


5. 自動化しやすいテストの特徴

設計時点で疎結合・単一責任が実現されていることが重要。

機能と依存が少なければ少ないほどテストし易い。


1. DDD(ドメイン駆動開発)

  • Eric Evansの著書「ドメイン駆動設計」に基づく。
  • ビジネスロジックを中心に設計する。
  • 外部との接点を最小限に抑える。
  • 「中核の事業領域」を中心に設計し、「区切られた文脈」によって分離する。
    開発者や非エンジニアとのコミュニケーションを円滑にするために
    「同じ言葉」を共有する。
    (原著ではそれぞれ「ドメイン」「コンテキスト」と「ユビキタス言語」)

ドメイン駆動設計をはじめよう(Amazon)


2. ヘキサゴナルアーキテクチャ

  • オブジェクト指向型の設計アプローチ。
  • ドメインロジックを中心に設計する。
  • 外側にはUIやDBなどの外部要素を配置する。

3. Container/Presentationalパターン

  • Reactのコンポーネント設計パターン。
  • Containerでロジックを持ち、PresentationalでUIを持つ。
  • Presentationalは疎結合であるため、テストしやすい。
  • Containerはロジックを持つため、テストが必要。
    ただしPresentationalをモックすることでテストしやすくなる。

4. Custom hooks

  • 前述のContainer/PresentationalパターンをReact Hooksで実現したもの。
  • Container/Presentationalより更に疎結合になり、モックせずにテストも可能。

フロントエンド開発のためのテスト入門<br>今からでも知っておきたい自動テスト戦略の必須知識(Amazon)


6. テストの自動化

色々なテストツールがあるが、ここでは主要なものを紹介する。

  1. Jest
  2. React Testing Library
  3. JUnit
  4. Mockito
  5. Test Containers <- イチオシ!
  6. Playwright


7. まとめ

  • テストは開発の一部であり、品質を保つために必要不可欠なものである。
  • 自動化されたテストは開発速度と品質のどちらにも貢献する。
  • テストを書く際には、設計時点で疎結合・単一責任が実現されていることが重要。
  • テストを書く際には、テスト駆動開発やドメイン駆動開発などの
    設計手法を取り入れることが望ましい。

我々の仕事は機能を開発することではない。
顧客に価値を提供することである。

Discussion