如何在单元测试发现器中用Shell模式匹配指定测试文件?
解决unittest测试发现器匹配指定测试文件的问题
首先明确:Python的unittest.defaultTestLoader.discover使用的是**fnmatch模块**实现Shell风格匹配,它仅支持基础通配符(*、?、[]),不支持bash的大括号扩展、正则分组这类语法,所以你之前尝试的那些模式都无法生效。
针对你的需求(仅运行test_abcd.py、test_ab1.py、test_ab3.py,排除test_ab2.py),有两种可行方案:
方案一:手动过滤测试用例
先通过默认模式获取所有测试,再筛选出需要保留的测试文件:
import unittest # 先发现所有符合默认规则的测试文件 suite = unittest.defaultTestLoader.discover('tests') # 创建空的测试套件用于存放过滤后的用例 filtered_suite = unittest.TestSuite() # 遍历原测试套件,筛选目标测试 for test_module_suite in suite: for test_case_suite in test_module_suite: # 提取测试对应的模块名(格式如:tests.test_abcd) module_name = test_case_suite.__class__.__module__ # 拆分出文件名部分(如:test_abcd) test_file_name = module_name.split('.')[-1] # 仅保留目标测试文件 if test_file_name in {'test_abcd', 'test_ab1', 'test_ab3'}: filtered_suite.addTest(test_case_suite) # 运行过滤后的测试 runner = unittest.TextTestRunner() runner.run(filtered_suite)
方案二:利用fnmatch的字符集匹配(仅适用于简单场景)
如果你的目标测试文件名有规律,可以构造匹配字符集的pattern。比如针对test_ab1、test_ab3和test_abcd,可以用:
suite = unittest.defaultTestLoader.discover('tests', pattern='test_ab[13d]*.py')
不过这个模式会匹配所有test_ab后跟着1、3或d开头的文件,如果你还有其他类似命名的测试文件(比如test_abdx.py),会被误匹配,所以仅推荐在文件名规则明确且无干扰的场景下使用。
为什么之前的模式无效?
test_{abcd,ab1,ab3}:属于bash的大括号扩展语法,fnmatch不支持。test_\(abcd|ab1|ab3\):属于正则表达式的分组或语法,fnmatch是Shell通配符,不兼容正则。test_abcd,test_ab1,test_ab3:逗号会被当作模式的一部分,无法匹配任何测试文件名。
内容的提问来源于stack exchange,提问作者ginjaemocoes
相关产品推荐
相关产品推荐

