我正在编写某种自动化测试套件,我想确保包''tests'中包含的类在运行时在主命名空间中自动导入,而不是将它们添加到__init__
文件中。包裹。
所以这是我到目前为止的脚本:
import os
for dirpath, dirnames, filenames in os.walk('tests'):
for filename in filenames:
if filename.lower().endswith(('.pyc', '__init__.py')): continue
module = ".".join([dirpath, filename.split('.')[0]])
print module
如果我使用modulename = __import__(module)
,则会将类添加到模块“modulename”而不是主命名空间。
我的问题是,如何将它们导入当前命名空间?
所以我可以这样做:
testcase = TestCase()
testcase.run()
results = testcase.results()
或主脚本中的任何内容,而不显式导入类。
提前致谢!
谢谢大家回复并试图帮助我。
答案 0 :(得分:3)
要从某个模块获取课程,可以有更好的方法,但这里是通用的方式来帮助你开始
mod = __import__("mod")
for klass in vars(mod):
o = getattr(mod, klass)
if type(o) == type:
print o
答案 1 :(得分:1)
答案 2 :(得分:0)
我不完全理解需要,因为您可以收集所有模块并通过测试用例类进行迭代
但是如果你想在当前范围内获取所有名称 使用像
这样的东西execfile("mod.py")
它会将mod.py中定义的所有分类纳入范围
答案 3 :(得分:0)
您可以在扫描目录中的每个模块名称的格式化字符串上使用exec:
exec "from %s import *" % moduleName
答案 4 :(得分:0)
将此代码放在测试包的__init__.py中,它将导入当前包和子包中的所有测试。
import pkgutil
import unittest
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
module = loader.find_module(module_name).load_module(module_name)
for name in dir(module):
obj = getattr(module, name)
if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
exec ('%s = obj' % obj.__name__)
正如其他人所说,如果你试图发现所有的测试,那么有更好的方法。
答案 5 :(得分:0)
而不是使用__import__
并将其分配给像这样的变量
modulename = __import__(module)
请改用importlib.import_module
,不要指定它:
import importlib
importlib.import_module(module)
至少在Python 3.4上,这很好用。