ソフトウェア（Webアプリ開発）テストの種類

## ソフトウェア（Webアプリ開発）テストの種類と関係性

ソフトウェアのテストは、その種類が非常に多く、それぞれが異なる目的を持って実施されます。
ここでは、よく使われるテストの種類とその関係性について、できるだけ詳しく解説していきます。

### 注意点

ほぼ同じテスト内容を指していても**組織やプロジェクト、人によって呼び方が違ったりする**（ex 総合テストとST）
定義は抑えつつ、**自分の所属している組織のルールや発言者が意図している範囲を確認すること**が大事

## テストの種類と概要

### 1. 単体テスト (UT：Unit Test)

- 目的: プログラムの最小単位（関数、メソッドなど）が意図したとおりに動作するかを検証します

- 特徴: 開発者が行うことが多く、自動化ツールが活用されます

### 2. 結合テスト (Integration Test)

- 目的: 複数のモジュールやコンポーネントを結合し、それらが相互に連携して動作するかを検証します

- 種類:
    - **内部結合テスト (ITA)**: システム内部のモジュール間の結合を検証します
    - **外部結合テスト (ITB)**: システムと外部システム（外部API、決済システム、SNS認証など）との結合を検証します

- 特徴:「**統合テスト**」と言うケースもある

### 3. システムテスト (ST：System Test)

- 目的: システム全体が、要求仕様を満たし、意図したとおりに動作するかを検証します

- 特徴:
    - 結合テストが完了した後に実施される
    - 機能テスト、性能テスト、セキュリティテストなどを含む
    - 「**総合テスト**」というケースもある

### 4. 受入テスト (Acceptance Test)

- 目的: システムが、ユーザーの要求を満たし、運用に耐えられるかを検証します

- 種類:
    - **ユーザー受入テスト（UAT: User Acceptance Test）**：実際のユーザーが使用感や機能を確認します
    - **運用受入テスト（OAT: Operational Acceptance Test）**：運用面での準備が整っているかを確認します

### 5. その他のテスト

- **スモークテスト**: システムの「主要な機能」が動作することを簡単に確認するテスト
    - 「煙が出ない」という意味で、このテストで問題がなければ、本格的なテストに進めるというイメージから名付けられました
    - リリース可能な状態かどうかの初期確認
    - 細かくは確認しない
    - STやUATの前に実施されることが多い

- **回帰テスト（リグレッションテスト）**: システムに変更を加えた後、既存の機能が壊れていないこと（デグレがないこと）を確認するテスト
    - ソフトウェア開発のライフサイクル全体を通して行われる（CI/CDの中など）
        - リリース前
        - バグ修正後
        - 機能追加後

- **性能テスト**: システムが、所定の負荷のもとで性能を発揮できるかを検証するテスト
    - システム全体が負荷に対して耐えられるかを確認するため、システムテスト（ST）に含まれることが多い
    - 主な種類：
        - a) 負荷テスト：通常の負荷下でのシステムの動作を確認
        - b) ストレステスト：極端な負荷下でのシステムの限界を測定
        - c) スケーラビリティテスト：負荷の増加に対するシステムの対応能力を評価
        - d) エンデュランステスト：長時間の連続使用下でのシステムの安定性を確認

- **セキュリティテスト**: システムが、不正アクセスや情報漏洩に対して安全であるかを検証するテスト
    - システム全体の安全性を確保するため、システムテスト（ST）に含まれることが多い
        - 脆弱性の発見: システムにセキュリティホールがないか、既知の脆弱性（CVEなど）が含まれていないかなどを調べます
        - 侵入経路の特定: 攻撃者がシステムに侵入する可能性のある経路を特定します
        - リスク評価: 発見された脆弱性の危険度を評価し、優先順位付けを行います

- **ユーザビリティテスト**: システムが、ユーザーにとって使いやすいかを検証するテスト
    - ユーザー受け入れテスト（UAT）に含まれることが多い

- **シナリオテスト**: ユーザーが実際にシステムを使用する具体的なシナリオに基づいて、システムが期待通りに動作するかを確認するテスト
    - ex ユーザーが商品を検索して購入する一連の操作が問題なく行えるか
    - ユーザー受け入れテスト（UAT）やシステムテスト（ST）の一環として行われることが多い

## テストの順番

一般的に、**単体テスト → 結合テスト → システムテスト → 受入テスト**の順で実施されます。
ただし、開発手法によって順序は異なることもあります。

## ITaとITbの「内部」と「外部」って何？

- 内部：開発中のシステムやアプリケーション自体を指します

- 外部：開発中のシステムの外にある、他のシステムやサービスを指します

### ITBの具体例：

- 例1：オンラインショッピングアプリ
    - 内部：ショッピングアプリ自体
    - 外部：決済サービス（PayPalなど）テスト内容：アプリから決済サービスへの連携が正しく機能するか確認

- 例2：天気予報アプリ
    - 内部：天気予報アプリ自体
    - 外部：気象データ提供サービスのAPIテスト内容：アプリが外部APIから正しくデータを取得し、表示できるか確認

- 例3：SNSアプリ
    - 内部：SNSアプリ自体
    - 外部：プッシュ通知サービステスト内容：アプリがプッシュ通知を正しく送信できるか確認

## STとUATの違い

ST（システムテスト）とUAT（ユーザー受け入れテスト）は、**どちらもソフトウェア開発の最終段階**で行われるテストですが、**目的や実施主体が異なります**。
それぞれの違いを具体的に見ていきましょう。

STは、システムが**技術的に完成していることを確認**するテストであり、
UATは、システムが**ユーザーの要求を満たしていることを確認**するテストです。
STが合格した後にUATが行われ、両方のテストに合格することで、システムがリリースされます。

### ST（システムテスト）

- 目的: 開発されたシステム全体が、設計どおりに正しく機能するかを検証します

- 実施主体: 開発チームやテスト担当者が実施します

- テスト内容:
    - 機能テスト: すべての機能が仕様通りに動作するかを確認します
    - 性能テスト: システムが、想定される負荷に耐えられるかを確認します
    - セキュリティテスト: システムが、不正アクセスや情報漏洩に対して安全であるかを確認します
    - 互換性テスト: 他のシステムとの連携が問題なく動作するかを確認します
    - 信頼性テスト: システムが安定して動作し続けるかを確認します
- テスト環境: 本番環境と同じか、それに近い環境で実施されます

### UAT（ユーザー受け入れテスト）

- 目的: 開発されたシステムが、実際のユーザーのニーズを満たし、業務に利用できるかを検証します
- 実施主体: 実際のシステムのユーザー（エンドユーザー）が実施します
- テスト内容:
    - 使いやすさ: システムが直感的で使いやすいかを確認します
    - 業務への適合性: システムが、実際の業務にスムーズに組み込めるかを確認します
    - 期待通りの結果が得られるか: システムが、ユーザーの期待する結果を出せるかを確認します

- テスト環境: 本番環境と同じか、それに近い環境で実施されます

### STとUATの違いをまとめた表

![1726621912-lqLibHt84OpBcdVwNnFA1jIR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453697/a0d1ee43-eb64-4cec-1d0d-3ed2b2d6f4bc.jpeg)



## まとめ

ソフトウェアテストの種類は、テストの目的や対象によって多岐にわたります！
これらのテストを組み合わせることで、高品質なソフトウェアを開発することができます！