【问题标题】:Python: Unit Testing Module and Relative ImportsPython:单元测试模块和相关导入
【发布时间】:2012-08-08 19:34:30
【问题描述】:

目前有以下文件层次结构:

\package
    __init__.py
    run_everything.py

    \subpackage
        __init__.py
        work.py
        work1.py
        work2.py

    \test
        __init__.py
        test_work.py
        test_work1.py

我的第一个问题是关于相对进口的。假设在 \subpackage\work.py 中有一个名为 custom_function() 的函数,我想在 test_work.py 中测试该函数。出于某种原因,我无法弄清楚如何从一个模块导入到另一个模块。尝试from .. subpackage.work1 import custom_function() 似乎不起作用,并产生错误Attempted relative import in non-package 有没有办法解决这个问题?

2) 我想用一个函数从 run_everything.py 运行所有测试文件,会在每个 test_work*.py 文件中添加一个 suite() 函数,它将每个 unit_testing 类添加到 suite.addTest(unittest.makeSuite(TestClass)),并且最终将它们导入顶级 run_everything.py 是 Python2.7 中最常规的方式吗?

【问题讨论】:

  • 我强烈建议不要使用相对导入,尤其是在测试中。
  • 那么他们会去哪里呢?将测试模块放在子包中会强制使用相同的导入语句吗?
  • 通常您根本不会将测试放在包中,而是放在单独的目录树中。
  • 如果它是一个长期运行的项目,一段时间后它会因相对导入而变得混乱(特别是如果你想重构)......拥有完整的包路径并确保你的顶级包总是更好在 PYTHONPATH 中

标签: python unit-testing python-packaging


【解决方案1】:

这是一个技巧*
使用以下命令将“子包”和“测试”的路径插入到 run_everything 中的 python 路径:

导入系统 sys.path.insert(0, '/path/to/package/subpackage') sys.path.insert(0, '/path/to/package/test')

然后,您可以在 run_everything 中使用 vanilla 导入来导入所有文件:

导入工作,工作1,工作2 导入 test_work, test_work1

*这不会永久影响您的 PYTHONPATH。 *不要忘记对我的硬编码投反对票:(

【讨论】:

  • 很多人喜欢将新路径放在PYTHONPATH 的开头,例如sys.insert(0, '/path/to/pkg') 这样,如果包也安装到站点包中,您的测试将从/path/to/ 导入模块的版本。
  • 我想你的意思是sys.path.insert(0,'/path/to/pkg')
  • @snim2 重要观察!更新了答案以反映。
猜你喜欢
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多