単体テストと結合テストと総合テストの違い

今回はシステムエンジニアになった以上、絶対に避けては通れないテストについてのお話です。
なんとなく感覚としては理解しているんですけど、言語化が上手くできなかったので調べてまとめました。

単体テスト

1つの機能に対して想定した通りに動くよね、と確認するのがこのフェーズになります。

よく「ホワイトボックステスト」と言われるのはここのフェーズでの話になります。簡単に書くと、プログラムベースのテストをするのがここのフェーズ。
コードを網羅するようにテストを行うのが一般的です。

例えばWebアプリだと「ボタンを押した」→「選んだデータだけが画面に表示されました」という動作を確認するのはどちらかというと結合テストフェーズの話になります。
単体テストでは「ボタンを押した」→「選んだデータだけが画面に表示されました」の間で実行される「DBの項目の値がtrueに変わりました」というような画面からは見えない部分を中心に見ることが多いです。

結合テスト

単体テストが終わった機能を複数繋げて実行して動作を確認するテスト。このテストは単体テストとは違ってプログラムベースではなく、やりたいことベースでテストをします。

つまりお客さんから

上司

こんなことがやりたいんだけど……。

と言われて、ソースコードを修正したとします。そして、その修正によってお客さんの求めている処理が本当にできるようになったのかを確認するのが結合テストフェーズになります。

他のシステムとの連携があるシステムであればここで「他のシステムのデータが来たら動くよね」とか「他のシステムにデータ送ってもエラーにならないよね」ということも確認します。

このフェーズになるとプログラミングの能力は必要ありません。ただしエラー推測テストなどを行うためにどういう値を入力したら問題が起こりやすいかという知識は必要になります。

総合テスト

総合テストはシステム開発の中でも最後の工程になります。
ほぼ本番環境に近い環境でインフラまでもを巻き込んだテストになります。どちらかというとインフラの人たちが大変なフェーズ。あとは他のシステムを含めて全部流してみるとかそんな感じ。

もちろん、結合テストのようにお客さんの要望が達成できているかというのも確認観点にはなりますが、総合テストで一番重要になるのが性能だったり保守性だったりいわゆる「非機能要件」と呼ばれる部分のテストです。非機能要件のテストはこの段階ではじめて出てくるのでむちゃくちゃ重要になります。

非機能要件とは「やりたいこと」ではなく「できなきゃシステムとしてまずいよね」という観点の要件になります。例えば「ページは5秒以内で表示できるよね」とか「社員全員同時にアクセスできるよね」とか「サーバーが1台壊れてももう1台でなんとかなるよね」とかそんな感じです。

結合テストと総合テストは違うよ

結合テストと総合テストは、テスト項目自体が似てたりして結構混乱することがありますが、テストをする目的が別のものとなります。

結合テストは、システム内の複数のモジュールを結合して、それらが互いに連携して正常に機能するかどうかをテストすることを目的としています。結合テストは、個々のモジュールが正常に動作することが前提となっています。このテストは、開発の初期段階で実施され、プログラマーが開発したコードをテストすることが多いです。

一方、総合テストは、システム全体が正しく動作するかどうかを確認することを目的としています。総合テストでは、複数のモジュールが連携し、機能し、システムが要件に合致しているかどうかを確認します。このテストは、開発の最終段階で実施され、顧客が期待する要件を満たしていることを確認するために行われます。

したがって、結合テストは、単一のモジュールの動作のテストに焦点を当て、総合テストは、システム全体の動作のテストに焦点を当てます。結合テストは、開発者がテストを行い、総合テストは、QAエンジニアやテストチームがテストを行うことが一般的です。

参考文献

今回は下記の本を読んで自分で解釈して当記事を書いています。実際にはもっと図入りで詳細に書かれているのでこの記事でシステムエンジニアリングに興味を持った方はぜひ手に取ってみてはいかがでしょうか。SE1年目の人にもオススメの一冊です。

  • ずっと受けたかったソフトウェアエンジニアリングの新人研修