Ruby 2.7.4环境下Rspec运行无输出卡住问题该如何排查?
调试方案
第一步 定位卡住的具体测试用例
- 运行
rspec --format documentation启动测试,该命令会逐行打印当前执行的测试用例名称,直接定位到执行后无输出的具体测试 - 定位到对应用例后,单独执行该用例验证可复现:
rspec 测试文件路径:行号
第二步 实时抓取进程调用栈
- 测试卡住后,执行
ps aux | grep rspec拿到rspec进程的PID - 执行
kill -3 <PID>,Ruby进程收到该信号会直接打印当前所有线程的调用栈到终端,直接定位到卡住的代码位置,该方法无需提前加调试参数,适合无报错的卡死场景
第三步 兼容问题排查(匹配当前依赖版本)
- rspec-rails 3.9.0 未完全兼容Ruby 2.7:Ruby 2.7引入关键字参数分离改动,rspec-rails 3.9.x系列需升级到3.9.4及以上版本才修复了相关死锁、循环调用问题
- Rails 5.2.5 未完全兼容Ruby 2.7:Rails 5.2系列第一个正式支持Ruby 2.7的版本是5.2.6,建议升级到5.2.8.1(5.2分支最终稳定版)规避底层兼容问题
第四步 常见卡死场景排查
- 排查测试内未设置超时的外部请求:包括HTTP调用、第三方服务请求、缓存操作等,未加超时会导致进程无限等待
- 排查数据库死锁:查看数据库进程列表,确认是否有未提交的事务占用连接,导致后续测试拿不到连接卡住
- 可在spec_helper.rb中添加全局超时逻辑,超时自动抛出错误打印调用栈
内容的提问来源于stack exchange,提问作者Tony Beninate
相关产品推荐
相关产品推荐

