web-dev-qa-db-ja.com

異なるディレクトリのテストが同じと呼ばれる場合のテストの発見の失敗

Py.testを使用すると、異なるディレクトリで同じと呼ばれる2つのテストにより、py.testが失敗します。何故ですか?すべてのテストの名前を変更せずにこれを変更するにはどうすればよいですか?

複製するには:

; cd /var/tmp/my_test_module
; mkdir -p ook/test           
; mkdir -p eek/test
; touch ook/test/test_proxy.py
; touch eek/test/test_proxy.py
; py.test
============================= test session starts ==============================
platform linux2 -- Python 2.7.3 -- pytest-2.2.4
collected 0 items / 1 errors 

==================================== ERRORS ====================================
___________________ ERROR collecting ook/test/test_proxy.py ____________________
import file mismatch:
imported module 'test_proxy' has this __file__ attribute:
  /home/ygolanski/code/junk/python/mymodule/eek/test/test_proxy.py
which is not the same as the test file we want to collect:
  /home/ygolanski/code/junk/python/mymodule/ook/test/test_proxy.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
=========================== 1 error in 0.01 seconds ============================
61
Sardathrion

__init__.pyは、競合を解決する1つの方法です。ノーズとは異なり、現在のpytestは、同じインポート名でテストモジュールをインポートするためにテストモジュールをアンロードしようとしません。この自動アンインポートを行うのは少し魔法だと思っていたので、インポートメカニズムの機能に対する人々の期待を台無しにするかもしれません。時には人々はテストモジュールのグローバルな状態に依存し、自動アンロードではそれを失います(別のテストモジュールからインポートするテストモジュールは予期しないことをするかもしれません)。しかし、多分それは実用的な問題ではないので、pytestは同様のハックを追加する可能性があります...

48
hpk42

これは、py.testの実際の機能です。 pytest.org-Good Integration Practices-Chooseing the test layout/import rules に記載されているこの動作の理由を見つけることができます。

  • テストディレクトリ内の__init__.pyファイルは避けてください。このように、インストールされたパッケージにテストが含まれているかどうかに関係なく、インストールされたバージョンのmypkgに対してテストを簡単に実行できます。

それがpy.testでの作業の推奨されるワークフローであるため、pip install -eを使用して開発中のパッケージをインストールし、それをテストします。

このため、私は独自のテスト名を、設定よりも慣習的に選んでいます。また、さまざまなテスト実行出力であいまいなテスト名を取得しないようにします。

テスト名を保持する必要があり、上記の機能を気にしない場合は、__init__.pyを入れても大丈夫です。

23
famousgarkin

同じエラーが発生しましたが、ソリューションは初期化ファイルやテストファイルの名前とは関係ありませんでした。 異なるpythonバージョンmacbookおよびDockerコンテナにありました。一度テストを開始しましたコンテナのbashの代わりに、プロジェクトのルートにあるmacbookのbash。

解決策は、(コンテナのbashから)を実行して、誤って作成されたファイルを削除することでした。

find -name '*.pyc' -delete
find -name __pycache__ -delete

その後、テストを再度起動し(コンテナのbashから)、すべて正常に機能しました。

py.test
7