我最终试图让我的所有单元测试在Python中运行。我搜索了大约30个不同的帖子和单元测试文档,但仍然无法弄明白。
首先,我有两个测试类,我可以单独运行每个测试类,所有测试都通过:
文件:unittest.subfolder1.TestObject1.py
class TestObject1(unittest.TestCase):
def test_case1(self):
...some code...
...some assertions...
if __name__ == '__main__':
unittest.main()
文件:unittest.subfolder2.TestObject2.py
class TestObject2(unittest.TestCase):
def test_case1(self):
...some code...
...some assertions...
if __name__ == '__main__':
unittest.main()
从上面的顶级目录开始' unittest'我正在向我们unittest.discover
寻找并运行我的所有测试:
import unittest
loader = unittest.TestLoader()
suite = loader.discover('unittest')
unittest.TextTestRunner().run(suite)
当我这样做时,我收到错误`ModuleNotFoundError:No module named' subfolder1.TestObject1'
我做错了什么?
答案 0 :(得分:1)
不要将目录命名为unittest
,它可能与标准库冲突。
您还需要在所有目录(__init__.py
等)中创建名为subfolder1
的文件,以便它们成为包,并且可以导入其内容。
答案 1 :(得分:1)
所以我不得不做自己的解决方法,但至少我可以让它们全部运行上面的文件结构。它要求我每次给它一个新的文件路径时重新实例化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)
这个解决方案并不完美,每个不同的目录都是一行输出,所以你必须手动浏览每一行以查看失败的测试。
答案 2 :(得分:1)
一种好方法是从命令行在子目录中运行所有测试。要在子目录中找到以下文件“TestObject1.py,TestObject2.py,...”,可以在命令行中运行以下命令:
python -m unittest discover -p 'Test*.py'
此外,导入和模块目录中需要 __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
答案 3 :(得分:0)
老问题了,哦,如此最新。我是Python的新手,来自强大的类型化语言,尽管该语言本身还不错,但使生态系统中的所有功能正常运行的约定,工具和变通办法会让您发疯。我在从单独的子目录运行单元测试中挣扎,这就是我解决问题的方法。 首先,将您要测试的代码打包到一个包中。像这样组织目录:
Work
|
+---PkToTest
| |
| +--- __init__.py
| +--- a.py
| +--- <other modules>.py
|
+---Tests (for PKToTest)
|
+--- test_a.py
PkToTest由于 init .py文件而成为软件包。在test_a.py中,确保您的sys.path将包含PkToTest的路径(绝对路径不是相对路径)。我是这样做的:
import sys
sys.path.insert(0, "<absolute path to parent of PkTotest directory>")
import unittest
from PkToTest import a
class aTestSuite(unittest.TestCase):
def test1(self):
self.assertEqual(a.fnToTest(), ...)