python - python unittest 导入问题

标签 python python-import python-unittest

我是 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 访问 setupMyClass 模块,因此无法使用隐式相对导入来导入它们。相反,您可以在 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/

相关文章:

python - Python模块是否曾经被垃圾收集?

python - Python Flask 中的相对导入似乎不起作用

Python unittest 成功断言 None 为 False

python - 为什么从生成器内调用模拟对象无法正确测试?

python - 从图像检测圆形物体

python - 在 Windows 10 python 2.7(64 位)上安装 pypcap

python - 简单滚动平均值 - 前几个值

python - 如何删除提取并执行所需任务后提取的每个文件?

python - ImportError:没有名为 toripchanger 的模块,如何使用正确的 python 版本启动 scrapy

python - 使用 mock_open 修补函数哪里出错了?