テストのこと本当にわかってる?
概要
筆者はエンジニアとしていろいろな開発を行ってきましたが、テストは大切だなと考えています。
ただ、大切だと考えているのにテストについての知識が抜けている部分があるなと感じる時があるので
基本的なところから学習して、知識整理を行っていきたいと思います。
※こちらのページは随時更新していく予定です。
テスト工程
テストといってもいろいろなテストがありますが、大まかには以下の流れでテストが行われると思います。
下に行けば行くほど、テスト範囲が広がっていくイメージですね。
各テストはさらに細分化できると思います。
単体テスト(コンポーネントテスト)
プログラムを組んだモジュールやコンポーネントといった機能単位の動作などを、単体で確認するテストのことです。
ユニットテストとも呼ばれ、実施方法が2種類存在します。
ホワイトボックステスト
対象となるプログラムの内部構造に着目したテスト。
プログラムをどこまで網羅するのかによってさらに分類分けすることができる。
種類としては、「命令網羅」「判定条件網羅」「条件網羅」「複数条件網羅」がある。
命令網羅(C0)
全ての命令を最低1回は通すようにするテスト
※下記の図で①,②,③,⑤が実行される
分岐網羅(C1)
全ての分岐が最低1回は通すようにするテスト
※下記の図で①,②,③,⑤と①,②,④,⑤,⑥が実行される
条件網羅(C2)
個々の条件が真と偽の値を最低1回は満たすようにするテスト
※下記の図で①,②,③,⑤と①,②,④,⑤,⑥が実行される
複数条件網羅(MCC)
複数条件がとりうる真偽値全ての組み合わせを網羅するテスト
※下記の図で①,②,③,⑤と①,②,③,⑤,⑥と①,②,④,⑤と①,②,④,⑤,⑥が実行される
ブラックボックステスト
テスト対象に期待する動作を検証するもので、プログラム内の処理されるには着目せず、入力と出力の整合性にのみ確認するテストのこと。
この時に用意するデータには、同値分割法、境界値分析、デシジョンテーブルテスト、状態遷移テスト、ユースケーステスト、組み合わせテストの種類が存在する。
同値分割法(リグレッションテストで活用される)
システム上は同等に処理されると想定したデータから有効な値グループ(有効同値クラス)、無効な値グループ(無効同値クラス)に分けてテストを実施する。
(例:0 ~ 100までは入力のデータの場合)
境界値分析
仕様条件の境界となる値とその隣の値に対してテストする技法のこと。
境界値とは、ある範囲の最小値または最大値などの同値分割した領域の端にあたる値です。
(例:0 ~ 100までは入力のデータの場合)
デシジョンテーブルテスト(すべてのテストレベルに適用する)
システムの仕様から入出力パターンの組み合わせを作成して、その組み合わせ通りにテストケースを導出するテストのこと。
(マトリクス上に一覧化した表)
状態遷移テスト
ある状態から別の状態に遷移する際の出力結果に着目したテスト。
状態遷移図を作成して、遷移図に基づいてテストケースを設計することになる
※小規模なシステムにのみ適し、大規模で複雑なシステムには適さない
ユースケーステスト
ユーザー観点に基づき、ビジネス要件と機能要件を満たしているかという視点でテストケースを設計すること
シナリオテストでよく実施されると思いますね。
結合テスト(Integration)
単体テストを終えた各モジュールを組み合わせて、意図した通りの動作や挙動になっているかを確認するテストです。
疎通テスト
アプリケーション同士をつないだ際に正常に動作するかを確認する際に実施するテストのこと。
アプリ通しのIFが仕様通りに正常に動作するかを確認するテストのこと
機能テスト
アプリの機能が仕様通りに動作するのか確認するテストのこと。
ログインする機能があった場合、ログインできることを確認することなどがあげられます。
テスト実施環境に結合先がなかった場合は、モックを使用したりする
性能テスト
ユーザーの利用に耐えられるのか確認するテストのこと。
例:レスポンスが想定している時間内に返ってきているのか
回帰テスト
システムの改修を行っていない箇所に影響がでていないかを確認するテスト。
リグレッションテストとも言われる。
セキュリティテスト
Web画面で入力された情報がそのままSQLやJavaScriptとして実行されないことの確認など
セキュリティの観点のテストを実施すること
ユーザビリティテスト
ソフトウェアで実際に業務を行ったり、シナリオを想定してユーザーの操作感や使用感などを検証したりすること
結合テストの注意点
・狭い範囲から広い範囲に広げるようにテストを計画する
・重要な機能から先にテストする
・組み合わせテストの絞り込みを計画する
システムテスト
作成したシステムが要件通り動作するのか確認するテスト。
システムテスト(総合テスト)と結合テストの違い
システムテストが要件定義に沿っているかを確認するのに対し、結合テストでは設計書の内容に沿っているかを確認します。
テスト実施環境に関しても、システムテストは本番同様の環境で行うのに対し、結合テストでは開発環境にてテストデータを使用してテストを実施します。
システムテストで実施されるテストの種類を記載していきます。
システムテストの種類
システムテストでも結合テストと同様にユーザビリティテスト、性能・負荷テスト、回帰テスト、セキュリティテスト等をを実施していきます。
テストの種類
テストについて、工程の他にテストの種類による分類も存在します。
機能要件
機能要件は、その名の通りシステムの「機能」に対する要件のことです。
どのような画面があり、どういったことができるのか、と言った、システムが「どのように動作するのか」を要件とし機能要件に該当するテストを「機能テスト」と呼ぶ。
すべてのテスト工程にて、「機能テスト」は該当します。
非機能要件
「システムの機能に該当しない要件」を非機能要件と呼びます。
具体的には、目に見える要件が「機能要件」、目に見えない要件が「非機能要件」と考えるとイメージしやすいと思います。
「非機能要件」に該当するテストを「非機能テスト」と呼ぶ。
すべての工程で非機能テストが登場するわけではなく、システムテストで実施することが多いです。
非機能テストとしては以下のようなものが代表的ですが、もちろんシステムの特性によってはそれ以外の非機能要件もありえます。
・性能テスト
・ユーザー操作性テスト
・セキュリティテスト
テストの実施方法について
テストを実施するにあたり、どういったテストを実施するのか計画書が必要になります。
これがテストケース or テスト計画書と言われるものになりますが、テストケースについて会社毎に書き方やドキュメントが異なると思いますので、ここでは割愛いたします。
テストの自動化について
テストは人が実施して行うのとプログラムを使用して実施を自動化する2種類あります。
すべてのテストを自動化すれば実施する時間は短縮できますが、テスト用のプログラムを管理する工数も発生しますので
どこまで自動化するかなど気をつけて考えなければならないです。
自動化の種類
自動化するツールやプログラムもいろいろな種類がありますが、いくつか記載していきます。
- ユニットテスト(単体テスト)
●●Unit系
各プログラム言語に存在するテストライブラリのこと - UIテスト
Cypress,Selenium
画面の動作テストを自動で行うことができます - 性能・負荷テスト
JMeter、k6
JMeterはGUIでテストケースを作成することができ、k6はJavaScriptを用いてテストケースを作成していきます。
まとめ
ここまでいろいろなテストについて記載していきましたが、各フェーズで行うテストは会社毎に異なると思いますし、すべてのテストを実施するのはリソース等の問題でできないと思います。ですので、テストを実施する際は取捨選択が必要だと思いました。
参考サイト
-
単体テストについて
https://qiita.com/takengineer1216/items/3ac212f603441dd8e6a7 -
結合テストについて
https://service.shiftinc.jp/column/3650/ -
自動化ツールの参考サイト
https://kigyolog.com/service.php?id=470 -
性能・負荷テストの自動化ツールの参考サイト
https://note.com/shift_tech/n/n16ea2df23900
Discussion