Python导入以测试具有其他依赖项的模块

时间:2018-07-02 21:39:21

标签: python python-3.x testing python-import

我想将测试与程序包代码放在一个单独的文件夹中,这样我就可以从项目的顶层目录中运行python sample/run.pypython tests/test_run.py,并使它们都解决所有问题。正确导入。

我的目录结构如下:

sample/
   __init__.py
   helper.py
   run.py
tests/
   context.py
   test_run.py

我知道应该有很多方法可以实现这一目标,如此处所述:Python imports for tests using nose - what is best practice for imports of modules above current package

但是,当我尝试运行python tests/test_run.py时,会为'helper'得到 ModuleNotFoundError ,因为'sample / run.py'会导入'sample / helper.py'。< / p>

特别是,我尝试遵循使用以下命令显式修改路径的约定(在Hitchhiker's Guide to Python中建议)。

import os, sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

结果,我有一个空白的sample/__init__.py以及以下代码文件。

sample / run.py:

from helper import helper_fn
def run():
    helper_fn(5)
    return 'foo'
if __name__ == '__main__':
    run()

sample / helper.py:

def helper_fn(N):
    print(list(range(N)))

tests / context.py:

import os, sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

import sample

tests / test_run.py:

from context import sample
from sample import run

assert run.run() == 'foo'

所以我有两个问题:

  1. 为什么Python无法找到'helper'模块?
  2. 如何解决问题,以便可以从顶级目录同时运行 sample/run.pytests/test_run.py

1 个答案:

答案 0 :(得分:2)

编辑:

要同时使sample/run.pytests/test_run.py正常工作,应将sample目录的路径添加到python路径中。因此,您的tests/context.py应该是

import os, sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../sample')))


import sample

此更改将使Python知道helper模块的路径。


sample/run.py应该是:

  from .helper import helper_fn
  def run():
     helper_fn(5)
     return 'foo'
  if __name__ == '__main__':
     run()

软件包3中的隐式相对导入在Python 3中不可用。请检查以下内容:

  

已对导入系统进行了更新,以完全实施PEP 302的第二阶段。不再有任何隐式导入机制-完整的导入系统通过sys.meta_path公开。此外,还实现了本地名称空间包支持(请参阅PEP 420)。 link

documentation可能有助于理解包装内参考。