0

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

最好的方法是什么?看起来这将是一件容易的事情,但我没有找到任何东西。

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

4

3 回答 3

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。

于 2009-02-17T06:37:56.083 回答
2

这里有很好的答案,但最好的办法是使用 3rd 方测试发现和运行器,例如:

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

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

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

于 2009-02-17T08:36:55.720 回答
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__

去检查。

于 2009-02-17T06:20:25.830 回答