python 的 unittest 无法读取到测试脚本?

目录结构如下:

(image_search_engine) ╭─pon@T4GPU ~/code/work/ponponon/image_search_engine  ‹master*› 
╰─➤  tree testing                                        
testing
├── __init__.py
├── resource
│   ├── emoji001.jpg
│   ├── emoji002.jpg
│   ├── emoji003.jpg
│   └── s.jpg
├── test_meta.py
└── test_sample.py

运行测试命令

╰─➤  python -m unittest testing

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

unittest 会读取所有 test 开头的 .py 文件,但是我的两个 test_meta.py 和 test_sample.py 居然没有被读取?

但是写成 python -m unittest testing.test_samplepython -m unittest testing.test_meta 是可以的,直接 python -m unittest testing 却不行,为什么?

阅读 1k
avatarAI BotBETA

你的问题似乎在于你试图运行整个目录作为测试套件,但unittest模块并不会自动查找子目录中的测试用例。

当你运行 python -m unittest testing 时,unittest 模块会在当前目录(在这个例子中,是包含 testing 目录的父目录)中查找名为 unittest.py 或者以 test 开头的文件。然后,它会在这些文件中查找类,这些类要满足以下条件:

  • 它们是 unittest.TestCase 的子类。
  • 它们的名字以 Test 开头。
  • 它们不是私有的(即,它们的名称不以两个下划线 __ 开头)。

然后,unittest 会运行在这些类中找到的所有测试用例。

在你的例子中,unittest 没有找到任何满足这些条件的类,所以它没有运行任何测试,这就是为什么你看到 Ran 0 tests in 0.000s

你需要做什么呢?

  1. 确保你的测试类都在 unittest.py 或以 test 开头的文件中。
  2. 如果你的测试类在不同的文件中,确保你在 unittest.py 或以 test 开头的文件中导入它们。
  3. 确保你的测试类名以 Test 开头,并且不是私有的。

例如,你可以在 test_meta.pytest_sample.py 中分别有以下内容:

import unittest
from your_module import YourClass  # 从你的应用中导入你需要测试的类

class TestYourClass(unittest.TestCase):
    def test_something(self):
        # 在这里写你的测试代码
        pass

if __name__ == '__main__':
    unittest.main()

然后,在 testing 目录的父目录中创建一个 test_all.py 文件,内容如下:

import unittest
from testing import test_meta, test_sample  # 导入你的测试模块

if __name__ == '__main__':
    unittest.main()

然后,运行 python -m unittest test_all,这应该会运行你的所有测试用例。

1 个回答

unit-test-discovery

Note

As a shortcut, python -m unittest is the equivalent of python -m unittest discover. If you want to pass arguments to test discovery the discover sub-command must be used explicitly.

看文档,一旦加参数就必须用 python -m unittest discover 的形式才能自动查找测试文件。如果要指定目录的话,可能应该是: python -m unittest discover testing

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题