探索性测试
Added in version 3.2.
unittest 支持简单的测试发现。 为了与测试发现兼容,所有测试文件都必须是可从项目的最高层级目录导入的 模块 或 包 (这意味着它们的文件名必须是有效的 标识符)。
探索性测试在 TestLoader.discover() 中实现,但也可以通过命令行使用。它在命令行中的基本用法如下:
cd project_directory python -m unittest discover
备注
方便起见, python -m unittest
与 python -m unittest discover
等价。如果你需要向探索性测试传入参数,必须显式地使用 discover
子命令。
discover
有以下选项:
-v, --verbose
更详细地输出结果。
-s, --start-directory directory
开始进行搜索的目录(默认值为当前目录 .
)。
-p, --pattern pattern
用于匹配测试文件的模式(默认为 test*.py
)。
-t, --top-level-directory directory
指定项目的最上层目录(通常为开始时所在目录)。
-s ,-p 和 -t 选项可以按顺序作为位置参数传入。以下两条命令是等价的:
python -m unittest discover -s project_directory -p "*_test.py" python -m unittest discover project_directory "*_test.py"
正如可以传入路径那样,传入一个包名作为起始目录也是可行的,如 myproject.subpackage.test
。你提供的包名会被导入,它在文件系统中的位置会被作为起始目录。
小心探索性测试通过导入测试对测试进行加载。在找到所有你指定的开始目录下的所
有测试文件后,它把路径转换为包名并进行导入。如 foo/bar/baz.py
会被导入为 foo.bar.baz
。
如果你有一个全局安装的包,并尝试对这个包的副本进行探索性测试,可能会从错误的地方开始导入。如果出现这种情况,测试会输出警告并退出。
如果你使用包名而不是路径作为开始目录,搜索时会假定它导入的是你想要的目录,所以你不会收到警告。
测试模块和包可以通过 load_tests protocol 自定义测试的加载和搜索。
在 3.4 版本发生变更: 测试发现支持初始目录下的 命名空间包。注意你也需要指定顶层目录(例如:python -m unittest discover -s root/namespace -t root
)。
在 3.11 版本发生变更: 在 Python 3.11 中 unittest 丢弃了 命名空间包 支持。 它自 Python 3.7 就已不可用。 包含测试的起始目录和子目录都必须是具有 __init__.py
文件的常规包。
包含起始目录的目录仍然可以是命名空间包。 在此情况下,你需要以带点号的包名称来显式地指明起始目录和目标目录。 例如:
# proj/ <-- current directory # namespace/ # mypkg/ # __init__.py # test_mypkg.py python -m unittest discover -s namespace.mypkg -t .