2012-09-25 13 views
42

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

は行います__init__.pyを置く

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

答えて

30

は、紛争を解決する一つの方法です。鼻とは異なり、現在のpytestは同じインポート名のテストモジュールをインポートするためにテストモジュールをアンロードしようとしません。私は、この自動unimportingを行うにはちょっとした魔法だと思っていましたし、インポートメカニズムが何をするのかという人々の期待を台無しにするかもしれません。人がテストモジュールのグローバルな状態に頼っている場合や、自動アンロードで失った場合(別のテストモジュールから読み込んだテストモジュールが予期せぬことが起こる可能性があります)しかし実際には問題ではないので、pytestは同様のハックを追加する可能性があります。

+2

__init__.pyを必要とすることは意味があると私は同意します。テストがパッケージに含まれていない場合は、本質的にトップレベルのモジュール(OPのtest_proxy)であり、テストは1つだけでなければなりません。テストモジュールを適切なパッケージ(ookとeek)に入れることによって、テストの適切な名前空間を提供します。現状は最高だと言います。この質問へのエラーメッセージのリンクや、問題を回避するための推論とテクニックを説明するドキュメントの何かに、痛みを緩和するかもしれません。 –

+20

py.test docsは、テストディレクトリに '__init __。py'を置くことを特に勧めています:_" __init __。py'ファイルをテストディレクトリに置かないでください。この方法は、インストールされたバージョンのmypkgに対して簡単に実行できます。インストールされたパッケージにテストが含まれているかどうかとは無関係に "_。 [pytest.org - Good Integration Practices](http://pytest.org/latest/goodpractises.html#choosing-a-test-layout-import-rules)を参考にしてください。 – famousgarkin

+1

アップデート:上記の@ famousgarkinのコメントとanswer(https://stackoverflow.com/a/21942491/260303)の推奨事項は、もはやドキュメントには表示されません(少なくとも「回避」を検索すると見積もりが表示されません上記):https://docs.pytest.org/en/latest/goodpractices.html#tests-as-part-of-application-code実際、そのリンクの例では、テストディレクトリに '__init __。py'と表示されているので、受け入れられた答えが正しいと思われます。 –

14

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

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

はpy.testでの作業の推奨ワークフローです:それをテストし、その後、pip install -eで開発中のパッケージをインストールします。

このため、私は構成上の規則で独自のテスト名を選択しました。また、さまざまなテスト実行出力であいまいなテスト名を取得しないようにします。

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

+0

私はユースケースを手に入れません: "あなたのテストはインストールされたバージョンのmypkgに対して簡単に実行できます"。開発版のmypkgに対してテストを行います。このようにテストが存在します。この "一意のbasename"エラーメッセージを避けるために、 '__init __。py'ファイルを作成します。 – guettli

+1

私は、ドキュメントを変更するための機能リクエストを作成しました:https:// bitbucket。org/hpk42/pytest/issue/529/unique-basename-and -__ init__py-docs – guettli

+1

@guettliユースケースは、setup.pyでインストールしたパッケージをテストする場合です。これは、バンドルされたデータのように、すべての必要なファイルをインストールに含めることと、すべての依存関係が正しく処理されるようにするために使用できます。ターゲットシステムにコンパイラがなく、インストールにバイナリの卵やホイールを使用する環境にインストールすることもできます。 –

関連する問題