ITパスポート 2010年 春期 問47
問題文
プログラムの単体テストに関する記述のうち、適切なものはどれか。
選択肢
ア:作成したプログラムごとのテストは行わず、複数のプログラムを組み合わせ、一括してテストする。
イ:テスト仕様は、システム要件を定義する際に作成する。
ウ:テストデータは、システムの利用者が作成する。
エ:ロジックの網羅性も含めてプログラムをテストする。(正解)
🔒 解説は解答すると表示されます
プログラムの単体テストに関する記述のうち、適切なものはどれか。【ITパスポート 解説】
正解の理由
単体テスト(unit test:個々のプログラムや部品を個別に検証するテスト)は、作成した各プログラム(関数やクラスなど)が仕様どおりに動くかを細かく確かめる工程です。単体テストでは処理の分岐や境界値など「ロジックの網羅性(プログラムの内部の処理が漏れなく動くかを確認すること)」も確認します。選択肢の中でこの趣旨を正確に表しているのが エ「ロジックの網羅性も含めてプログラムをテストする」だからです。
解法ステップ
- 「単体テスト」が何をするものかをはっきりさせる(個々のプログラムやモジュールを単独で検証する)。
- 各選択肢が単体テストの目的と合っているかを比べる。
- 「プログラムごとのテストを行う」「内部(ロジック)の網羅を確認する」といった記述が単体テストの本質に合致するかで判断する。
この手順で判断すると、単体レベルでの網羅確認を述べている エ が適切と分かります。
選択肢別の誤答解説
-
ア: 作成したプログラムごとのテストは行わず、複数のプログラムを組み合わせ、一括してテストする。
これは「結合テスト(integration test:複数の部品を組み合わせて相互作用を確かめるテスト)」や「システムテスト(system test:システム全体の動作確認)」に当たる記述です。単体テストは個々のプログラム単位で検証するため、誤りです。 -
イ: テスト仕様は、システム要件を定義する際に作成する。
システム要件(システム全体に必要な機能や条件)を定める段階で「受入れテスト」や高レベルのテスト方針を考えることはありますが、単体テストの具体的なテスト仕様(どの関数をどう入力して何を期待するか)は通常、設計フェーズや実装フェーズで詳しく作られます。したがってこの選択肢は単体テストに特化した説明として不適切です。 -
ウ: テストデータは、システムの利用者が作成する。
利用者(ユーザー)が作成するのは受入れテストや実運用時のデータ(実データ)に近いです。単体テストで使うテストデータは開発者やテスト担当者が作成し、開発中に不具合を早く見つけるために用意します。従ってこれは誤りです。 -
エ: ロジックの網羅性も含めてプログラムをテストする。
単体テストの目的に合致します。分岐や境界条件を含めて、個々のプログラムの内部ロジックが期待どおりに動くか確認するため、正しい記述です。エ が正解となります。
よくある誤解
-
単体テストと結合テスト・システムテストを混同する
- 単体テストは「個々の部品」を対象にします。複数の部品を合わせて見るのは結合テスト、システム全体を確認するのはシステムテストです。
-
テストデータは利用者が用意すると思い込む
- 単体テストのテストデータは通常、開発者やテスターが作成します。利用者は受入れテストや実運用データの提供者に近い役割です。
-
単体テストは「動くかどうかだけ」を見ると思う
- 単体テストでは単に動作するかだけでなく、分岐ごとの処理や例外処理、境界条件などの「網羅性」も重要です。
補足コラム
-
網羅性(coverage)の種類
- 文(Statement)網羅:すべての文が実行されるか。
- 判定(Decision/Branch)網羅:条件分岐の各分岐が実行されるか。
- 条件(Condition)網羅:複合条件を構成する各条件式がそれぞれ真/偽になるか。
単体テストではこれらを意識してテストケースを作ると不具合を見つけやすくなります。
-
自動化とツール
- 単体テストは自動化しやすく、JUnit(Javaのテストフレームワーク)、pytest(Pythonのテストフレームワーク)などがよく使われます。自動化すると繰り返しの検証が楽になります。
-
簡単な例(Python、pytestを使った単体テスト)
# sample.py
def divide(a, b):
if b == 0:
raise ValueError("division by zero")
return a / b
# test_sample.py
import pytest
from sample import divide
def test_divide_normal():
assert divide(6, 3) == 2.0
def test_divide_zero_divisor():
with pytest.raises(ValueError):
divide(1, 0)
上のテストは正常系(6÷3)と異常系(0除算)を両方検証しており、ロジックの主要な分岐を網羅しています。
FAQ
Q1: 単体テストは誰が書くのですか?
A1: 主に開発者が書きます。テスターが担当する場合もありますが、開発者が自分のコードに対して書くことが多いです。
A1: 主に開発者が書きます。テスターが担当する場合もありますが、開発者が自分のコードに対して書くことが多いです。
Q2: 単体テストとデバッグはどう違いますか?
A2: デバッグは不具合を調べて直す作業です。単体テストは意図した通りに動くかを検証するための自動化されたチェックで、問題発見を早める手段です。どちらも重要ですが役割が異なります。
A2: デバッグは不具合を調べて直す作業です。単体テストは意図した通りに動くかを検証するための自動化されたチェックで、問題発見を早める手段です。どちらも重要ですが役割が異なります。
Q3: 単体テストは必ず必要ですか?
A3: 小さな試作でも有用です。規模が大きくなるほど必須度は高くなります。自動化すれば保守や改修時の安全網になります。
A3: 小さな試作でも有用です。規模が大きくなるほど必須度は高くなります。自動化すれば保守や改修時の安全網になります。
関連キーワード: 単体テスト、ユニットテスト、網羅性、テストデータ、テスト仕様書、結合テスト、システムテスト、コードカバレッジ、JUnit、pytest

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

