为什么import *不能运行导入的代码?

2024-06-25 23:57:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件夹,里面有我所有的单元测试。它们都包括:

if __name__ ==  '__main__':
    unittest.TextTestRunner(verbosity=2).run(suite())

所以为了测试它们,我只需要导入测试脚本。我有一个test-unall脚本,它通过一个接一个地导入单元测试来完成所有的单元测试。当前如下所示:

^{pr2}$

这意味着每当我添加或删除一个新的测试时,我都需要更改导入。所以我想用

^{3}$

但是,这不会运行任何代码。为什么我不输入代码。 另外,如果有人知道一个解决方案(即note nose)来运行所有的单元测试,而不必逐个导入它们,这将是非常好的。在

谢谢
尼克


Tags: run代码nametest脚本文件夹ifmain
3条回答

如果使用python 2.7,则可以使用命令行:

python -m unittest discover

这将自动查找并执行所有子目录中的所有测试。有关更多选项,请参见:

^{pr2}$

这个模块已经后传到Python2.3+,可以下载here。如果使用后台端口,则包含一个名为unit2或unit2.py(您可以选择)的命令行脚本,调用方式如下:

unit2.py discover

至于from XXX import *,这实际上导入了文件XXX/__init__.py名称空间中的所有内容。将以下代码放入__init__.py中以自动加载任何直接子模块:

import os

all_files = os.listdir(os.path.dirname(__file__))
modules = [x for x in all_files if x.endswith(".py") and not x.startswith("_")]
__all__ = [x.rpartition(".")[0] for x in modules]

有关如何工作的详细说明可以在python docs for the ^{} global variable中找到。在

对于解释器正在读取的初始python文件,__name__仅设置为"__main__"。这允许在执行if __name__ == "__main__":之后由其他模块导入模块,而不需要代码。在

任何不受if __name__ == "__main__":保护的代码都将被执行。所以您可以在每个文件中删除它,然后当您执行导入操作时,unittest.TextTestRunner(verbosity=2).run(suite())将被执行。在

更好的方法是使用unittest.TestLoader()中的方法将测试加载到一个套件中,然后将该套件交给unittest.TextTestRunner。这样,就可以自动化加载程序,而无需更改测试文件中的导入。在目录结构中添加一个测试文件,测试将自动执行。在

运行所有测试的最简单方法(不使用外部工具)可能是使用TestLoader.discover。在

相关问题 更多 >