使用nose

时间:2015-06-15 09:54:24

标签: python git-submodules nose

我们使用git子模块在团队中共享公共模块。

每个模块在其源文件夹中都有测试用例,并由nose运行。

我有一个这个结构的项目:

/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时,测试通过。

看起来像鼻子在subpackage(project_sample)的父文件夹中找到 init .py文件,当我从project_sample的根目录运行nosetests时,我得到{{ 1}}。但是当我将第一行更改为:

时,它就通过了
"ImportError: No module named subpackage"

但这种方式使得子包不是自包含的。

我尝试了一些方法:将子包添加到from project_sample.subpackage import moduleB 或使用sys.path选项的鼻子,但仍然会遇到此异常。

我的队友在PyCharm中单独运行子包的测试用例并通过,所以我认为应该有一些方法让它从命令行传递。

有没有办法解决问题,或者有任何关于项目结构的建议?

这是我关于SO的第一个问题,任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:0)

如果您希望子包装是自包含的,则需要将其视为自包含。这意味着您需要将其置于顶层,与project_sample平行,而不是放入其中。

答案 1 :(得分:0)

我知道这个问题有点老了,已经有人回答了,但我们在代码库中使用了不同的策略。

如果出于某种原因,您仍然需要 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 来处理,因此我们希望它们不需要运行。