安全测试需杜绝敏感信息泄露:fixture禁用明文读取配置,改用占位符;自定义异常类隐藏敏感字段;数据库连接使用唯一临时库名并确保清理;断言采用正则匹配与明确脱敏值校验。

fixture里直接读配置文件会泄露敏感信息
测试代码运行时如果从config.py或.env里直接读DB_PASSWORD、API_KEY,CI日志、失败堆栈、甚至pytest的--capture=no输出都可能暴露明文。这不是“理论上可能”,而是CI流水线里真实发生过的事故。
- 别在fixture函数体里调用
os.getenv("SECRET_KEY")——环境变量在CI中常被打印为调试信息 - 别用
pytest.config(已弃用)或request.config传敏感值——配置对象本身可能被repr进日志 - 真正安全的做法是:让fixture只接收脱敏后的占位符,真实值由CI系统注入且绝不落地到代码/日志
用pytest的--tb=short + 自定义异常类隐藏敏感字段
即使配置读取出错,错误堆栈也不能带出密码片段。Python默认的KeyError或ValueError会把整个字典repr出来,包括"password": "xxx"这种键值对。
- 写一个轻量级异常类
ConfigRedactedError,__str__方法返回固定提示,不拼接原始数据 - 在fixture里用
try/except捕获原始异常,raiseConfigRedactedError("failed to load DB config") - 加
pytest --tb=short参数,避免长traceback里混入敏感上下文
测试数据库连接必须用临时随机库名+自动清理
本地跑pytest时如果连的是共享开发库,一条DELETE FROM users就可能误删同事数据;而用test_db这种固定库名,多个CI job并发执行会冲突。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- fixture生成唯一库名:
f"test_{int(time.time())}_{random.randint(1000,9999)}" - 用
sqlalchemy.create_engine建连接后,立刻engine.execute("CREATE DATABASE ...")(注意权限) - 务必在
yield前加try/finally,确保DROP DATABASE执行——否则CI节点磁盘迟早爆掉
敏感字段断言要用正则匹配而非字符串包含
比如验证返回JSON里"token"字段是否脱敏,写assert "ey" in resp["token"]看似简单,但一旦token格式变更(比如JWT换成UUID),测试就失效,还可能误把真实token当脱敏结果放过。
立即学习“Python免费学习笔记(深入)”;
- 用
re.fullmatch(r"[a-zA-Z0-9_\-]{20,40}", resp["token"])明确长度和字符集 - 对密码字段,断言
resp["password"] == "[REDACTED]"比not resp["password"]更可靠——空字符串可能是bug,不是脱敏 - 所有脱敏逻辑必须有对应单元测试,且测试用例要覆盖边界值:空字符串、None、超长字符串

















