Pytest用例收集阶段异常缓慢且受WiFi连接影响问题求助
pytest收集阶段异常卡顿排查方案
第一步:定位耗时卡点
- 执行收集阶段专用命令观察阻塞位置:
pytest --collect-only -vvs,输出会实时打印当前正在处理的测试文件、插件逻辑,直接定位卡住的具体环节 - 开启pytest耗时统计:
pytest --collect-only --durations=0 --durations-min=0.001,会按耗时从高到低输出收集阶段所有操作的耗时,直接锁定最高耗时的调用 - 用性能采样工具生成调用栈火焰图:运行
py-spy record -o profile.svg -- pytest --collect-only,火焰图可直观看到卡在哪行代码、哪个函数中
第二步:排查网络关联阻塞逻辑
该问题和网络环境强相关,优先排查该模块
- 逐一枚举禁用pytest插件验证:先执行
pytest --trace-config查看所有已加载的pytest插件,然后按pytest --collect-only -p no:插件名的格式逐个禁用测试,排查是否是第三方插件存在隐含的联网请求逻辑 - 检查全局配置文件的hook逻辑:重点排查项目根目录、用户目录下的
conftest.py文件中pytest_sessionstart、pytest_collect_file等收集阶段触发的钩子函数,是否包含内网资源请求、私有源校验、license联网验证之类的逻辑,这类逻辑在可连通内网的特定WiFi/热点下会快速返回,其他网络下会等待DNS超时 - 对比本地网络配置:检查
/etc/hosts文件、本地DNS服务器配置,是否存在仅内网可访问的域名解析规则,在外部网络下DNS请求超时导致阻塞
第三步:系统层面排查(针对M1 Mac特有问题)
- 检查本地代理、安全软件规则:确认是否有全局代理、终端代理、安全软件的进程网络拦截规则,在特定网络环境下规则触发导致请求挂起
- 校验Python二进制签名:运行
codesign -vvv $(which python)检查Python的签名状态,M1的安全机制会对未签名的二进制做在线证书校验,无网络/外部网络下会等待校验超时 - 对比环境变量差异:执行
env命令对比你和其他正常同事的环境变量,重点排查HTTP_PROXY、PYPI_INDEX、公司内部服务相关的环境变量,是否指向仅特定网络可访问的地址
内容的提问来源于stack exchange,提问作者Carl Sala
相关产品推荐
相关产品推荐

