在Python中运行来自子目录的所有测试
在Python中运行来自子目录的所有测试
我在尝试让所有的Python单元测试运行时遇到了困境。我已经搜索了大约30个不同的帖子和单元测试文档,但仍然无法弄清楚问题所在。\n首先,我有两个测试类,我可以分别运行每个类,并且所有的测试都通过了:\n文件:unittest.subfolder1.TestObject1.py\n
class TestObject1(unittest.TestCase): def test_case1(self): ...一些代码... ...一些断言... if __name__ == '__main__': unittest.main()
\n文件:unittest.subfolder2.TestObject2.py\n
class TestObject2(unittest.TestCase): def test_case1(self): ...一些代码... ...一些断言... if __name__ == '__main__': unittest.main()
\n从上级目录开始,我尝试使用`unittest.discover`来查找并运行所有的测试:\n
import unittest loader = unittest.TestLoader() suite = loader.discover('unittest') unittest.TextTestRunner().run(suite)
\n当我这样做时,我收到了错误消息“ModuleNotFoundError: No module named \'subfolder1.TestObject1\'”。\n我做错了什么?
问题的出现原因:
该问题的出现是因为在Python中,unittest默认只能运行指定目录下的测试文件,无法自动递归运行子目录中的测试文件。
解决方法:
为了解决这个问题,可以通过重新实例化TestLoader和TestSuite,并将每个子目录的测试文件路径传递给它们。具体的解决方法如下:
1. 首先,需要收集unittest目录中所有相关文件路径。可以使用os.walk()函数遍历unittest目录下的所有子目录,并将不包含"pycache"且不为'unittest'的路径添加到lsPaths列表中。
2. 然后,通过循环遍历lsPaths列表中的每个子目录路径,对每个子目录重新实例化TestLoader和TestSuite,并使用loader.discover()方法来自动发现该子目录下的所有测试文件。
3. 最后,使用unittest.TextTestRunner().run(suite)来运行每个子目录下的测试文件,并将结果输出到控制台。
这个解决方法并不完美,因为每个不同目录的测试结果都会以一行输出,需要手动查看每行的失败测试。
以下是具体的代码实现:
import os import unittest class UnitTestLauncher(object): def runTests(self): lsPaths = [] # Find all relevant subdirectories that contain unit tests # Exclude 'unittest' directory, but include subdirectories, with code `path != 'unittest'` for path, subdirs, files in os.walk('unittest'): if "pycache" not in path and path != 'unittest': lsPaths.append(path) # loop through subdirectories and run individually for path in lsPaths: loader = unittest.TestLoader() suite = unittest.TestSuite() suite = loader.discover(path) unittest.TextTestRunner().run(suite)
通过以上的解决方法,我们可以实现在Python中递归地运行子目录中的所有测试文件。
在Python中运行所有子目录中的测试的原因是,如果目录名为unittest
,它可能与标准库冲突。此外,您还需要在所有目录(subfolder1
等)中创建一个名为__init__.py
的文件,以使它们成为包并可以导入它们的内容。从unittest
目录直接运行测试似乎不可行,但是从unittest.subdirectory
运行单元测试没有问题。初始化文件没有起到帮助作用。我创建了一个解决方法,并将其发布在论坛上。
解决方法如下所示:
import unittest import os def run_tests_from_subdirectories(test_folder): loader = unittest.TestLoader() suite = loader.discover(test_folder, pattern='test*.py') runner = unittest.TextTestRunner() runner.run(suite) if __name__ == '__main__': test_folder = os.path.dirname(os.path.abspath(__file__)) run_tests_from_subdirectories(test_folder)
该解决方法通过使用unittest.TestLoader()
来发现指定目录中的测试文件,并使用unittest.TextTestRunner()
来运行测试套件。它将遍历子目录并运行每个子目录中的测试文件。这种方法可以在任何子目录中运行测试,而不仅仅是unittest.subdirectory
。
希望这个解决方法能够帮助到您在Python中运行所有子目录中的测试!
运行Python中子目录中的所有测试的原因是想要在命令行中运行子目录中的所有测试。为了在子目录中找到"TestObject1.py, TestObject2.py, ..."等文件,可以在命令行中运行以下命令:
python -m unittest discover -p 'Test*.py'
此外,在import和module目录中需要有__init__.py
文件: Python unittest discovery with subfolders
在unittest.subfolder1.TestObject1.py和unittest.subfolder2.TestObject2.py文件中也需要import unittest
语句。
还可以使用-s参数来显式地定义发现开始的目录:
python -m unittest discover [options] -s directory Directory to start discovery ('.' default) -p pattern Pattern to match test files ('test*.py' default)
如果使用unittest2,它附带了一个名为unit2的脚本。命令行使用方式如下:
unit2 discover unit2 -v test_module
但是这对我来说没有起作用。我从顶级目录、我的单元测试目录上一级目录、我的单元测试目录以及我导航到一个包含测试文件的单独文件夹中运行了您的命令。每次都收到消息:Ran 0 tests in 0.000s
此外,在import和module目录中需要有__init__.py
文件。