-1

我的项目层次结构是这样的

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 中,如果 thesrc和 junit 测试代码都在同一个包中,则根本不需要导入。

4

4 回答 4

1

您必须导入模块(因为这是您在另一个模块的命名空间中获取对模块或其任何内容的引用的方式),因为测试代码和产品代码位于不同的模块中,但您没有以像你一样复杂的方式来做。你可以:

from fruit_pkg.count_fruits import count_fruits as cnt_fruit

再说一次,看起来您的项目结构可能过于复杂。Python 通常比 Java 更喜欢扁平化的组织,所以很有可能将count_fruits方法直接放在fruit_mod模块中而不是完全有 可能更有意义fruit_pkg。这将使您的项目更易于导航,并消除导入语句中的冗余:

from fruit_mod import count_fruits
于 2013-01-28T16:06:09.370 回答
0

在 Python 中将一个包拆分为多个路径并不是那么简单。pkgutil.extend_path可以解决问题,但需要您将此代码放入您__init__.py的包中:

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

请注意,仅加载 (PYTHONPATH)__init__.py中该名称空间的第一个。sys.path因此,您应该确保__init__.py构成您的包裹的所有部分都相同。

总而言之,这很容易出错,我建议您重新组织代码并将测试放入自己单独的命名空间中。摆弄__path__一个包裹会引起很多麻烦。

于 2013-01-28T16:07:41.023 回答
0

如果您使用的是py.test__init__.py ,则必须在testandtest/fruit_pkg文件夹中放置一个空文件,然后test_fruit_counts.py以任何您想要的方式导入您的模块,例如

from src.fruit_pkg.count_fruits import *
于 2013-01-28T16:10:49.483 回答
0

除非fruit_pkg是命名空间包;它只能从一个目录中获得。看看sys.modules['fruit_pkg']就知道是哪一个了。

您可以将测试移至src/fruit_pkg/test/test_count_fruits.py或不使用相同的顶级名称来测试包。

无论哪种方式,要导入模块:

from fruit_pkg import count_fruits
于 2013-01-28T16:12:22.807 回答