73

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 ============================
4

3 に答える 3

63

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

于 2012-09-26T11:03:54.770 に答える
26

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

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

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

このため、私自身は、構成よりも慣習に従って、一意のテスト名を選択しています。また、さまざまなテスト実行出力であいまいなテスト名が表示されないようにします。

テスト名を保持する必要があり、上記の機能を気にしない場合は、__init__.py.

于 2014-02-21T18:34:58.683 に答える