2009-02-17 37 views
0

以下是我想要做的事情:我想构建一个测试套件,该套件组织到诸如tests.ui,tests.text,tests.fileio等包中。在每个__ init __ .py在这些包中,我想做一个测试套件,包含该包中所有模块中的所有测试。当然,使用unittest.TestLoader可以完成所有的测试,但似乎必须单独添加每个模块。所以假设test.ui编辑器_窗口_ test.py和预览_窗口_ test.py,我想要__初始化__ .py导入这两个文件并获得两个模块对象的列表。我的想法是,我想自动制作测试套件,这样我就不会忘记在测试套件中包含某些东西。获取当前包中所有模块的列表

这样做的最好方法是什么?这似乎是一件容易的事情,但我没有找到任何东西。

我使用Python 2.5 btw。

+0

近似复制http://stackoverflow.com/questions/912025/how-to-find-all-child-modules-in-python – 2011-09-01 07:59:41

回答

2

很好的答案,但最好要做的是使用第三方的测试发现和亚军,如:

  • Nose(我的最爱)
  • Trial(相当不错的,特别是当测试异步的东西)
  • py.test(那么好,在我看来)

他们AR所有与普通unittest.TestCase兼容,你不必以任何方式修改你的测试,你也不必使用它们中的高级特性。仅用作套件发现。

是否有一个特定的原因,你想重新发明这些库中的讨厌的东西?

1

您可以使用os.listdir找到在测试中的所有文件*目录,然后过滤掉.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__ 

检查。

+0

(它有点unpythonic自动导入像OP想要的子模块。在__init__.py中放入`import a,b,c`就简单了)。无论如何,缺少步骤: `modules.append(__ import __(name))`,然后`__all__ = modules`。 – 2009-02-17 06:27:32

+0

你是对的,修好了。 – bialix 2009-02-17 06:32:42

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的解决方案是,你可以把这个装载机anytwhere项目树,没有必要修改初始化 .py在每个测试目录中。

这里
相关问题