获取当前包中所有模块的列表

时间:2009-02-17 05:02:45

标签: python unit-testing module packages python-2.5

这就是我想要做的:我想构建一个测试套件,它被组织成包,例如tests.ui,tests.text,tests.fileio等。在每个__ init __中。在这些包中,我想制作一个包含该包中所有模块中所有测试的测试套件。当然,可以使用unittest.TestLoader完成所有测试,但似乎我必须单独添加每个模块。因此,假设test.ui具有编辑器_窗口_ test.py和预览_窗口_ test.py,我希望__ init {{ 1}}。py导入这两个文件并获取两个模块对象的列表。我的想法是,我想自动制作测试套件,以便我不会忘记在测试套件中包含一些内容。

最好的方法是什么?这似乎很容易,但我找不到任何东西。

我正在使用Python 2.5顺便说一句。

3 个答案:

答案 0 :(得分:2)

从我们的django项目解决这个问题:

"""Test loader for all module tests
"""
import unittest
import re, os, imp, sys

def find_modules(package):
    files = [re.sub('\.py$', '', f) for f in os.listdir(os.path.dirname(package.__file__))
             if f.endswith(".py")]
    return [imp.load_module(file, *imp.find_module(file, package.__path__)) for file in files]

def suite(package=None):
    """Assemble test suite for Django default test loader"""
    if not package: package = myapp.tests # Default argument required for Django test runner
    return unittest.TestSuite([unittest.TestLoader().loadTestsFromModule(m)
                               for m in find_modules(package)])

if __name__ == '__main__':
    unittest.TextTestRunner().run(suite(myapp.tests))
编辑:与bialix解决方案相比的好处是,您可以将此加载器放置在项目树中的任何位置,无需在每个测试目录中修改 init .py。

答案 1 :(得分:2)

这里的答案很好,但最好的要做的事情就是使用第三方测试发现和跑步者:

  • Nose(我最喜欢的)
  • Trial(非常好,尤其是在测试异步内容时)
  • py.test(在我看来不太好)

它们都与plain unittest.TestCase兼容,您不必以任何方式修改测试,也不必使用其中任何一项的高级功能。只是用作套件发现。

您是否有特殊原因需要重新发明这些库中令人讨厌的东西?

答案 2 :(得分:1)

您可以使用os.listdir查找test。*目录中的所有文件,然后过滤掉.py文件:

# Place this code to your __init__.py in test.* directory
import os
modules = []
for name in os.listdir(os.path.dirname(os.path.abspath(__file__))):
    m, ext = os.path.splitext()
    if ext == '.py':
        modules.append(__import__(m))
__all__ = modules

魔术变量__file__包含当前模块的文件路径。尝试

print __file__

检查。