Python: 单元测试模块和相对导入

4

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

\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中最常规的方法吗?


我强烈建议不要在代码测试中使用相对导入。 - Amber
那他们将会去哪里呢?把测试模块放在子包中会强制执行相同的导入语句,不是吗? - zhuyxn
通常情况下,您不会将测试放在包中,而是放在一个单独的目录树中。 - Amber
如果项目运行时间较长,过一段时间后,相对导入会变得混乱不堪(特别是如果您想要重构)...最好始终使用完整的包路径,并确保您的顶级包在PYTHONPATH中。 - Sam Daniel
1个回答

1

这里有一个技巧*
在run_everything中使用以下代码将路径“subpackage”和“test”插入到您的Python路径中:

    import sys
    sys.path.insert(0, '/path/to/package/subpackage')
    sys.path.insert(0, '/path/to/package/test')

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

    import work, work1, work2
    import test_work, test_work1

*这不会永久影响您的PYTHONPATH。


许多人更喜欢将新路径放在 PYTHONPATH 的开头,例如 sys.insert(0,'/path/to/pkg'),这样如果该软件包也安装到了 site-packages 中,你的测试可以从 /path/to/ 导入模块的版本。 - snim2
1
我认为你的意思是 sys.path.insert(0,'/path/to/pkg') - mc_electron
@snim2 重要观察!已更新答案以反映最新情况。 - Yeow_Meng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接