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文件的文档。

以上是 pytest需要与python shell不同的导入语句有时 的全部内容, 来源链接: utcz.com/qa/263434.html

回到顶部