ソフトウェアテストについて簡単にまとめてみた

#はじめに
<p>
会社のこれからの方向性の関係でソフトウェアのテストについて調べた備忘録になります。
</p>

#ソフトウェアのテストとは？
<p
今の社会はソフトウェアなしでは何も出来ません。<br>
例えば個人のスマートフォンにはOSやアプリケーションが入っています。<br>
また仕事で使うパソコンにもOSやアプリケーションが入っています。<br>
そして最近ではインターネットにアクセスするブラウザで操作するWebアプリケーションがあります。<br>
今はアプリからでもアクセスできますが、あなたはパソコンからはブラウザでSNSなどにアクセスしていないでしょうか？<br>
SNSもWebアプリケーションの一種です。
</p>

<p>
また、ソフトウェアは上記以外にも以下のような物にも搭載されています。
</p>

* ATMなどの端末
* 車の制御
* 医療機器の制御

<p>
上記のようなソフトウェアが正しく動作しなかったらどうなるでしょうか？<br>
「SNSなどに投稿できない」などであればまだ修正を待てば良いですが、「車を減速するプログラムが動作しない」や「医療機器が動作しない」などの問題が発生した場合は人命に関わります。<br>
そのためソフトウェアはただ作るだけでなく、作った後正しく動作することを確認しなければなりません。<br>
その動作確認のことをIT業界ではテストと呼んでいます。
</p>

#テストの基本
<p>
ITの開発工程は一般的なウォーターフォール型の開発の場合以下の手順で進んでいきます。
</p>

1. 要件定義
1. 基本設計
1. 構造設計
1. 詳細設計
1. 実装
1. 単体テスト
1. 結合テスト
1. システムテスト
1. 受け入れテスト

<p>
基本的には上記のような工程で進む場合は以下のように設計とテストが紐付いています。
</p>

* 詳細設計 - 単体テスト
* 構造設計 - 結合テスト
* 基本設計 - システムテスト
* 要件定義 - 受け入れテスト

<p>
一般的に受け入れテストはシステムを発注した会社が行うため、開発者が手を出すことはありません。<br>
一方でそれ以外のテストについては開発するチームがテストを行う場合が多いです。<br>
それぞれのテストについては以下のようになります。
</p>

## 単体テスト
<p>
単体テストでは主に作成した1つの機能や、細かいところでは作ったプログラムの1つのメソッド単位でテストを行います。<br>
Javaを例に取った場合、JUnitというテストツールがあります。<br>
これはメソッド単体でプログラムを動作させ、結果が期待値と合っているかを確認するツールになります。<br>
このようなツールを使ってプログラムが正しく動作するかを検証していきます。<br>
単体テストではJUnitを使用する際に、Javaでコーディングを行う必要があります。
</p>

## 結合テスト
<p>
結合テストは複数のモジュールや機能などを組み合わせて動作させ、問題がないことを確認します。<br>
結合テストについては私は手動でプログラムを動作させ、結果を確認する事が多かったです。
</p>

## システムテスト
<p>
システムテストはシステム全体を通して問題がないかや、外部システムとの連携、またアクセス数が非常に多い場合にしっかり動作するかなどの観点で行われるテストになります。
</p>

## 受け入れテスト
<p>
これはシステムの発注を行なった会社が問題ないかを実際の業務と同じようなパターンを用意して行うテストになります。
</p>

# テストの流れ
<p>
テストを行う際は以下の流れを各テスト工程で行います。
</p>

1. 仕様分析
1. テスト計画
1. テスト設計
1. テスト実装
1. テスト実行
1. テスト報告

## 仕様分析
<p>
仕様分析では要件定義などの設計書やプロジェクトの関連文書などを解析します。<br>
この分析を元にテスト計画を立てます。<br>
ただし場合によっては要件定義や設計書が存在しない場合があります。<br>
その場合は以下のURLのようなテストタイプを使用します。
</p>

