我的项目层次结构就像这样
project
src
fruit_pkg
count_fruits.py
test
fruit_pkg
test_count_fruits.py
现在在模块内count_fruits.py
说我有一个名为addition
的函数。为了测试addition
,我是否必须使用
count_fruits
模块
my_mod = __import__("fruit_pkg.count_fruits")
cnt_fruit = getattr(my_mod,"count_fruits")
然后我的测试做了类似
的事情def my_test(self):
#some work happen here
cnt_fruit.addition(blah, blah)
#more work happen here
或者:由于src
和test
代码都在同一个包fruit_pkg
中,是否有更简单的方法可以访问count_fruits
内的函数。
对于并行,在Java中,如果src
和junit测试代码都在同一个包中,则根本不需要导入。
答案 0 :(得分:1)
你必须导入模块(就像你在其他模块的命名空间中获得对模块或其任何内容的引用的方式),因为测试代码和产品代码在不同的模块中,但是你不要不必像你一样复杂。你可以:
from fruit_pkg.count_fruits import count_fruits as cnt_fruit
然后,看起来你的项目可能有一个过于复杂的结构。 Python通常倾向于比Java更平坦的组织,因此将count_fruits
方法直接放在fruit_mod
模块中而根本没有fruit_pkg
更有意义。这将使您的项目更容易导航,并且还会删除import语句中的冗余:
from fruit_mod import count_fruits
答案 1 :(得分:0)
在Python中将一个包拆分成多个路径并不是那么简单。 pkgutil.extend_path会解决问题,但要求您将此代码放入您的__init__.py
包中:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
请注意,只加载__init__.py
(PYTHONPATH)中该命名空间的第一个sys.path
。因此,您应确保构成包装的所有部件的__init__.py
相同。
总而言之,这很容易出错,我建议您重新组织代码,然后将测试放入各自独立的命名空间中。使用__path__
包裹进行摆弄可能会引起很多麻烦。
答案 2 :(得分:0)
如果您使用py.test,则必须在__init__.py
和test
文件夹中放置一个空的test/fruit_pkg
,然后在test_fruit_counts.py
内导入您的模块以你想要的任何方式,例如
from src.fruit_pkg.count_fruits import *
答案 3 :(得分:0)
除非fruit_pkg
是命名空间包;它只能从一个目录中获得。请查看sys.modules['fruit_pkg']
以找出哪一个。
您可以将测试移至src/fruit_pkg/test/test_count_fruits.py
,或者不要使用相同的顶级名称来测试软件包。
无论哪种方式,导入模块:
from fruit_pkg import count_fruits