Python导入用于在同一个包中进行测试

时间:2013-01-28 15:48:10

标签: python unit-testing pydev

我的项目层次结构就像这样

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

或者:由于srctest代码都在同一个包fruit_pkg中,是否有更简单的方法可以访问count_fruits内的函数。

对于并行,在Java中,如果src和junit测试代码都在同一个包中,则根本不需要导入。

4 个答案:

答案 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__.pytest文件夹中放置一个空的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