我是 python 新手,并试图让单元测试工作,但测试文件中的导入不起作用。 文件夹结构:
toyProjects
└── pythonProj
├── mainpack
│ ├── __init__.py
│ ├── MyClass.py
│ └── setup.py
└── tests
├── __init__.py
└── test_MyClass.py
MyClass.py:
class MyClass:
def __init__(self, x):
self.x = x
def someMethod(self):
print("Called MyClass.someMethod");
设置.py:
def myFunction():
print("Called setup.myFunction");
test_MyClass.py:
import unittest
import setup
from MyClass import MyClass
class TestMyClass(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.my = MyClass(4);
def test_something(self):
self.my.someMethod();
setup.myFunction();
万一重要的是:pythonProj 中有一个 mainfile.py (上图中未显示,因为我认为它不相关),它运行良好并找到所有文件。其内容为:
from mainpack import setup
from mainpack.MyClass import MyClass
print("Program start");
setup.myFunction()
myInst = MyClass(4);
myInst.someMethod();
我运行测试
cd toyProjects\pythonProj\tests
python -m unittest test_MyClass.py
我尝试了 here 中的几乎所有解决方案。和this page说“网络上的许多资源都会让你摆弄你的 sys.path,但在大多数情况下,这是一种代码味道,表明你没有正确使用模块和/或包。”,所以希望我能学习正确的方法这样做(但如果没有其他解决方案,我将使用 sys.path。只是到目前为止,我尝试过的所有版本都不起作用。)
更具体地说,我在 test_MyClass 文件中尝试了不同类型的导入:
import setup -->ModuleNotFoundError: No module named 'setup'
from MyClass import MyClass -->ModuleNotFoundError: No module named 'MyClass'
from mainpack import setup -->ModuleNotFoundError: No module named 'mainpack'
from ..mainpack import setup -->Unresolved reference mainpack
import mainpack -->ModuleNotFoundError: No module named 'mainpack'
from mainpack.setup import someFunction -->Unresolved reference mainpack
from .. import mainpack -->ImportError: attempted relative import with no known parent package
最佳答案
要使包可导入,它必须位于 PATH
环境变量指定的目录之一中。由于 PATH
中没有 pythonProj
目录,因此您可以从该目录运行脚本,因为 python 会自动将当前工作目录添加到 PATH
运行脚本时。
由于无法从 PATH
访问 setup
和 MyClass
模块,因此无法使用隐式相对导入来导入它们。相反,您可以在 test_MyClass.py
中使用绝对导入:
导入设置
-> 从主包导入设置
from MyClass import MyClass
-> from mainpack.MyClass import MyClass
然后您可以运行测试:
cd toyProjects/pythonProj
python -m unittest tests/test_MyClass.py
关于python - python unittest 导入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75203642/