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

时间:2017-06-22 19:51:31

标签: python unit-testing subdirectory discover

我最终试图让我的所有单元测试在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'

我做错了什么?

4 个答案:

答案 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(), ...)