こんにちは。
先日、後輩から「単体試験と結合試験って何が違うのですか?」という質問を受けました。
どのような試験をしているのかを確認したところ、単体試験と結合試験は同じような試験項目となっていました。
私なりに考えてみた結果、以下のような理由があるのではないかと思います。
ちなみに、私はこれまで20年以上システム開発を行ってきました。最初の10年は組み込み開発を行い、その後リスケールして、現在はWebシステムの開発を行っています。
後輩がこのような質問をしたのは、システム開発における試験の目的や手法について十分に理解していないということが考えられます。
システム開発における試験工程は非常に重要な工程であるため、以下でまとめておきたいと思います。
システム開発の試験工程
システム開発の試験工程は、非常に重要な工程です。
なぜかと言うと、開発したプログラムが正常に動くことを保証する工程だからです。
つまり、顧客の要望にそっているかを確認し、リリース後に不具合が発生するリスクを低減するのです。
具体的には、以下の試験をおこないます。
- 単体試験
- 結合試験
- 運用試験
単体試験で、開発したプログラムが期待通りに動作するかを確認します。
結合試験で、開発した機能が正常に動作するかを確認します。
運用試験で、顧客の要望にそった機能になっているかを確認します。
しかし、プログラマの中には、「人がプログラムするのだから不具合があるのは当然!」「試験工程は、同じような作業の繰り返しで退屈」と言う人がいます。
確かに、その通りです。
でも、だからこそ、試験工程でしっかりと不具合をたたき出して、リリース後の不具合が発生するのを防ぐのです。
また、試験工程は、クリエーティブな作業では無いので退屈に感じる気持ちも分かります。
でも、自分たちが作成したシステムに、隠されている不具合を探すという意識で作業すると、宝探しのような気になり楽しむこともできます。
なので、試験工程は、非常に重要な工程なのです。
単体試験
単体試験は、作成したプログラムの品質を担保する試験です。
具体的には、関数のインプットとアウトプットをプログラムの処理を元に試験していきます。
私が経験したプロジェクトでは、単体試験でカバレッジをよく確認していました。
つまり、単体試験では、詳細設計で作成した処理が、設計通りにプログラミングされているかを確認するのです。
単体試験で発生する不具合は、設計工程での不具合であることが多いです。
なので、論理的に設計されていないと不具合が多いです。
単体試験で使われるツールは、開発する言語ごとに違うのですが、ほとんどの言語で用意されています。
たとえば、JUnit(Java)、PHPUnit(PHP)、Jest(JavaScript)などです。
単体試験でツールを使うメリットは、何度も実行できるのでデグレをチェックすることができます。
また、リファクタリングする際、影響が他の機能におよんでいないかを確認することができます。
デメリットもあります。
単体試験のツールは、多くがコードで作成します。
そのため、コーディングに時間がかかりコストが上がることがあります。
結合試験
結合試験は、作成した機能やシステムの品質を担保する試験です。
具体的には、Webブラウザから操作して、作成した機能が正常に動作するか、システム全体が正常に動作するかを試験します。
私が経験したプロジェクトでは、結合試験で、顧客の要望が正常に動作するか、異常な値を入力しても不具合が発生しないかを確認していました。
結合試験で使われるツールは、Webブラウザを操作するツールが多いです。
たとえば、Selenium、UIPathなどがあります。
結合試験でツールを使って試験するメリットは、何度も実行できるため機能が追加された時のデグレチェックに使うことができます。
また、自動で大量のデータを入力することもできるので、DBの負荷をかけた試験もできます。
デメリットもあります。
仕様の変更が頻繁に行われる場合は、試験ケースの作り直しが頻繁に発生します。
その他にも、UIの変更が発生すると、修正が必要になることがあります。
運用試験
運用試験は、実運用に耐えることができるかを評価する試験です。
具体的には、実際に操作するオペレータがデータの入力や出力を行い、画面のレスポンスや操作性について試験します。
私の経験だと、運用試験で実データに近い値を旧システムと新システムに入力して、操作性に問題ないか、出力される値に問題ないかを確認します。
運用試験も開発側で行うことがあります。
しかし、操作性は、実作業しているオペレータに見てもらう必要があると私は思います。
また、リリース後すぐに実業務を行ってもらうためにも、運用試験を行いながら操作に慣れてもらうことも重要です。
ウォータフォール開発での試験
ウォータフォール開発での試験は、上記の単体試験、結合試験、運用試験の順に試験を進めます。
各試験で発生した不具合は、その試験で解決します。
と言うか、不具合が解決しない間は、次の試験に移ることができません。
なので、ウォータフォール開発での試験は、プログラマにとってはストレスがかかります。
私も、ウォータフォール開発での経験が長いので、試験期間中のストレスはよく分かります。
ウォータフォール開発での試験のメリットは、スケジュールの立てやすいというところです。
スケジュールが立てやすいということは、コスト管理もしやすいのです。
アジャイル開発での試験
アジャイル開発での試験は、単体試験、結合試験を行い、ステージング環境や本番環境にリリースして、顧客に操作しフィードバックをもらいます。
アジャイル開発の場合、2週間から4週間の短い期間(スプリント)で開発を進めるため、単体試験と結合試験を同時に進めることもよくあります。
そのため、試験ツールは必須となります。
最近の開発は、アジャイル開発が多いのですが、試験工程はウォータフォールで行うことを要求されることもあります。
それは、やはりコスト管理の難しさだと私は思います。
私の意見を言わせてもらうと、アジャイル開発は、開発スピードを重視するので、試験工程もスプリント内で行う方がいいと思います。
1つのスプリントを計画する段階で、試験の工数も見積もり、発生した不具合は、別のスプリントに含めるようにすることで、品質も担保できると思います。
アジャイル開発については、以下のブログにも書いてます。
>>>システム開発で設計書は必要なの?【アジャイル開発でも設計書は必要!!】
試験ツールを使うとコスト超過する問題の解決策
単体試験や結合試験で試験ツールを使うと、コストが多くかかってしまうことがよくあります。
私も、プロジェクトマネージメントをしていて、試験工程でのコスト超過を経験してきました。
コスト超過の解決策は以下になります。
- テスト駆動開発(TDD)を行う
- ペアプログラムを行う
テスト駆動開発(TDD)を行う
テスト駆動開発では、試験コードを先に作成し、処理コードを作成します。
そのため、処理コードが完成するときには、試験コードも完成しています。
つまり、製造と試験を同時に行えるため、コスト超過を防ぐことができるのです。
ペアプログラムを行う
ペアプログラムは、試験コードを作成する人と、処理コードを作成する人で分かれて作業します。
そのため、後輩のプログラミングの指導などに使用されます。
ペアプログラムをすると、作業を分けて行えるため、作業時間を削減しコスト削減となります。
まとめ
システム開発で試験工程は、とても重要な工程です。
試験工程では、以下の試験を行います。
- 単体試験
- 結合試験
- 運用試験
単体試験では、製造したプログラムが正常に動作するかを試験します。
結合試験では、作成した機能やシステムが顧客の要望にそった動作をするかを試験します。
運用試験では、作成した機能やシステムが、運用に耐えられるかを試験します。
システム開発の試験工程は、システムがリリース後に不具合を起こさないように、リリース前に対応を行うのです。
そのため、試験では、不具合を見つけ出すことが重要となるのです。
システムは、リリース後に不具合が発生すると、重大な事故となることもよくあります。
試験で充分に不具合をだし、リリース後の不具合が発生しないように努めましょう。
では、今日はこの辺で。
コメント