直接跑 combo_02 的8种组合全部返回 code: 0。pytest 中看到的 403 可能是 token 在跑完 combo_01(33秒/32个请求)后接近过期。建议:
跑前先登录刷新 token:执行 python testcase/xxx/auto_login_test.py
combo_01 跑了 33秒/32个请求,token 刚好在这之后过期
combo_02 开始就全线 403都返回权限错误
Token 是 _load_token() 在 conftest.py 加载时一次性获取的,跑完整套用例期间不会刷新。如果 token 有效期较短(比如 30 分钟),跑完前几组组合后就会失效。
每个组合测试开始前等待 2秒。效果:
combo_01 (33s) → sleep(2s) → combo_02 (17s) → sleep(2s) → combo_03 …
登录接口需要租户 header 才能直接调用。Token 是通过 Playwright UI 登录获取的(走 登录 SSO),有效期由后端 SSO 控制,登录响应中未返回过期时间字段。
从企业 SSO 的常见配置来看,这类 token 一般 30分钟~2小时。你的测试跑了:
- combo_01: 33秒
- combo_02: 17秒(开始403)
✽间隔太短不太可能是 token 自然过期。更可能是 combo_01 大量请求触发了频率限制,后续请求被服务端拦截返回 403。
建议:跑测试前加个小间隔,●Token 有效期是 SSO 服务端控制的,客户端无法延长。但可以加一个 自动续期机制:每次测试前检查 token 是否有效,无效时自动重新登录。
通过账号密码登录,更新全局 TOKEN,直接去读conftest.py文件
总结一下 conftest.py 的 Token 自动续期机制:
核心变更:
┌───────────────────────────────┬────────────────────────────────────────────────────────────┐
✽│ 机制 ↓ │ 说明 │
├───────────────────────────────┼────────────────────────────────────────────────────────────┤
│ TOKEN_REFRESH_INTERVAL = 1200 │ 每 20分钟 自动重新登录刷新 │
├───────────────────────────────┼────────────────────────────────────────────────────────────┤
│ _get_token() │ 获取 token 时检查是否超时,超时自动刷新 │
├───────────────────────────────┼────────────────────────────────────────────────────────────┤
│ _refresh_token() │ 清除模块缓存,强制重新加载 auto_login_test.py 获取新 token │
├───────────────────────────────┼────────────────────────────────────────────────────────────┤
│ _verify_token() │ 调用轻量接口验证 token 是否有效 │
├───────────────────────────────┼────────────────────────────────────────────────────────────┤
│ ensure_valid_token() │ 对外暴露的方法,测试方法可调用确保 token 有效 │
└───────────────────────────────┴────────────────────────────────────────────────────────────┘
工作流程:
测试启动 →首次加载 token
↓
每个组合测试前 sleep(2s)
↓
_get_token() 检查: 距上次登录 > 20分钟?
├─ 否 →返回缓存 token
└─ 是 →自动重新登录,刷新 token
build_headers() 现在每次调用都通过 _get_token() 动态获取最新 token,不再依赖模块加载时的静态值。
**
conftest.py 的 token 管理逻辑已优化为三步走:
阶段1: 验证现有 token
├─ 有效 → 直接使用(复用缓存)✅
└─ 无效 → 阶段2
├─ 有效 → 直接使用(复用缓存)✅
└─ 无效 → 阶段2
阶段2: 刷新 token
├─ 成功 → 使用新 token ✅
└─ 失败 → 阶段3
阶段3: 重新登录
└─ 强制调用 auto_login_test.get_token() 重新登录
触发时机:
- conftest.py 模块加载时自动执行 _init_token()
- 测试运行前调用 ensure_valid_token()
- build_headers() 每次请求前调用 _get_token()(20分钟内复用缓存)