Resque性能测试自动化集成:Jenkins与报告展示
你是否还在手动测试Resque任务性能?每次代码迭代都要重复执行相同的测试步骤?本文将带你实现Resque性能测试的全自动化,从任务构建到报告生成,只需一次配置即可永久受益。读完本文后,你将能够:搭建Jenkins自动化测试环境、编写可复用的性能测试脚本、生成直观的测试报告,并通过Resque监控界面实时追踪性能变化。
为什么需要自动化性能测试?
在高并发场景下,Resque作为基于Redis的Ruby后台任务库,其性能表现直接影响系统稳定性。手动测试不仅耗时费力,还难以复现真实负载场景。通过Jenkins实现自动化测试,可以:
- 在每次代码提交后自动运行性能测试
- 对比不同版本间的性能差异
- 及时发现潜在的性能瓶颈
- 为容量规划提供数据支持
Resque本身提供了丰富的监控功能,通过lib/resque/stat.rb模块记录处理和失败的任务数量,默认使用Redis的stats:processed和stats:failed键存储统计数据。结合Jenkins的自动化能力,可以构建完整的性能测试闭环。
准备工作:环境搭建
安装必要依赖
首先确保系统中已安装Ruby和Bundler,然后克隆Resque仓库:
git clone https://gitcode.com/gh_mirrors/re/resque
cd resque
bundle install
配置Resque测试环境
创建性能测试专用的Resque配置文件config/resque_perf.yml:
test: localhost:6379
对应的初始化文件config/initializers/resque_perf.rb:
rails_root = File.dirname(__FILE__) + '/../..'
rails_env = 'test'
config_file = rails_root + '/config/resque_perf.yml'
resque_config = YAML::load(ERB.new(IO.read(config_file)).result)
Resque.redis = resque_config[rails_env]
Resque.logger = Logger.new(rails_root.join('log', "perf_test_resque.log"))
Resque.logger.level = Logger::INFO
编写性能测试脚本
创建测试任务
在examples/demo/目录下创建性能测试专用任务examples/demo/perf_job.rb:
require 'resque'
require 'securerandom'
module Demo
module PerfJob
@queue = :performance
def self.perform(job_size)
start_time = Time.now
# 模拟处理不同大小的任务
data = SecureRandom.hex(job_size)
sleep 0.1 # 模拟处理时间
end_time = Time.now
# 记录任务执行时间
Resque.redis.set("perf:job:#{Process.pid}", (end_time - start_time).to_s)
Resque.redis.incrby("perf:total_jobs", 1)
Resque.redis.incrby("perf:total_time", (end_time - start_time).to_i * 1000) # 毫秒
end
end
end
这个任务会根据传入的job_size参数生成不同大小的随机数据,模拟不同负载的处理场景,并将执行时间存储到Redis中,方便后续统计。
编写性能测试脚本
创建examples/demo/perf_test.rb脚本,用于模拟多任务并发场景:
require 'resque'
require_relative 'perf_job'
require_relative '../../config/initializers/resque_perf'
# 清空测试队列
Resque.redis.del('queue:performance')
Resque.redis.del('perf:total_jobs')
Resque.redis.del('perf:total_time')
# 测试参数
JOB_COUNT = 100
CONCURRENT_WORKERS = 5
JOB_SIZES = [1024, 2048, 4096, 8192, 16384] # 不同大小的任务
# 入队测试任务
JOB_COUNT.times do
job_size = JOB_SIZES.sample
Resque.enqueue(Demo::PerfJob, job_size)
end
# 启动工作进程
workers = []
CONCURRENT_WORKERS.times do |i|
workers << fork do
ENV['QUEUE'] = 'performance'
ENV['INTERVAL'] = '0.1'
ENV['RAILS_ENV'] = 'test'
exec "bundle exec rake resque:work"
end
end
# 等待所有任务完成
loop do
queue_size = Resque.size('performance')
puts "Remaining jobs: #{queue_size}"
break if queue_size == 0 && Resque.working.size == 0
sleep 1
end
# 停止工作进程
workers.each { |pid| Process.kill('QUIT', pid) }
# 生成测试报告
total_jobs = Resque.redis.get('perf:total_jobs').to_i
total_time = Resque.redis.get('perf:total_time').to_i
avg_time = total_jobs > 0 ? (total_time / total_jobs) : 0
report = {
timestamp: Time.now.to_i,
total_jobs: total_jobs,
total_time_ms: total_time,
avg_time_ms: avg_time,
workers: CONCURRENT_WORKERS,
job_sizes: JOB_SIZES
}
File.write('perf_report.json', report.to_json)
puts "Performance test completed. Report saved to perf_report.json"
这个脚本会:
- 清空测试队列和性能统计数据
- 入队指定数量和不同大小的测试任务
- 启动指定数量的Resque工作进程
- 等待所有任务完成后生成性能报告
- 将报告数据保存为JSON格式
Jenkins集成步骤
安装Jenkins插件
在Jenkins中安装以下插件:
- Git Plugin:用于拉取代码
- Ruby Plugin:提供Ruby环境支持
- Performance Plugin:用于生成性能测试报告
- HTML Publisher Plugin:展示自定义HTML报告
创建Jenkins任务
- 新建"自由风格"项目,命名为"Resque-Performance-Test"
- 在"源代码管理"中配置Git仓库地址:
https://gitcode.com/gh_mirrors/re/resque - 在"构建环境"中勾选"Provide Node & npm bin/ folder to PATH"
- 添加构建步骤"Execute shell":
#!/bin/bash
set -e
bundle install
ruby examples/demo/perf_test.rb
- 添加"Publish Performance test result report"构建后操作,设置报告文件为
perf_report.json - 添加"Publish HTML reports",设置HTML目录为
examples/demo/report,索引页为index.html,并勾选"Keep past HTML reports"
配置定时构建
在"构建触发器"中勾选"Build periodically",设置构建周期为H/6 * * * *(每6小时构建一次),或根据项目需求调整。
测试报告展示与分析
生成可视化报告
创建examples/demo/generate_report.rb脚本,将JSON报告转换为HTML:
require 'json'
require 'erb'
report_data = JSON.parse(File.read('perf_report.json'))
template = <<-HTML
<!DOCTYPE html>
<html>
<head>
<title>Resque Performance Report</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
.report { border-collapse: collapse; width: 100%; margin-top: 20px; }
.report th, .report td { border: 1px solid #ddd; padding: 8px; text-align: left; }
.report th { background-color: #f2f2f2; }
.summary { background-color: #e8f4f8; padding: 15px; border-radius: 5px; }
</style>
</head>
<body>
<h1>Resque Performance Test Report</h1>
<div class="summary">
<p>测试时间: <%= Time.at(report_data['timestamp']).strftime('%Y-%m-%d %H:%M:%S') %></p>
<p>工作进程数: <%= report_data['workers'] %></p>
<p>总任务数: <%= report_data['total_jobs'] %></p>
<p>总处理时间: <%= report_data['total_time_ms'] %> ms</p>
<p>平均任务时间: <%= report_data['avg_time_ms'] %> ms</p>
</div>
<h2>测试参数</h2>
<table class="report">
<tr><th>任务大小范围</th><td><%= report_data['job_sizes'].min %> - <%= report_data['job_sizes'].max %> bytes</td></tr>
</table>
</body>
</html>
HTML
File.write('examples/demo/report/index.html', ERB.new(template).result(binding))
配置报告自动生成
修改Jenkins构建脚本,在性能测试完成后自动生成HTML报告:
#!/bin/bash
set -e
bundle install
ruby examples/demo/perf_test.rb
mkdir -p examples/demo/report
ruby examples/demo/generate_report.rb
Resque监控界面集成
Resque提供了内置的Sinatra监控界面,可以实时查看队列状态和 worker 活动。通过lib/resque/server.rb实现,可以通过以下命令启动:
resque-web -p 8282 config/initializers/resque_perf.rb
在浏览器中访问http://localhost:8282即可看到Resque监控界面,展示当前队列状态、worker活动和失败任务等信息。
可以在Jenkins任务中添加一个"Execute shell"步骤,启动Resque监控界面并截图,作为测试报告的一部分:
resque-web -p 8282 config/initializers/resque_perf.rb &
sleep 5
wget http://localhost:8282 -O resque_dashboard.html
curl http://localhost:8282 -o resque_dashboard.png
高级优化:分布式性能测试
对于大规模性能测试,可以利用Resque的分布式特性,在多台机器上同时运行worker。修改性能测试脚本,添加worker节点配置:
# 在perf_test.rb中添加
Resque.redis = 'redis://master-node:6379/0'
Resque.workers = [
'worker-node-1:6379',
'worker-node-2:6379',
'worker-node-3:6379'
]
通过这种方式,可以模拟更真实的生产环境负载,获得更准确的性能数据。
总结与下一步
通过本文介绍的方法,我们成功构建了基于Jenkins的Resque性能测试自动化流程。关键步骤包括:
- 编写可复用的性能测试脚本examples/demo/perf_test.rb
- 配置Jenkins自动构建任务
- 生成直观的性能报告
- 集成Resque监控界面
下一步可以考虑:
- 添加性能阈值告警,当平均任务时间超过阈值时发送邮件通知
- 实现性能数据的长期存储和趋势分析
- 结合APM工具(如New Relic)进行更深入的性能分析
- 优化Resque配置,如调整lib/resque/worker.rb中的worker数量和队列优先级
通过持续优化和迭代,可以构建一个健壮的性能测试体系,确保Resque在各种负载场景下都能保持良好表现。
参考资料
- Resque官方文档:README.markdown
- Resque钩子和插件开发:docs/HOOKS.md
- Resque性能优化指南:examples/resque_config.rb
- Jenkins Performance Plugin文档:https://plugins.jenkins.io/performance/
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




