33

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

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

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

python prog.py --unittest

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

4

4 に答える 4

69

Pythonモジュールには、コマンド ラインから実行できるunittest独自のテスト検出関数が含まれています。

$ 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モジュールに他のコマンド ライン オプションがある場合は、より高度なオプションを調べる必要があります。

于 2013-05-31T21:21:05.000 に答える
11

いくつかの命名規則に一貫して従うことを確認する必要があります (これを行っているようです)。

  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。実行すると、それがロードされ、実行したい TestCases を含む TestSuite が作成されます。

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


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

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

于 2013-05-31T21:13:36.147 に答える
0

.ideaファイルシステムのプロジェクトの下にある隠しディレクトリを削除しました。

PyCharmを再起動し、プロジェクトを再度開いたところ、この問題は解決しました。

于 2020-12-02T22:48:55.183 に答える