単純な Python モジュールでも、ユニット テストを独自のtest
ディレクトリに分離するのが一般的なディレクトリ構造のようです。
new_project/
antigravity/
antigravity.py
test/
test_antigravity.py
setup.py
etc.
私の質問は、単に、テストを実際に実行する通常の方法は何ですか?これは私以外のすべての人には明らかだと思いますが、モジュールがパス上にないため、python test_antigravity.py
テスト ディレクトリから実行することはできません。import antigravity
PYTHONPATH やその他の検索パス関連のトリックを変更できることはわかっていますが、それが最も簡単な方法だとは思えません。開発者であれば問題ありませんが、テストが合格するかどうかを確認したいだけのユーザーにそれを使用することを期待するのは現実的ではありません。
他の方法としては、テスト ファイルを別のディレクトリにコピーするだけですが、これは少し愚かな方法のように思えますし、そもそもテスト ファイルを別のディレクトリに置くことの意味を理解していないことになります。
では、新しいプロジェクトのソースをダウンロードしただけの場合、単体テストをどのように実行しますか? ユーザーに「単体テストを実行するには、X を実行してください」と伝えられるような回答を希望します。
ベストアンサー1
私の意見では、最善の解決策はunittest
コマンドラインインターフェースこれにより、ディレクトリが追加されるのでsys.path
、追加する必要はありません (TestLoader
クラスで実行されます)。
たとえば、次のようなディレクトリ構造の場合:
new_project
├── antigravity.py
└── test_antigravity.py
次のコマンドを実行するだけです:
$ cd new_project
$ python -m unittest test_antigravity
あなたのようなディレクトリ構造の場合:
new_project
├── antigravity
│ ├── __init__.py # make it a package
│ └── antigravity.py
└── test
├── __init__.py # also make test a package
└── test_antigravity.py
パッケージ内のテスト モジュールでは、通常どおりパッケージとそのモジュールtest
をインポートできます。antigravity
# import the package
import antigravity
# import the antigravity module
from antigravity import antigravity
# or an object inside the antigravity module
from antigravity.antigravity import my_object
単一のテスト モジュールを実行する:
この場合、単一のテスト モジュールを実行するには、次のようにしますtest_antigravity.py
。
$ cd new_project
$ python -m unittest test.test_antigravity
インポートするのと同じ方法でテスト モジュールを参照するだけです。
単一のテスト ケースまたはテスト メソッドを実行する:
TestCase
また、単一のテスト メソッドを実行することもできます。
$ python -m unittest test.test_antigravity.GravityTestCase
$ python -m unittest test.test_antigravity.GravityTestCase.test_method
すべてのテストを実行しています:
使用することもできますテスト検出すべてのテストを検出して実行します。テストはモジュールまたはパッケージの名前である必要がありますtest*.py
(フラグで変更できます-p, --pattern
)。
$ cd new_project
$ python -m unittest discover
$ # Also works without discover for Python 3
$ # as suggested by @Burrito in the comments
$ python -m unittest
これにより、パッケージtest*.py
内のすべてのモジュールが実行されますtest
。
ここの更新された公式ドキュメントを見つけることができますdiscovery
。