从 Python 中的子目录运行所有测试

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'

我究竟做错了什么?

Ren*_* B. 7

一个好的方法是从命令行在子目录中运行所有测试。为了在子目录中找到以下文件“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)


Val*_*ntz 5

不要命名您的目录unittest,它可能与标准库冲突。

您还需要创建一个__init__.py在所有目录(subfolder1等)中命名的文件,以便它们成为包并且可以导入它们的内容。


Eli*_*red 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)
Run Code Online (Sandbox Code Playgroud)

这个解决方案并不完美,每个不同的目录都作为一行输出出现,因此您必须手动查看每一行以查找失败的测试。