如何配置tox,使其在代码含TODO时执行失败?
配置tox检测代码中的TODO并在存在时执行失败
当然可以!你完全可以通过配置tox,让它在检测到代码中存在TODO注释时直接执行失败,这样就能在提交代码前把这类未完成的标记拦下来。下面给你两种实用的实现方法:
方法一:直接在tox.ini中集成grep命令
这种方法最简单,不需要额外写脚本,直接利用shell命令的退出码逻辑来实现。
核心逻辑
grep命令的退出码规则是:
- 找到匹配内容时返回
0(成功) - 未找到匹配时返回
1(无错误但无结果) - 发生错误时返回
2
我们需要反转这个逻辑:当找到TODO时让命令返回非0(失败),未找到时返回0(成功)。可以用shell的!符号来反转命令的退出码。
tox.ini配置示例
[tox] envlist = py38, check-todo # 把检查TODO的环境加入到默认执行列表 [testenv] commands = pytest # 你的常规测试命令 [testenv:check-todo] basepython = python # 这里用python只是占位,实际执行的是shell命令 commands = ! grep -rnI "TODO" foodir
如果想让TODO检查和常规测试绑定在一起(每次跑测试前先检查TODO),可以把检查命令加到[testenv]的commands列表里:
[testenv] commands = ! grep -rnI "TODO" foodir pytest
方法二:用Python脚本实现更灵活的检查
如果需要更复杂的规则(比如允许带有特定标记的TODO、只检查特定类型的文件),可以写一个简单的Python脚本,让tox执行这个脚本并根据脚本的退出码判断结果。
编写检查脚本(check_todo.py)
import os import re # 自定义规则:匹配TODO,忽略大小写 TODO_PATTERN = re.compile(r'TODO', re.IGNORECASE) # 允许的例外标记:带有这个标记的TODO不会触发失败 ALLOWED_TODO_MARKER = 'ALLOWED' def check_todos(target_dir): for root, _, files in os.walk(target_dir): for file in files: # 只检查Python文件,可根据需要调整后缀 if file.endswith('.py'): file_path = os.path.join(root, file) with open(file_path, 'r', encoding='utf-8') as f: for line_num, line in enumerate(f, 1): match = TODO_PATTERN.search(line) # 如果找到TODO且不包含允许标记,输出位置并返回失败 if match and ALLOWED_TODO_MARKER not in line: print(f"❌ Found unallowed TODO in {file_path}:{line_num}") return 1 # 未找到违规TODO,返回成功 print("✅ No unallowed TODO found") return 0 if __name__ == '__main__': exit(check_todos('foodir'))
tox.ini配置示例
[tox] envlist = py38, check-todo [testenv] commands = pytest [testenv:check-todo] basepython = python commands = python check_todo.py
为什么这样可行?
tox是根据命令的退出码来判断环境执行是否成功的:只要命令返回0就视为成功,返回非0则视为失败。上面两种方法都是通过控制命令/脚本的退出码,让tox在检测到TODO时返回失败状态,从而阻止后续流程或者直接提示检查不通过,正好满足你提交前验证的需求。
内容的提问来源于stack exchange,提问作者Martin Thoma
相关产品推荐
相关产品推荐

