これが私のセットアップです-
project/
__init__.py
prog.py
test/
__init__.py
test_prog.py
私は、prog.pyのコマンドラインオプションを呼び出して単体テストを実行できるようにしたいと考えています。これにより、プロジェクトを展開するときに、単体テストをいつでも実行できるように展開できます。
python prog.py --unittest
これが機能するために、prog.py、または私のプロジェクトの残りの部分には何が必要ですか?
おそらく this があなたが探しているものでしょう。 load_tests
にtest_prog.py
関数を実装し、prog.py
に次のコードを使用して、テストをロードして実行します。
import unittest
import test.test_prog
suite = unittest.TestLoader().loadTestsFromModule(test.test_prog)
unittest.TextTestRunner().run(suite)
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
を調べたいと思うでしょう。
あなたは一貫していくつかの命名規則(あなたがそうしているようです)に従うことを確認する必要があります:
すべてのテストには同じ接頭辞(_test_
_が標準)が付けられ、その後にテストするモジュールの名前が続きます。
_prog.py
_ => _test_prog.py
_
テストは_test/
_ディレクトリにあります。
その後、次のようなことができます:
_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ファイルに対してこれを実行する必要があることに注意してください。