用語比較
doctestとunittestの違い|テストの書き場所と使い分け(Python3基礎)
Pythonの標準ライブラリには、テストのためのモジュールが2つあります。doctestとunittestです。どちらも関数が期待どおりに動くかを確かめますが、テストを書く場所が違います。
doctestは、docstringに貼り付けた典型的な呼び出し例とその結果を、そのまま検証します。unittestは、別のファイルにテストコードを書き、より網羅的なテストセットを管理できます。doctestは説明文の中、unittestは別ファイルと覚えると区別できます。
Python3エンジニア認定基礎試験は、公式チュートリアルの内容を章ごとの出題率で出題する形で、第10章の標準ライブラリめぐりも範囲です。この記事では、チュートリアル10.11の例で、2つの書き方を見比べます。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
結論
doctest
docstringに埋め込まれたテストを探し、実行結果を検証する。典型的な呼び出し例とその結果を、docstringに貼り付けるだけでテストになる。doctest.testmod() で走らせる。
unittest
doctestほど気楽には使えないが、より網羅的なテストセットを別のファイルで管理できる。unittest.TestCase を継承したクラスにテストメソッドを書く。
共通点
どちらも標準ライブラリで、関数の動作を自動で確かめる。チュートリアルは、開発と同時にテストを書き、頻繁に走らせる進め方を紹介している。
違いを表で確認
| 比較軸 | doctest | unittest |
|---|---|---|
| テストを書く場所 | 関数のdocstringの中(呼び出し例とその結果) | 別のファイル(unittest.TestCase を継承したクラスのテストメソッド) |
| 検証の書き方 | docstringに貼った結果と、実際の実行結果を照らす | assertEqual() や assertRaises() で検証する |
| 実行のしかた | doctest.testmod() で、docstringに埋め込まれたテストを自動的に評価する | unittest.main() で、コマンドラインから全テストを実行する |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
関数の使用例を示しながら、動作も確かめたい人
doctestは、利用者に使用例を示すと同時に、コードがドキュメントに書かれたとおりに動き続けていることを確認できます。
例外のテストなど、多くの場合分けを別に管理したい人
unittestは、別のファイルで網羅的なテストセットを管理できます。チュートリアルの例では、assertRaises() で ZeroDivisionError や TypeError が出ることも確かめています。
具体例で使い分ける
例 1
チュートリアル10.11のdoctest
average() 関数のdocstringに、呼び出し例とその結果を貼り付け、doctest.testmod() を呼びます。
- doctest.testmod() が、docstringに埋め込まれたテストを自動的に評価します。
- docstringの結果と実行結果が合っていれば、コードがドキュメントどおりに動いていると確認できます。
結論: doctestは、説明文に書いた例をそのままテストにします。
例 2
チュートリアル10.11のunittest
TestStatisticalFunctions クラスを unittest.TestCase の子として定義し、test_average メソッドで average([20, 30, 70]) が 40.0 になることを assertEqual() で確かめます。
- with self.assertRaises(ZeroDivisionError) で、average([]) が ZeroDivisionError を出すことも確かめます。
- unittest.main() で、コマンドラインから全テストを実行します。
結論: unittestは、別ファイルでより網羅的にテストを管理する書き方です。
問題文から答えを選ぶ手順
- 1
テストの置き場所を見る
docstringの中ならdoctest、TestCaseを継承したクラスならunittestです。
- 2
検証の書き方を見る
呼び出し例と結果の貼り付けならdoctest、assertEqual() などの呼び出しならunittestです。
- 3
実行の呼び出しを見る
doctest.testmod() ならdoctest、unittest.main() ならunittestです。
試験での見分け方
- 1docstringに埋め込んだ呼び出し例と結果を検証するのは、doctest。
- 2別ファイルでTestCaseを継承したクラスに書くのは、unittest。
- 3unittestは、doctestほど気楽に使えないが、より網羅的なテストセットを管理できる。
- 4doctest.testmod() と unittest.main() は、呼び出しの名前でどちらのモジュールか区別できる。
誤答しやすい選択肢
doctestも別ファイルにテストを書くと考える
修正: doctestのテストはdocstringに埋め込みます。別ファイルに書くのはunittestです。
unittestがdocstringの呼び出し例を検証すると考える
修正: unittestはTestCaseを継承したクラスのテストメソッドを実行します。docstringの検証はdoctestです。
確認問題
Q1docstringに埋め込まれたテストを自動的に評価するモジュールは?
答え: doctest
チュートリアル10.11が、doctest.testmod() で評価できると説明しています。
Q2unittest でテストメソッドを書くとき、継承するクラスは?
答え: unittest.TestCase
チュートリアルの例は、TestStatisticalFunctions を unittest.TestCase の子として定義しています。
Q3unittest で、ある呼び出しが ZeroDivisionError を出すことを確かめる書き方は?
答え: with self.assertRaises(ZeroDivisionError): ...
チュートリアルの例で、average([]) が例外を出すことの確認に使われています。
到達チェック
- doctestのテストを書く場所を言える
- unittestのテストを書く場所を言える
- doctest.testmod() と unittest.main() の違いを説明できる
関連ページで確認する
同じ資格で次に知りたいこと
- raiseとraise ... fromの違い|例外の連鎖の表示(Python3基礎)
except節の中で別の例外をraiseしたときの表示と、from節・from Noneを付けたときの違いを、Python公式チュートリアル8.5の例で整理します。確認問題つき。
- sys.argvとargparseの違い|コマンドライン引数の受け取り方(Python3基礎)
sys.argvは引数をそのままリストで受け取り、argparseは--linesのようなオプションを定義して解析します。Python公式チュートリアル10.3の例で整理。確認問題つき。
- str()とrepr()の違い|読みやすい表現か、インタプリタが読める表現か(Python3基礎)
str()とrepr()の違いを、表現の目的で整理します。Python公式チュートリアル7.1の記述、str(s)とrepr(s)の結果の差、確認問題つき。
よくある質問
Qdoctestとは?
docstringに埋め込まれたテストを探し、実行結果を検証する標準ライブラリです。
Qunittestとは?
別のファイルに、より網羅的なテストセットを管理できる標準ライブラリです。unittest.TestCase を継承したクラスにテストメソッドを書きます。
Qdoctestとunittestの違いは?
テストを書く場所です。doctestはdocstringの中、unittestは別ファイルのTestCaseに書きます。
QPython3基礎試験の範囲?
公式の出題範囲は公式チュートリアルの章単位で、第10章の標準ライブラリめぐりと、10.11の品質管理を含みます。出題の形式は受験前に公式の案内で確認してください。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
