[align=center] Redmine 中生成 smi [/align]
SMI 是使用数据来评价软件质量的一种方法。
在 Redmine 中使用 SMI 需要三个步骤,首先完成 SMI 的评价标准,其次定期存储 smi 在数据库中,最后选择合适的方法进行展示。
一、SMI 的评分标准
通常 smi 的评价有两个维度,问题的状态和严重度。例如:打开 10 分,修复 5 分,验证 3 分;严重 4 分,普通 3 分,轻微 2 分,体验 1 分。完成评价量表。
打开 10 分 修复 5 分 验证 3 分 合计
严重 4 分 1 0 2 64
普通 3 分 0 1 1 24
轻微 2 分 1 2 1 36
体验 1 分 0 0 1 3
合计 127
二、系统中定期生成 smi
2.1
Rails 中有 gem rufus-scheduler 可以进行执行定期任务。
rufus-scheduler 要去必须有一个活动线程,因此如果使用 Apache 配置 redmine 需要添加如下配置。
[code] PassengerMaxPreloaderIdleTime 0
PassengerMinInstances 1[/code]
2.2
在数据库中创建表 redmine_smis 用来存储定期数据,结构可以参考:
[code] DROP TABLE IF EXISTS redmine_smis
;
CREATE TABLE redmine_smis
(
id
int(11) NOT NULL AUTO_INCREMENT,
due_date
date DEFAULT NULL,
project_id
int(11) NOT NULL,
status_id
int(11) NOT NULL,
severity
varchar(30) NOT NULL DEFAULT '',
issue_count
int(11) NOT NULL DEFAULT '0',
weight
float(13,1) NOT NULL DEFAULT '0.0',
PRIMARY KEY (id
),
KEY issues_project_id
(project_id
),
KEY index_issues_on_status_id
(status_id
)
);[/code]
2.3
编写定期统计方法
[code] def CalculationSmi()
status_weight = {“打开”=> 10, “修复” => 5,” 验证”=> 3}
severity_weight = {"严重" => 4 ,"普通" => 3, "轻微" => 2, "体验" => 1, }
@projects = Project.all if !@projects.nil? @projects.each do |project| @query = IssueQuery.new(:name => "_", :filters => filters ,:group_by=>"") if @query.issue_count>0 # 系统 {“打开”=> 10, “修复” => 5,” 验证”=> 3}.each do |status|
@query ||= IssueQuery.new(:name => "_") @query.filters = filters @query.group_by = "严重度"
if @query.issue_count>0 @issue_count_by_group = @query.issue_count_by_group if !@issue_count_by_group.nil? Rails.logger.info @issue_count_by_group @issue_count_by_group.each do |k,v| @smi = RedmineSmi.new @smi.project_id = project.id @smi.status_id = status @smi.severity = k @smi.issue_count = v @smi.due_date = Date.today @smi.weight = (status_weight[status] * severity_weight[k]).round(1) @smi.save! end end end end end[/code] 2.4 定期调用 [code] schedulersmi = Rufus::Scheduler.new cronStsmi = '00 00 * * 6' schedulersmi.cron cronStsmi do begin scheduler = Object.new.extend(Scheduler) scheduler.CalculationSmi() rescue Exception => e Rails.logger.info "Scheduler failed: #{e.message}" end end[/code] 三、数据显示 可以通过趋势图、统计表来显示数据。 画图的 JavaScript 库有很多这里推荐 highchart 和 echart