1. ホーム
  2. パイソン

[解決済み】典型的なテストディレクトリ構造でunittestを実行する

2022-03-23 13:53:45

質問

シンプルなPythonモジュールであっても、非常に一般的なディレクトリ構造は、ユニットテストをそれ自身の test ディレクトリを作成します。

new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.

例えば、こんな感じです。 PythonプロジェクトHowto .

私の質問は、簡単に言うと 実際にテストを実行するのは、どのような方法が一般的なのでしょうか? 私以外には当たり前のことなのでしょうけど、単に python test_antigravity.py は、test ディレクトリからその import antigravity は、モジュールがパス上にないため失敗します。

PYTHONPATHやその他の検索パスに関するトリックを修正できることは知っていますが、それが最もシンプルな方法であるとは思えません。

他の選択肢としては、テストファイルを別のディレクトリにコピーすればいいのですが、ちょっと間抜けな感じですし、そもそも別のディレクトリに置くという意味がずれているように思います。

では、私の新しいプロジェクトのソースをダウンロードした場合、どのようにユニットテストを実行するのでしょうか?私は、ユーザーに「ユニットテストを実行するにはXを実行してください」と言えるような回答が望ましいと思います。

解決方法は?

私の考える最良の解決策は 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

テストモジュールを1つ実行する。

単一のテストモジュールを実行するには、この場合 test_antigravity.py :

$ cd new_project
$ python -m unittest test.test_antigravity

テストモジュールをインポートするのと同じ方法で参照するだけです。

単一のテストケースまたはテストメソッドを実行する。

また、1つの 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 パッケージを使用します。