运行 在带鼻子的子模块中测试时导入错误
import error when run tests in submodule with nose
我们使用 git 子模块在我们的团队中共享公共模块。
每个模块在其源文件夹中都有测试用例,并且 运行 通过鼻子。
我有一个采用这种结构的项目:
/project_sample
|__/project_sample
| |__ __init__.py
| |__ moduleA.py
| |__/tests
| | |__ __init__.py
| | |__ moduleA_tests.py
| |__/subpackage
| |__ __init__.py
| |__ moduleB.py
| |__/tests
| |__ __init__.py
| |__ moduleB_tests.py
|__setup.py
所有这些 init.py 文件都是空的。
子包单独开发,由git子模块添加到项目中。我们希望它是独立的,并尝试在不同的项目中共享它。它的测试用例是这样的:
moduleB_tests.py:
from subpackage import moduleB
def test_funcA():
moduleB.funcA()
当我从子包的 repo 文件夹中 运行 nosetests
时测试通过。
好像鼻子在子包(project_sample)的父文件夹中找到了一个init.py文件,当我运行nosetests
从 project_sample 的根目录,我得到 "ImportError: No module named subpackage"
。但是当我将第一行更改为:
时它通过了
from project_sample.subpackage import moduleB
但是这种方式使得分包不自包含。
我尝试了一些方法,例如:将子包添加到 sys.path
或使用 nose 的 -w
选项,但仍然出现此异常。
我的队友运行在PyCharm中单独分包的测试用例并通过了,所以我认为应该有一些方法可以让它通过命令行。
有什么方法可以解决这个问题,或者对项目结构有什么建议吗?
这是我关于 SO 的第一个问题,欢迎任何建议。
如果你希望子包是独立的,你需要这样对待它。这意味着你需要把它放在顶层,平行于 project_sample
而不是进入它。
我知道这个问题有点老了,已经有人回答了,但我们在代码库中使用了不同的策略。
如果出于某种原因你仍然想要 project_sample 模块目录中的包,你可以像这样构建它:
/project_sample
|__/project_sample
| |__ __init__.py
| |__ moduleA.py
| |__/tests
| | |__ __init__.py
| | |__ moduleA_tests.py
| |__/subpackage_repo
| |__/subpackage
| |__ __init__.py
| |__ moduleB.py
| |__/tests
| |__ __init__.py
| |__ moduleB_tests.py
| |__setup.py
|__setup.py
如果子包中没有 __init__.py
,它将不会成为您项目的一部分。
然后在主包的__init__.py
中,可以包含
import os
import sys
sys.path.insert(0,
os.path.join(
os.path.dirname(os.path.dirname(__file__)),
'subpackage_repo')
)
import subpackage
将子包放在主项目的路径中。
然后在 moduleA.py
中允许我们做类似
的事情
from . import subpackage
因为包是在 __init__.py
级别导入的。
当然,您也可以将其提升一个级别,如果您想这样做,只需将其反映在您要添加的路径中即可。这样做的唯一缺点是当你 运行 你的测试用
python -m unittest discover
您还会发现子包测试以及 运行 那些。理想情况下,这些测试应该与您对包的任何 CI 一起处理,所以我们希望它们不需要 运行.
我们使用 git 子模块在我们的团队中共享公共模块。
每个模块在其源文件夹中都有测试用例,并且 运行 通过鼻子。
我有一个采用这种结构的项目:
/project_sample
|__/project_sample
| |__ __init__.py
| |__ moduleA.py
| |__/tests
| | |__ __init__.py
| | |__ moduleA_tests.py
| |__/subpackage
| |__ __init__.py
| |__ moduleB.py
| |__/tests
| |__ __init__.py
| |__ moduleB_tests.py
|__setup.py
所有这些 init.py 文件都是空的。
子包单独开发,由git子模块添加到项目中。我们希望它是独立的,并尝试在不同的项目中共享它。它的测试用例是这样的:
moduleB_tests.py:
from subpackage import moduleB
def test_funcA():
moduleB.funcA()
当我从子包的 repo 文件夹中 运行 nosetests
时测试通过。
好像鼻子在子包(project_sample)的父文件夹中找到了一个init.py文件,当我运行nosetests
从 project_sample 的根目录,我得到 "ImportError: No module named subpackage"
。但是当我将第一行更改为:
from project_sample.subpackage import moduleB
但是这种方式使得分包不自包含。
我尝试了一些方法,例如:将子包添加到 sys.path
或使用 nose 的 -w
选项,但仍然出现此异常。
我的队友运行在PyCharm中单独分包的测试用例并通过了,所以我认为应该有一些方法可以让它通过命令行。
有什么方法可以解决这个问题,或者对项目结构有什么建议吗?
这是我关于 SO 的第一个问题,欢迎任何建议。
如果你希望子包是独立的,你需要这样对待它。这意味着你需要把它放在顶层,平行于 project_sample
而不是进入它。
我知道这个问题有点老了,已经有人回答了,但我们在代码库中使用了不同的策略。
如果出于某种原因你仍然想要 project_sample 模块目录中的包,你可以像这样构建它:
/project_sample
|__/project_sample
| |__ __init__.py
| |__ moduleA.py
| |__/tests
| | |__ __init__.py
| | |__ moduleA_tests.py
| |__/subpackage_repo
| |__/subpackage
| |__ __init__.py
| |__ moduleB.py
| |__/tests
| |__ __init__.py
| |__ moduleB_tests.py
| |__setup.py
|__setup.py
如果子包中没有 __init__.py
,它将不会成为您项目的一部分。
然后在主包的__init__.py
中,可以包含
import os
import sys
sys.path.insert(0,
os.path.join(
os.path.dirname(os.path.dirname(__file__)),
'subpackage_repo')
)
import subpackage
将子包放在主项目的路径中。
然后在 moduleA.py
中允许我们做类似
from . import subpackage
因为包是在 __init__.py
级别导入的。
当然,您也可以将其提升一个级别,如果您想这样做,只需将其反映在您要添加的路径中即可。这样做的唯一缺点是当你 运行 你的测试用
python -m unittest discover
您还会发现子包测试以及 运行 那些。理想情况下,这些测试应该与您对包的任何 CI 一起处理,所以我们希望它们不需要 运行.