2017-07-15 8 views
0

私はプログラミングに若干の新しさを感じていますが、私のプログラムのほとんどは単一ディレクトリの仕事でしたが、今はもっと大きなものを試してみたいと思います。 。私はpytestを使ってユニットテストを作成し、test_foo.pyファイルのユニットテスト定義の後に独立したテストスクリプトを置いています。 __init__.pyファイルを追加するまで、これはうまく動作します。pytestはPythonシェルとは異なるインポート文を必要とする場合があります

ファイルの配置import card as crdを使用して1

StackOverflow 
| card.py 
| test_card.py 

test_card.py輸入カード。

結果:私は同じ、$ python3 test_card.pyはまだ動作import文を残したが、$ pytest被った場合:どちらも次のコマンドのははImportError

$ python3 test_card.py 
$ pytest 

ファイルの配置に2

StackOverflow 
| __init__.py 
| card.py 
| test_card.py 

の検索結果を受けませんImportError。

代わりにimport StackOverflow.card as crdを使用すると、pytestは再び動作を開始しますが、ImportErrorが原因でスクリプトとして実行できません。

この例では__init__.pyファイルは必要ありませんが、大きなプログラムの一部に過ぎません。 2番目のimport文は単なる間違っていることも指摘されています。では、pytestに元のimport文を使用するにはどうすればよいですか? card.pyの

本文:

#Created by Patrick Cunfer 
#2017-07-15 


class Card(object): 
    def __init__(self, value, suit): 
     ''' 
     Sets the card's value and suit 
     param value: An integer from 1 to 13 
     param suit: A character representing a suit 
     ''' 
     self.value = value 
     self.suit = suit 


    def __str__(self): 
     return str(self.value) + " of " + str(self.suit) 

test_card.py

#Created by Patrick Cunfer 
#2017-07-15 


# First one breaks pytest, second one breaks shell 
# import card as crd 
# import StackOverflow.card as crd 


def test_Card(): 
    test = crd.Card(5, 'S') 
    assert test.value == 5 
    assert test.suit == 'S' 
    assert str(test) == "5 of S" 
    del test 


if __name__ == "__main__": 
    #Unit test found a bug? Lets isolate it! 

    print("Test 1") 
    test = crd.Card(5, 'S') 

    print(test.suit) 
    print("Expect 'S'") 
    print() 

    #etc. 

答えて

0

の全文あなたはあなたのケースで__init__.pyを使用したい場合は、の親ディレクトリのパスを追加する必要がStackOverflowを次のようにsysに追加します。

import sys 
project_dir = 'path to the parent dir of StackOverflow' 
sys.path.append(project_dir) 

あなたの現在のimport StackOverflow.card as crd文はあなたがStackOverflowディレクトリ自体の内部StackOverflowという名前の別のディレクトリを持っていることを意味しimport StackOverflow.card as crd


を使用することができるようになります。あなたは内部の別のスクリプトをインポートしているので、あなたのケースでは、あなたが、__init__.pyを使用する必要はありません、とにかく

StackOverflow 
    | test_card.py 
    | StackOverflow 
     | __init__.py 
     | card.py 

:あなたのディレクトリの構造を想定しているimport文は、(あなたのケースではないです)このようになりますインポート元のディレクトリと同じです。 __init__.pyは通常、ディレクトリの外にスクリプトをインポートするために使用されます。

このlinkには、__init__.pyファイルの使用方法に関するドキュメントがあります。

+0

私はこの例ではinitファイルは必要ないと知っていますが、私の実際のプログラムではそうしています。 –

+0

私の答えはあなたの質問またはエラーに対処しましたか? – otayeby

+0

部分的には、import文の使用方法に関する混乱が解消されましたが、pytestがそのように使用されても機能しないという事実には対処できませんでした。私のファイル構造はあなたの答えが描写されているようには見えません(私は再確認しました)。 –

関連する問題