web-dev-qa-db-ja.com

Pythonプログラムからコマンドラインオプションを介してunittestを実行する

これが私のセットアップです-

project/
    __init__.py
    prog.py
    test/
        __init__.py
        test_prog.py

私は、prog.pyのコマンドラインオプションを呼び出して単体テストを実行できるようにしたいと考えています。これにより、プロジェクトを展開するときに、単体テストをいつでも実行できるように展開できます。

python prog.py --unittest

これが機能するために、prog.py、または私のプロジェクトの残りの部分には何が必要ですか?

20
RyPeck

おそらく this があなたが探しているものでしょう。 load_teststest_prog.py関数を実装し、prog.pyに次のコードを使用して、テストをロードして実行します。

import unittest
import test.test_prog
suite = unittest.TestLoader().loadTestsFromModule(test.test_prog)
unittest.TextTestRunner().run(suite)
11
amillerrhodes

Python unittestモジュールには独自の test discovery 関数が含まれており、コマンドラインから実行できます:

$ python -m unittest discover

モジュール内からこのコマンドを実行するには、subprocessモジュールを使用できます。

#!/usr/bin/env python

import sys
import subprocess

# ...
# the rest of your module's code
# ...

if __name__ == '__main__':
    if '--unittest' in sys.argv:
        subprocess.call([sys.executable, '-m', 'unittest', 'discover'])

モジュールに他のコマンドラインオプションがある場合、より詳細なオプションについて argparse を調べたいと思うでしょう。

46
Jace Browning

あなたは一貫していくつかの命名規則(あなたがそうしているようです)に従うことを確認する必要があります:

  1. すべてのテストには同じ接頭辞(_test__が標準)が付けられ、その後にテストするモジュールの名前が続きます。

    _prog.py_ => _test_prog.py_

  2. テストは_test/_ディレクトリにあります。

その後、次のようなことができます:

prog.py

_import sys
...
... do module stuff here...
...

if __name__ == "__main__":

    # Check if we want to run the tests for this file
    if "--unittest" in sys.argv:
        import unittest

        test_filename = 'test_' + __file__
        test_directory = 'test'

        suite = unittest.TestLoader().discover(test_directory, pattern=test_filename)
        unittest.TextTestRunner(verbosity=2).run(suite)
_

私たちがしていることは、

  • コマンド引数をチェックして、_--unittest_が存在するかどうかを確認します(テストを実行するのはこのときだけです)。

  • そうであれば、設定した命名規則に従って_test_prog.py_を作成します。

  • 次に、それをTestLoader().discover関数に渡します。

    discover(...) は指定されたディレクトリから開始し、指定されたパターンに一致するすべてのテストモジュール(サブディレクトリに再帰)を見つけます。

    この場合、_test/_ディレクトリ内で_test_prog.py_という名前のモジュールを探します。実行すると、それがロードされ、実行するTestCaseを使用してTestSuiteが作成されます。

  • 最後に、手動でunittestをテストして、前のステップで取得したsuiteを実行します。


通常、unittestはこれをすべてバックグラウンドで実行しますが、特定のテストモジュールを実行しようとしているため、どのようにしてどこから取得するかを正確に指示する必要があります。

また、これを実行するeveryファイルに対してこれを実行する必要があることに注意してください。

10
Carlos V