Eli*_*red 6 python unit-testing discover subdirectory
我试图让我所有的单元测试在 Python 中运行,我的智慧结束了。我搜索了大约 30 个不同的帖子和单元测试文档,但仍然无法弄清楚。
首先,我有两个测试类,我可以单独运行每个类,并且所有测试都通过:
文件:unittest.subfolder1.TestObject1.py
class TestObject1(unittest.TestCase):
def test_case1(self):
...some code...
...some assertions...
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
文件:unittest.subfolder2.TestObject2.py
class TestObject2(unittest.TestCase):
def test_case1(self):
...some code...
...some assertions...
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
从“unittest”上方的顶级目录开始,我试图让我们unittest.discover找到并运行我的所有测试:
import unittest
loader = unittest.TestLoader()
suite = loader.discover('unittest')
unittest.TextTestRunner().run(suite)
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我收到错误 `ModuleNotFoundError: No module named 'subfolder1.TestObject1'
我究竟做错了什么?
一个好的方法是从命令行在子目录中运行所有测试。为了在子目录中找到以下文件“TestObject1.py,TestObject2.py,...”,可以在命令行中运行以下命令:
python -m unittest discover -p 'Test*.py'
Run Code Online (Sandbox Code Playgroud)
此外,__init__.py在内部需要进口和模块目录:Python的单元测试发现有子
将import unittest需要在文件unittest.subfolder1.TestObject1.py和unittest.subfolder2.TestObject2.py
也可以使用-s参数明确定义发现开始的目录:
python -m unittest discover [options]
-s directory Directory to start discovery ('.' default)
-p pattern Pattern to match test files ('test*.py' default)
Run Code Online (Sandbox Code Playgroud)
如果您使用unittest2,它带有一个脚本 unit2。命令行用法是:
unit2 discover unit2 -v test_module
Run Code Online (Sandbox Code Playgroud)
不要命名您的目录unittest,它可能与标准库冲突。
您还需要创建一个__init__.py在所有目录(subfolder1等)中命名的文件,以便它们成为包并且可以导入它们的内容。
所以我必须做我自己的解决方法,但至少我可以让它们全部使用上述文件结构运行。它要求我每次给它一个新的文件路径时都重新实例化 TestLoader 和 TestSuite,所以首先我需要收集 unittest 目录中的所有相关文件路径。
import os
import unittest
import traceback
class UnitTestLauncher(object):
def runTests(self):
#logging.INFO("Running unit tests...")
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)
Run Code Online (Sandbox Code Playgroud)
这个解决方案并不完美,每个不同的目录都作为一行输出出现,因此您必须手动查看每一行以查找失败的测试。
| 归档时间: |
|
| 查看次数: |
8368 次 |
| 最近记录: |