pytest需要与python shell不同的导入语句有时

pytest需要与python shell不同的导入语句有时

问题描述:

我对编程有些新鲜感,到目前为止,我的大部分程序都是单一的目录事务,但现在我想尝试更大的东西,而且我无法使导入工作。我使用pytest来创建我的单元测试,并且在我的test_foo.py文件中的单元测试定义之后,我一直使用独立测试脚本。这工作正常,直到我添加__init__.py文件。如果使用import card as crd test_card.py进口卡pytest需要与python shell不同的导入语句有时

文件安排1

StackOverflow 
| card.py 
| test_card.py 

结果:无论以下命令挨一个ImportError

$ python3 test_card.py 
$ pytest 

文件的安排2

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

结果:如果我离开import语句一样,$ python3 test_card.py仍然有效,但$ pytest遭受的导入错误。

如果我改用import StackOverflow.card as crd pytest重新开始工作,但由于ImportError,我无法将其作为脚本运行。

我意识到在本例中我不需要__init__.py文件,但它只是大型程序的一部分。还有人指出,第二项进口声明显然是错误的。那么我怎样才能用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. 

全文如果你想使用__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


您当前import StackOverflow.card as crd语句的意思是,你有一个名为StackOverflowStackOverflow目录本身内部的其他目录; import语句是假设你的目录结构看起来是这样的(这不是你的情况下):

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

不管怎样,在你的情况,你不需要使用__init__.py,因为你是内导入另一个脚本您从中导入的相同目录。 __init__.py通常用于在目录之外导入脚本。

在此link中,您可以找到有关如何使用__init__.py文件的文档。

+0

我知道我不需要这个例子的init文件,但是对于我的真实程序,我是这样做的。 –

+0

我的回答是否解决了您的问题或错误? – otayeby

+0

部分地,它解决了我对于应该如何使用import语句的困惑,但它没有解决pytest在以这种方式使用时不起作用的事实。我的文件结构看起来不像你的回答描述(我重新检查)。 –