ソフトウェアテストの基礎的なことをまとめてみた

# はじめに
この記事は実務経験8ヶ月のフロントエンドエンジニアが、

- 自分の書いたコードに考慮漏れとかねぇかな
- 不安だからセルフデバッグでポチポチしまくってるけど面倒くせぇなあ
- デグレしてたら嫌だなぁ
- こういうのってテストコード書いたらか解消されるんかなぁ
- テストコードを書いたことないから、ひとまず「ソフトウェアテスト全般」の内容について勉強してみるかぁ

といった経緯で書きました。
具体的なテストツールやコードの書き方というよりは「ソフトウェアテストの基礎的な内容」について自分なりにまとめた記事になります。

# ソフトウェアテストってなんぞや

ソフトウェアテストとは、ソフトウェアが意図した通りに動作するかを検証すること

# テストの実行方法

意図した通りに動作するかを検証するのは決して手動で画面を1つずつぽちぽちするだけではありません。テスト手法には**静的テスト**と**動的テスト**があります。

## 静的テスト

プログラムのソースコードを人間による目視や専用のソフトウェアによって解析し、誤っている箇所を見つけること。手でポチポチやるのが静的テスト。

## 動的テスト

実際にプログラムを実行してみて意図した通りに動作するかを確かめること。テストコード書いて実行するのが動的テスト。

# テスト工程

テストを行う際にどのような手順でやればいいのでしょうか？
基本的には「小さい範囲から大きい範囲」へと移行していきます。

## 単体テスト

部品単位の信頼性を担保する。各モジュールごとにテストを行い、誤りがないかテストを行う。
特定の1つの機能単位や関数単位でテストを行う。後述するブラックボックステストやホワイトボックステストがよく用いられる。

## 結合テスト

複数のモジュールを組み合わせて、モジュール間のインターフェースがちゃんと動いてるか確認する。後述するトップダウンテストやボトムアップテストがよく用いられる。

## システムテスト

単体テストや結合テストよりも検証の範囲が広い。システム全体のテストを行う。

- 要求された機能が仕様通りに動くかを確認する**機能テスト**
- 処理能力を確認する**性能テスト**
- 負荷がかかった時にちゃんと動くかを確認する**負荷テスト**

などがある。

# テスト手法

## ブラックボックステスト

モジュールの内部構造は意識せず、入力に大して仕様通りの結果が得られているかを確認する。
ただし、入力内容として用いるテストデータは適当に選んでいいわけではないらしい、、
テストデータを作成する基準として用いられるのが、**同値分割**と**限界値分割**というもの。

### 同値分割

データ範囲を種類ごとのグループに分けて、それぞれのグループから代表的な値を抜き出してテストデータとして使用する。

![スクリーンショット 2022-03-26 16.57.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/734bf0d8-186e-5711-bfc1-2c7b9d2f550c.png)


### 限界値分析
データ範囲を種類ごとのグループに分けて、境目部分を重点的にチェックする方法。境界付近の値をデータに用いる。

![スクリーンショット 2022-03-26 17.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/4b56e836-a1b3-c975-bc3d-f22e3cb4cbc6.png)

## ホワイトボックステスト

ブラックボックステストと違い、モジュールの内部構造が正しく作られているかをテストする。ホワイトボックステストを行うには、「テストパターンをどこまでカバーするか」を決めてからテストケースを設計する。網羅基準には「命令網羅」「判定条件網羅」「条件網羅」「複数条件網羅」がある。

![スクリーンショット 2022-03-26 16.47.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/d42f321e-39e5-0acc-83d9-609222bcea5d.png)


### 命令網羅
全ての命令を最低１回は通すようにするテスト
下記の図だと、赤のルートだけ通っておけばOK

![スクリーンショット 2022-03-26 17.10.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/7f0b6d76-0264-8458-070f-921d640501fe.png)


### 判定条件網羅
全ての分岐は最低１回は通すようにするテスト。
赤と青のルート両方通って全ての分岐を試す。

![スクリーンショット 2022-03-26 17.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/9ad4b5dd-be37-1787-e13a-ff8d44001521.png)

### 条件網羅
個々の条件が真と偽の値を最低１回は満たすようにするテスト
以下のテストケース① or テストケース② のどちらかを試せればOK

![スクリーンショット 2022-03-26 17.28.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/9e421df4-9f09-a3d4-17e9-1ff8de6c8a14.png)

### 複数条件網羅
複数条件がとりうる真偽値全ての組み合わせを網羅するテスト

![スクリーンショット 2022-03-26 17.33.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/9b24751e-1800-05b6-2c71-ffdac82c4b32.png)


## トップダウンテスト

上位モジュールから先にテストを済ませていく。
下位モジュールはテストがまだだったりするので、スタブと言う仮のモジュールをくっつける。

![スクリーンショット 2022-03-26 17.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/f9af8db3-5b52-bbd9-a892-6870e15600c1.png)


## ボトムアップテスト

下位モジュールからテストを行う。
上位モジュールはテストがまだだったりするので、ドライバと言う仮のモジュールをくっつける。

![スクリーンショット 2022-03-26 17.50.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1741616/df185146-0f91-ba1c-df60-bbfd9aded2f3.png)


# 参考文献

[キタミ式イラストIT塾 基本情報技術者 令和03年](https://www.amazon.co.jp/dp/B08PPJPZ4V/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
[知識ゼロから学ぶソフトウェアテスト](https://www.amazon.co.jp/%E7%9F%A5%E8%AD%98%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88-%E3%80%90%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-%E9%AB%98%E6%A9%8B%E5%AF%BF%E4%B8%80-ebook/dp/B00HQ7S5CA/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=31YQGY9F6V5LT&keywords=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88&qid=1648279790&s=digital-text&sprefix=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%2Cdigital-text%2C167&sr=1-6)
[IT用語辞典](https://e-words.jp/w/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88.html)