从兄弟目录导入模块以在py.test中使用

7
我有问题在测试文件中使用py.test运行时,无法导入任何内容。
我的项目结构如下:
/ProjectName
|
|-- /Title
|    |-- file1.py
|    |-- file2.py
|    |-- file3.py
|    |-- __init__.py
|
|-- /test
|    |-- test_file1.py

我无法在pytest中的test_file1.py文件中使用任何导入语句,因此目前只尝试使用在file_1.py中声明的变量,并在运行test_file1.py时将其打印出来。

file1.py包含:

file1_variable = "Hello"

test_file1.py包含以下内容:

import sys
import os
sys.path.append(os.path.abspath('../Title'))
import file1

def test_something():
    assert file1.file1_variable == "Hello"

print(file1.file1_variable)

我从https://dev59.com/qGkv5IYBdhLWcg3w6k1Q#10272919中获取了我的测试文件的导入语句,该语句通过编辑PYTHONPATH变量来实现。这使得我可以运行test_file1.py脚本并成功执行print语句。

然而,在/ProjectName目录下尝试运行py.test时,会出现一个错误,提示ImportError: No module named 'file1'

有没有什么方法可以更好地结构化事物,使得pytest成为可能?我需要在__init__.py文件中添加一些内容吗?

1个回答

3
不需要在__init__.py中添加任何内容。这个文件告诉Python将父目录视为可导入的模块,详见 此处说明。只需将其添加到您的Title目录中,并像以下方式导入即可:
from ..Tiltle.file import file1_variable

这里我们向上移动一个目录层级,就像使用cd..命令一样。

注意:..用于从test目录到达Title包。如果你需要从ProjectName目录运行你的文件,你将需要执行以下操作:

from Tiltle.file import file1_variable

1
可以了,非常感谢。我想我只是误解了分层导入语句的结构。但是,如果file1.py中有导入语句,似乎我的pytest会再次遇到错误。例如,假设file1.py从file2.py导入某个函数,则运行pytest将显示没有名为file2.py的模块。我是否需要在测试文件中显式声明每个导入语句? - Shinkawa91

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接