[初心者向け]テストレベル - コンポーネントテスト

[徹底攻略 JSTQB Foundation教科書&問題集 シラバス2018対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-JSTQB-Foundation%E6%95%99%E7%A7%91%E6%9B%B8-%E5%95%8F%E9%A1%8C%E9%9B%86-%E3%82%B7%E3%83%A9%E3%83%90%E3%82%B92018%E5%AF%BE%E5%BF%9C/dp/4295017671/ref=asc_df_4295017671/?tag=jpgo-22&linkCode=df0&hvadid=654833321247&hvpos=&hvnetw=g&hvrand=7317531869461544354&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009293&hvtargid=pla-2199686852302&psc=1&mcid=140f9d5d8ea8321d9cdbe1b981b50a4c&th=1&psc=1)を勉強しているので、自分のメモとしてまとめています。第9弾。

# コンポーネントテストとは
コンポーネントテストは、**ユニットテスト**や**モジュールテスト**とも呼ばれる。
日本では、通常**単体テスト**とも呼ばれている。

# テストの目的
コンポーネントとは、独立してテストできる最小単位で、ソフトウェアの機能やモジュールに相当する。

コンポーネントテストは、コンポーネントの振る舞いが設計・仕様通りであるかを検証し、欠陥を検出し、品質を高めることが目的。統合テストやシステムテストなどの上位レベルのテストのコンポーネント内の欠陥を持ち込まず、リスクを低減することができる。

### コンポーネントテストの属性
<dl>
  <dt>テストの目的</dt>
  <dd>・コンポーネントごとの振る舞いが設計、仕様書通りであることの検証</dd>
  <dd>・コンポーネントに存在する欠陥の検出<dd>
  <dd>・コンポーネントの品質に対する信頼の積み上げ<dd>
  <dd>・欠陥が上位のテストレベルまで見逃されることの防止<dd>
  <dd>・リスクの低減<dd>
  <dt>テストベース</dt>
  <dd>・詳細設計書</dd>
  <dd>・コンポーネント仕様書<dd>
  <dd>・データモデル<dd>
  <dd>・コード<dd>
  <dt>テスト対象</dt>
  <dd>・コンポーネント（ユニット、モジュール）</dd>
  <dd>・クラス<dd>
  <dd>・データベースモジュール<dd>
  <dd>・コードとデータ構造の関連性<dd>
  <dt>典型的な欠陥と故障</dt>
  <dd>・正しくない機能（設計・仕様の記述と異なる）</dd>
  <dd>・正しくないコードとロジック<dd>
  <dd>・データフローの問題<dd>
  <dt>アプローチと責務</dt>
  <dd>・コードを開発した担当者が行うのが一般的</dd>
  <dd>・開発担当者以外が行う場合、その人がテスト対象のコードのアクセスできる必要がある<dd>
  <dd>・テスト駆動開発では、テストコードを記述してテスト自動化を行う<dd>
</dl>


以下にコンポーネントテストの特性として次の3点を挙げる。
## アジャイル開発におけるリグレッションテストの自動化
ウォーターフォール開発モデルでは、仕様が確定したら"仕様の凍結"を宣言して、その記載内容通りにプログラミングを行う。
インクリメンタル開発モデルやイテレーション開発モデルでは、柔軟に仕様を変えることを是としているため、コードの変更が発生する。そのため、リグレッションテストを自動化して、変更が既存のコンポーネントを破壊していないか確認することが重要である。

## ほかのコンポーネントと切り離してテスト
通常システムは、複数のコンポーネントが関連して動作することで目的を果たす。コンポーネントテストを行う際には、サービス仮想化によりダミーのコンポーネントを用意して、自コンポーネントだけを単独でテストする。
サービス仮想化には、テストドライバやスタブのほかに、**モックオブジェクト**や**テストハーネス**などもある。

<details><summary>モックオブジェクト(mock object)とは</summary>
テスト対象のオブジェクトが呼び出し先オブジェクトと協調連携するかどうかを検証するために、呼び出し先の代わりに使うダミーオブジェクトのこと。スタブと似たようなもの。

厳密な違いは以下。
- スタブ
    - テスト対象（System Under Test : SUT）のテストを円滑にするためのもの
    - どんな球が来ても優しく打ち返してくれる
- モックオブジェクト
    - テスト対象が正しく相手オブジェクト値連携できるか検証するためのもの
    - ストライクは打ち返してくれるが、ボールはフェール判定とする

</details>

<details><summary>テストハーネス(test harness)とは</summary>
テストの実行を自動化するためのソフトウェアのこと。
これは統合テスト、システムテスト、受け入れテストなど、他のテストレベルでも同様。スタブやテストドライバなどのテストスクリプトや、ポートを作成したりするフレームワーク（システム基盤）やソフトウェアシステム全体を表す。

- 自動テストのテストハーネス
    - テストライブラリを使用してテストスクリプトを実行し、その結果を収集・分析する
- 統合テストのテストハーネス
    - 相互に作用する2つのコードまたはモジュールに対し、組み合わせた動作が期待通りか確認する
</details>

## 機能性と非機能性の両方
コンポーネントテストには、機能性と非機能性の両方の検証が含まれる。
両方含むのは統合テスト、システムテスト、受入テストなど、他のテストレベルでも同様。

※コンポーネントテストの対象はコンポーネント。コンポーネントの振る舞いが設計・仕様通りであることを検証し、欠陥があれば検出し、品質を高めることが目的。

# テストベース
通常、コンポーネントのテストベースは詳細設計書である。
ケースによってはコンポーネント仕様書を作成していることもあり、その場合はそれがテストベースになる。ER図などのデータモデルもテストベースとして使われる。設計書がない場合は、コードを解析してテストベースにすることもある。

# テスト対象
コンポーネントテストの対象は、ある大きさでまとまったコードのかたまりである。
具体的には
- コンポーネント（ユニット、モジュール）
- クラス
- データベースモジュール
などがある。
これらのコードとデータ構造の関連性がテスト対象になる。

# 典型的な欠陥と故障
機能面型の欠陥や故障は
- 設計書通りに動作しない
- そもそもコードやロジックが間違っている
- データフロー通りにデータが流れない
などがある。

開発担当者は自分で修正を行うことが多いが、その場合でも[バグトラッキングシステム](https://e-words.jp/w/%E3%83%90%E3%82%B0%E3%83%88%E3%83%A9%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0.html)に欠陥を報告してから行うと、根本原因分析やプロセス改善に役立つ。

# アプローチと責務
コンポーネントテストは、コードを開発した担当者によって行われるのが一般的。
そうでない場合は、少なくともテスト対象のコードにアクセスできる必要がある。
アジャイル開発では、アプリケーションコードを記述する前にテスト用コードを記述する自動テストの手法である**テスト駆動開発**などが用いられることもある。

# 次回
https://qiita.com/1225/items/4058091de4154be5ba3c