首页 > 解决方案 > Python 的 unittest 库如何匹配通过 -p 参数传递的模式?

问题描述

我正在运行以下命令以仅运行位于名为的文件中的测试test_CO2.py

python3.7 -m unittest discover -s some_path/tests/ -p "*CO2*"

我的文件夹结构如下所示:

some_path/tests/
  CO2
    test_CO2.py
  battery
    test_battery.py
  tank
    test_tank.py

我想指定运行的测试。例如,如果我只想测试水箱和 CO2 代码,我该怎么做?我想通过以下正则表达式: \w*(CO2|tank)\w*.py找不到任何测试。

我认为传递给-p选项的模式不接受正则表达式。那么如何指定我希望运行的测试呢?

标签: pythonregexpython-3.xpython-unittest

解决方案


通常,您通过-p参数传递的所有内容都unittest通过TestLoader::_match_path()方法处理,然后调用函数链fnmatch()fnmatchcase()_compile_pattern()translate()from fnmatchlibrary

translate()函数将您的原始-p参数转换为正则表达式,然后用于名称匹配。

函数的文档fnmatch()说明了这一点:

Patterns are Unix shell style:
*       matches everything
?       matches any single character
[seq]   matches any character in seq
[!seq]  matches any char not in seq

据我所知,这就是它可以做的程度。所有其他字符都被转义以进行字面匹配

示例:a|b我将正则表达式作为模式传递。该translate()函数以 形式返回最终的正则表达式(?s:p\|m)\Z。在那里,管道字符被转义了

如果您特别好奇,请在此处fnmatch查看lib 的translate()功能- 如果您想知道将“glob-like”模式转换为最终正则表达式的确切过程。


推荐阅读