在 python 中运行测试文件夹中的单元测试时"ModuleNotFoundError: No module named ..."错误



我有以下文件/文件夹结构:

测试包(文件夹(src(文件夹(__init__.py模块1.py测试__init__.pytest_module1.py

仅用于清除:;模块1.py";在";src";文件夹,该文件夹位于";testpakkage";文件夹"测试";也在";testpakkage";文件夹-与"文件夹"级别相同;src";一

module1.py有一个名为"的类;类1";因此:

class class1:
def method1 (self):
print('i am method1')

test_module1.py中,我想对上面的模块运行测试。这是它的内容:

import unittest
from testpackage.src import module1
t = module1.class1()
t.method1()

这个软件包没有安装,我也不安装或提交它,我只是想为我找到最好的结构实践,为未来的软件包创建做准备。

问题是:当我从";测试";或";测试包";文件夹:

/usr/bin/python3.6 -m unittest discover

我得到以下错误:

E
======================================================================
ERROR: test_module1 (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: test_module1
Traceback (most recent call last):
File "/usr/lib64/python3.6/unittest/loader.py", line 428, in _find_test_path
module = self._get_module_from_name(name)
File "/usr/lib64/python3.6/unittest/loader.py", line 369, in _get_module_from_name
__import__(name)

类似的事情也发生在我只是试着跑";test_ module 1.py";从";测试";文件夹:

Traceback (most recent call last):
File "test_module1.py", line 5, in <module>
from testpackage.src import *
ModuleNotFoundError: No module named 'testpackage'

所以我试着把";导入";有一些替代方案,但都不起作用。每一次都是不同的尝试(不是一次全部(:

from testpackage.src import *
import testpackage.src.module1 as module1
import ..src.module1
from ..src.module1 import class1

通过搜索stackoverflow,我发现了一些解决方案,但对那些使用python 3及以上版本的人无效——这就是我的情况。

有什么建议吗?我觉得我想做的很简单,我错过了一些非常基本的东西。

我正在通过使用python3.6

我想知道您是否在一些不同的导入尝试中看到了不同的错误。不确定这是否能解决你的问题,但这是一种通常可以实现的方式。

首先,我不确定你的包的顶层应该是什么。你在src文件夹中的任何代码中引用了testpackage吗?如果是,则顶部文件夹还应该包含一个__init__.py文件。

现在,在test_module1.py文件的顶部添加:

import sys
pkg_dir = ".." # if "src" if the top level folder else "..." if testpackage is the top level folder
sys.path.append(pkg_dir)

注意必须根据模块的结构更改pkg_dir。(从你的问题我看不出来(。

此代码所做的是将包含包的顶级文件夹的文件夹添加到python导入搜索树中。这可以解决示例文件中的相对导入无法解决的问题:如果模块中的文件使用模块级导入(例如module1.py中的import testpackage.src.module2(。这在具有多个子模块的包中很常见,这些子模块交叉导入。

相关内容

  • 没有找到相关文章

最新更新