Jenkins中Rake执行Ruby+Watir测试无报错却最终中止问题求助
问题原因分析
出现该现象的核心原因是测试执行进程最终返回了状态码1,被Rake判定为执行失败,但失败逻辑没有在测试日志中输出,常见触发原因如下:
- 测试框架/报告插件的退出码逻辑异常:你使用的XML测试报告生成插件、测试框架(如Minitest/Test::Unit)的对应版本存在bug,测试全过的情况下仍然错误返回非0状态码;或是全局测试钩子(after_suite、teardown等回调)中存在静默异常,被框架捕获未输出,仅导致退出码异常。
- 版本兼容性问题:当前环境使用Ruby 2.1.0搭配Rake 12.3.1,Rake 12.x系列的最低兼容Ruby版本为2.2,版本不匹配会导致
Rake::TestTask的退出码判断逻辑出错。 - 资源残留问题:Watir启动的浏览器、驱动进程在测试结束后未正常关闭,残留进程导致测试主进程退出时返回异常状态码。
解决方案
第一步:定位问题来源
直接执行报错信息中的测试命令,手动验证测试进程本身的退出码:
ruby -I"lib" -I"/usr/lib64/ruby/gems/2.1.0/gems/rake-12.3.1/lib" "/usr/lib64/ruby/gems/2.1.0/gems/rake-12.3.1/lib/rake/rake_test_loader.rb" "<path>/test1.rb" "<path>/test2.rb" "<path>/test3.rb" "<path>/test4.rb" # 执行完成后立即查看退出码 echo $?
- 若输出为1:问题出在测试进程本身
- 若输出为0:问题出在Rake的版本或配置
第二步:对应修复方案
测试进程本身返回状态码1的修复方案
- 排查全局测试钩子和报告生成逻辑:给所有
after_suite、teardown回调以及XML报告生成逻辑增加异常捕获和日志打印,确认是否存在静默异常。 - 临时注释XML报告生成逻辑后重跑测试,若退出码恢复为0,升级报告插件到兼容版本,或在测试入口文件最后一行添加
exit 0,强制测试进程返回正常状态码。 - 测试结束后增加进程清理逻辑,强制杀掉残留的浏览器、驱动进程,避免资源残留导致退出码异常。
Rake侧问题的修复方案
- 降级Rake到兼容Ruby 2.1的11.x版本:执行
gem install rake -v '~> 11.3',若使用Gemfile则在文件中添加gem 'rake', '~> 11.3'后执行bundle install。 - 若需要保留当前Rake版本,可在Rakefile中增加异常捕获逻辑,忽略测试全过场景下的状态码1报错,参考配置如下:
Rake::TestTask.new(:test) do |t| t.test_files = FileList['test/**/*.rb'] t.verbose = true # 保留你原有的其他配置 end task :default do begin Rake::Task['test'].invoke rescue SystemExit => e # 可结合测试报告结果判断是否为测试全过场景,逻辑更严谨 puts "Ignore test task exit status #{e.status} as all tests passed" exit 0 end end
内容的提问来源于stack exchange,提问作者Padi Dev
相关产品推荐
相关产品推荐