[2.3.2 機能以外の特性のテスト（非機能テスト） - Summarize-JSTQB-FL](https://scrapbox.io/JSTQB-FL/2.3.2_%E6%A9%9F%E8%83%BD%E4%BB%A5%E5%A4%96%E3%81%AE%E7%89%B9%E6%80%A7%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%EF%BC%88%E9%9D%9E%E6%A9%9F%E8%83%BD%E3%83%86%E3%82%B9%E3%83%88%EF%BC%89:title)

## テスト計画
<p>
テスト計画では仕様分析に従ってテスト計画を立てます。<br>
テスト計画を立てる際に使用するテスト計画書についてはIEEE829というテスト計画書のフォーマットがあります。<br>
そのためこの計画書に沿ってテスト計画を立てます。<br>
内容については以下の通りです。
</p>

1. テスト識別番号 - 文書番号にあたる
1. はじめに(序文) - プロジェクトの背景やドキュメントとの関連を記載する
1. テストアイテム - 対象のソフトウェアとそのバージョンを記す
1. テストすべき機能 - テスト対象の機能
1. テストしない機能 - テスト対象の範囲外の機能とその理由
1. アプローチ - テストの種類
1. 合否判定基準 - テストしたシステムの合否基準、またテストの終了条件にも関わる
1. テスト中止・再開基準 - テストの中止の基準と再開の基準
1. テスト成果物 - テストで作成するドキュメントなど
1. テストのタスク - テストで必要な作業
1. 環境要員 - テストを行うために必要なハードウェアやソフトウェア
1. 責任範囲 - テストに関わる人々の責任範囲
1. 要員計画とトレーニング計画 - テストに必要なスキルとそのトレーニング方法、また人数
1. スケジュール - テストのスケジュール
1. リスク対策 - テストに関わるリスクと対策
1. 承認 - これらの計画を誰が承認したか

## テスト設計
<p>
テスト設計ではテスト計画を元に、どのようなテスト項目を作成するかを決めます。<br>
例えば性能に対する設計を行い場合は、どれだけの負荷に耐えられるかをテストします。<br>
そのためにどのようなどのようなアクセスが多いかを分析し、どういうテストを行うかを決めます。
</p>

## テスト実装
<p>
テストの実装ではテスト設計を元に、具体的にどのような項目にどういうテストを行うかを決めます。<br>
一般的にテストケースと言われるものがここで作成されます。
</p>

## テスト実施
<p>
テストの実施ではテストを実際に行います。<br>
そしてテスト結果の記録と、不具合が発生した場合はその不具合を記録します。<br>
大切な事としてテストの記録はいつ、誰が行い、どういう結果だったかを記します。<br>
不具合の記録については同じ原因の不具合を、いくつも不具合の記録として残してしまうと開発者が混乱します。<br>
そのため同じ原因のものはまとめることが肝心です。
</p>

## テスト報告
<p>
テストが終わったらテストの結果について報告書を作成します。<br>
こちらもIEEE829にテンプレートがあり、以下のような項目で構成されています。
</p>

1. テスト報告書番号
1. 本報告の要約と見解
1. テスト実施内容と要約
1. テストの総合評価
1. 不具合の傾向と積み残し
1. テストにおける特記事項
1. テスト実施時のステークホルダー

# テストの種類について
<p>
上記まででテストの流れを説明してきました。<br>
次はテストの種類について説明します。<br>
テストの種類には以下のような物があります。
</p>

* ホワイトボックステスト
* ブラックボックステスト
* 探索的テスト
* 非機能要求テスト

## ホワイトボックステスト
<p>
ホワイトボックステストはソースコードをベースに行うテストです。<br>
このテストではソースコードのルートを網羅することを目的としています。<br>
ソースコードのルートとは条件分岐やループなどで処理の流れが分かれると、それぞれにルートができます。<br>
その両方をテストし、どちらを通過しても問題ないことを確認します。<br>
網羅する比率のことをカバレッジと呼び、理想は100%通ると良いですが、一般的には起こり得ない例外の処理だったり発生が非常に困難な条件がある場合もあり、必ずしも100%を目指さない場合もあります。
</p>

## ブラックボックステスト
<p>
ブラックボックステストはソースコードをベースに行わず、設計書などを参考にテストを行います。<br>
例えば年齢の入力欄に数値以外が入った場合はエラーとする。<br>
また、4桁以上の数値は入力できないようにする、などが設計書に記載されているとします。<br>
テストとしてはそれらの制限ないであればエラーにならず、制限に引っかかる場合はエラーとなることを確認します。
</p>

## 探索的テスト
<p>
探索的テストはテスト対象を、テスト実施者が自由に触りエラーを見つけるテストになります。<br>
ホワイトボックステストやブラックボックステストでは一般的にはテストケースに沿ってテストを行います。<br>
一方探索的テストではテスト実施者が対象のソフトウェアを使用しながら学習し、バグを見つけ出していきます。<br>
私の考えとしてはゲームのデバッグなどが1番近いものとなります。
</p>

## 非機能要求テスト
<p>
非機能要求テストは以下のようなざっくりした観点からテストを実施します。
</p>

* 機能性
* 信頼性
* 効率性
* 移植生
* 使用性

<p>
このテストの難しいところは観点がざっくりしている事もありますが、テストの合格基準が難しい所にあります。<br>
例えば一般的にシステムを使いやすくする(使用性を上げる)とセキュリティの観点からはリスクが伴います(信頼性が下がる)。<br>
そのためどこをゴールに設定するかが難しいです。
</p>

<p>
また、このテストの一種にセキュリティテストが含まれます。<br>
セキュリティテストは日本では行える技術者が少なく、あまりテストされていない分野になります。
</p>

# 終わりに
<p>
上記のようにテストの流れと手法について解説していきました。<br>
ソフトウェアは一般的にはバグを0にすることが不可能と言われています。<br>
そのためどこでテストを終えるかも重要な判断になってきます。<br>
そのような細かい話や、上記の内容について詳しく知りたい方は以下の書籍を参考にしてみてください。
</p>

[知識ゼロから学ぶソフトウェアテスト 【改訂版】](https://www.amazon.co.jp/exec/obidos/ASIN/B00HQ7S5CA/rasclass1985-22/)

[(改訂新版)マインドマップから始めるソフトウェアテスト](https://www.amazon.co.jp/exec/obidos/ASIN/4297105063/rasclass1985-22/)