5.2.8 単位テスト API

doctest 化したモジュールのコレクションが増えるにつれ、全ての doctest を システマティックに実行したいと思うようになるはずです。 Python 2.4 以前の doctest には Tester という ほとんどドキュメント化されていないクラスがあり、複数のモジュールの doctest を統合する初歩的な手段を提供していました。 Tester は非力であり、実際のところ、もっときちんとした Python の テストフレームワークが unittest モジュールで構築されており、 複数のソースコードからのテストを統合する柔軟な方法を提供しています。 そこで Python 2.4 では doctestTester クラスを 撤廃し、モジュールや doctest の入ったテキストファイルから unittest テストスイートを作成できるような二つの関数を doctest 側で提供するようにしました。 こうしたテストスイートは、unittest のテストランナを 使って実行できます:

import unittest
import doctest
import my_module_with_doctests, and_another

suite = unittest.TestSuite()
for mod in my_module_with_doctests, and_another:
    suite.addTest(doctest.DocTestSuite(mod))
runner = unittest.TextTestRunner()
runner.run(suite)

doctest の入ったテキストファイルやモジュールから unittest.TestSuite インスタンスを生成するための 主な関数は二つあります:

DocFileSuite( *paths, **kw)
単一または複数のテキストファイルに入っている doctest 形式のテストを、 unittest.TestSuite インスタンスに変換します。

この関数の返すunittest.TestSuite インスタンスは、 unittest フレームワークで動作させ、各ファイルの例題を対話的に実行する ためのものです。ファイル内の何らかの例題の実行に失敗すると、この関数で 生成した単位テストは失敗し、該当するテストの入っているファイルの名前と、 (場合によりだいたいの) 行番号の入ったfailureException 例外を 送出します。

関数には、テストを行いたい一つまたは複数のファイルへのパスを (文字列で) 渡します。

DocFileSuite には、キーワード引数でオプションを指定できます:

オプション引数module_relativepaths に指定したファイル名を どのように解釈するかを指定します:

オプション引数 package には、 Python パッケージを指定するか、 モジュール相対のファイル名の場合には相対の基準ディレクトリとなる Python パッケージの名前を指定します。パッケージを指定しない倍、 関数を呼び出しているモジュールのディレクトリを相対の基準 ディレクトリとして使います。module_relativeFalse に指定している場合、package を指定するとエラーになります。

オプション引数 setUp には、テストスイートのセットアップに使う 関数を指定します。この関数は、各ファイルのテストを実行する前に 呼び出されます。 setUp 関数は DocTest オブジェクトに 引き渡されます。setUpglobs 属性を介してテストの グローバル変数にアクセスできます。

オプション引数 tearDown には、テストを解体 (tear-down) する ための関数を指定します。この関数は、各ファイルのテストの実行を 終了するたびに呼び出されます。tearDown関数は DocTest オブジェクトに引き渡されます。tearDown ははglobs 属性を 介してテストのグローバル変数にアクセスできます。

オプション引数 globs は辞書で、テストのグローバル変数 の初期値が入ります。この辞書は各テストごとに新たにコピーして使われ ます。デフォルトではglob は空の新たな辞書です。

オプション引数 optionflags には、テストを実行する際に デフォルトで適用される doctest オプションを OR で結合して 指定します。 5.2.6 節を参照してください。 結果レポートに関するオプションの指定する上手いやり方は 下記のset_unittest_reportflags() の説明を参照してください。

オプション引数 parser には、ファイルからテストを抽出するために 使うDocTestParser (またはサブクラス) を指定します。 デフォルトは通常のパーザ (DocTestParser()) です。

バージョン 2.4 で 新たに追加 された仕様です。

DocTestSuite( [module][, globs][, extraglobs][, test_finder][, setUp][, tearDown][, checker])
doctest のテストを unittest.TestSuite に変換します。

この関数の返すunittest.TestSuite インスタンスは、 unittest フレームワークで動作させ、モジュール内の各 doctest を実行する ためのものです。何らかの doctest の実行に失敗すると、この関数で 生成した単位テストは失敗し、該当するテストの入っているファイルの名前と、 (場合によりだいたいの) 行番号の入ったfailureException 例外を 送出します。

オプション引数 module には、テストしたいモジュールの名前を 指定します。module にはモジュールオブジェクトまたは (ドット表記の) モジュール名を指定できます。module を指定しない場合、この関数を 呼び出しているモジュールになります。

オプション引数 globs は辞書で、テストのグローバル変数 の初期値が入ります。この辞書は各テストごとに新たにコピーして使われ ます。デフォルトではglob は空の新たな辞書です。

オプション引数 extraglobs には追加のグローバル変数セットを 指定します。この変数セットは globs に統合されます。 デフォルトでは、追加のグローバル変数はありません。

オプション引数 test_finder は、モジュールから doctest を抽出 するための DocTestFinder オブジェクト (またはその代用となる オブジェクト) です。

オプション引数 setUptearDown、および optionflags は上の DocFileSuite() と同じです。

バージョン 2.3 で 新たに追加 された仕様です。

バージョン 2.4 で 変更 された仕様: globs, extraglobs, test_finder, setUp, tearDown, および optionflags パラメタを追加しました。また、この関数は doctest の検索にtestmod() と同じテクニックを使うように なりました

DocTestSuite() は水面下ではdoctest.DocTestCase インスタンスからunittest.TestSuite を作成しており、 DocTestCaseunittest.TestCase のサブクラス になっています。DocTestCase についてはここでは説明しません (これは内部実装上の詳細だからです) が、そのコードを調べてみれば、 unittest の組み込みの詳細に関する疑問を解決できるはずです。

同様に、DocFileSuite()doctest.DocFileCase インスタンスからunittest.TestSuite を 作成し、 DocFileCaseDocTestCase のサブクラス になっています。これにははっきりとした訳があります: doctest 関数を自分で実行する場合、オプションフラグを doctest 関数に渡すことで、doctest のオプションを直接操作できます。しかしながら、unittest フレームワークを書いている場合には、いつどのようにテストを動作させるかを unittest が完全に制御してしまいます。フレームワークの作者は たいてい、doctest のレポートオプションを (コマンドライン オプションで指定するなどして) 操作したいと考えますが、unittest を介して doctest のテストランナにオプションを渡す方法は 存在しないのです。

このため、doctest では、以下の関数を使って、 unittest サポート に特化したレポートフラグ表記方法もサポートしています:

set_unittest_reportflags( flags)
doctest のレポートフラグをセットします。

引数flags にはオプションフラグを OR で結合して渡します。 5.2.6 節を参照してください。「レポートフラグ」 しか使えません。

この関数で設定した内容はモジュール全体にわたる物であり、関数呼び出し 以後に unittest モジュールから実行される全ての doctest に影響します: DocTestCaserunTest() メソッド は、DocTestCase インスタンスが作成された際に、現在の テストケースに指定されたオプションフラグを見に行きます。 レポートフラグが指定されていない場合 (通常の場合で、望ましいケースです)、 doctestunittest レポートフラグが OR で 結合され、doctest を実行するために作成されるDocTestRunner インスタンスに渡されます。 DocTestCase インスタンスを構築する際に何らかのレポートフラグが 指定されていた場合、doctestunittest レポートフラグは無視されます。

この関数は、関数を呼び出す前に有効になっていたunittest レポートフラグの値を返します。

バージョン 2.4 で 新たに追加 された仕様です。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。