这就是我想要做的:我想构建一个测试套件,它被组织成包,例如tests.ui,tests.text,tests.fileio等。在每个__
init __
中。在这些包中,我想制作一个包含该包中所有模块中所有测试的测试套件。当然,可以使用unittest.TestLoader完成所有测试,但似乎我必须单独添加每个模块。因此,假设test.ui具有编辑器_
窗口_
test.py和预览_
窗口_
test.py,我希望__
init {{ 1}}。py导入这两个文件并获取两个模块对象的列表。我的想法是,我想自动制作测试套件,以便我不会忘记在测试套件中包含一些内容。
最好的方法是什么?这似乎很容易,但我找不到任何东西。
我正在使用Python 2.5顺便说一句。
答案 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)
这里的答案很好,但最好的要做的事情就是使用第三方测试发现和跑步者:
它们都与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__
检查。