超时主因是ci资源失控,集中于依赖安装、测试串行和异步等待三处:pip需缓存+镜像源+禁用--user;pytest须装pytest-xdist并用-n auto;异步测试要配pytest-asyncio和--timeout=30。

超时不是 pytest 本身慢,而是 CI 环境里没控住资源消耗和执行节奏——最常卡在依赖安装、测试串行、异步等待这三处。
pip install -r requirements.txt 拉包阶段就超时
PyPI 限流、镜像源不稳定、或含 numpy/torch 类大包时,单次 pip install 动辄 2–3 分钟,极易触发 GitLab CI 默认 10 分钟 job 超时。
- 必须启用 pip 缓存:
paths中加~/.cache/pip/,且 key 要带 hash(如$CI_COMMIT_REF_SLUG-$CI_PIPELINE_ID),否则缓存不命中 - 禁用
--user:CI Runner 没权限写用户目录,pip install --user会静默失败,日志里只显示 “Successfully installed”,实际没装上 - 换国内镜像源:在
before_script里加pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pytest tests/ 串行跑满 CPU 却不并行
默认 pytest 是单进程顺序执行,100 个测试用例可能耗时 90 秒;但加 -n auto 后通常压到 25 秒内——前提是没被 fixture 或全局状态拖垮。
- 先装插件:
pip install pytest-xdist(别漏掉) - 用
pytest -n auto,不是-n 4:auto 能自动适配 runner 的 CPU 核数,硬写数字反而在低配 runner 上起反效果 - 避开 session/module 级 fixture:比如一个数据库连接设成
scope="session",所有测试都得排队等它,-n auto就白开了
asyncio.TimeoutError 或 Selenium 元素等待卡死
这类错误不会报错退出,而是挂住直到 job 超时——因为 pytest 默认不设单测超时阈值,IO 阻塞就一直等。
- 给异步测试加
pytest-asyncio+--asyncio-mode=strict,再配合pytest --timeout=30(需装pytest-timeout) - Selenium 测试禁用
time.sleep():换成WebDriverWait(driver, 10).until(...),超时抛异常,pytest 能捕获并终止 - CI 中禁用无限制重试:比如
pytest-rerunfailures插件若配了--reruns 3,一个失败用例会卡 3×10 秒,直接冲破阈值
真正容易被忽略的是:超时日志里往往只显示 “Job failed due to timeout”,但根本原因藏在前一步——比如 pip 安装花了 8 分钟,剩下 2 分钟留给 pytest,哪怕你写了 -n auto 也来不及跑完。盯紧每个 stage 的耗时分布,比调大 timeout 更治本。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











