# 前言

最近在思考如何客观对大家的 BUG 率 和 Reopen 率 的评分问题,本来公司有个统计平台的,但是那个统计平台只会统计大单,小的 BUG、任务根本没记录的,而且关于 “最近一周” 之类的信息的时间条件也没啥统计来支持,于是想到利用 JIRA 来统计。

众所周知,在我们的 JIRA 中,我们经常会用到一个问题过滤器,以统计当前任务信息:

但是自带的问题统计比较简单,基本上只支持选择一个自定义的过滤器,以及部分固定的字段设置:

效果如下:

统计类型都是固定的,你选择了哪个类型,在问题统计中,就会以某个类型为准将过滤器中满足条件的任务进行排列。

例如展示当前前台所有的 BUG 单

然后就产生了一个问题:BUG 单测试都不会填 开发者 或者 BUG 产生者之类的字段,最多标记模块为 前台,然后分给对应产生 BUG 功能的人身上。

此时根据自定义过滤器筛选,当前 BUG 统计单是可以看到的,但是当这个任务被解决,返回给测试之后,就难以查出对应对象了 —— 至少从统计类型中,是没有这个分类的。

查了一下,于是想到自定义过滤器可以指定对应的解决问题者,可以通过如下代码筛出上周完结的 BUG:

component = 前台 AND status != Suspend AND type = Sub-bug AND status changed from Open to resolved during (startOfWeek(-1), endOfWeek(-1)) 

上述代码以过去一周内,前台所有状态变更为已解决,且目前非挂起状态为条件,筛选出

数据是有了,但要是这时候将该过滤器拿到问题统计来,由于统计类型中根本没有 “经手人” 信息,也是无法得到正确的结果的, 顶多展示当前挂在测试身上的一堆 “上周 BUG”:

# 迂回的尝试

这时候,一开始多次尝试不行之后,没办法就想手动挨个去创建过滤器来展示,大概的想法是:

  • 创建一个 上周完结的 BUG 总过滤器,创建一个问题统计仅展示总 BUG 数量
  • 创建一个 当前用户上周完结的 BUG 过滤器,创建一个问题统计展示 “自己” 上周 BUG 数量

以及后边 Reopen 啥的也都如此,大概效果如下:

不用质疑,非常的繁琐、效果也差,展示的内容基本上是分离的,无法链接在一块。
如果想计算某人在上周所有 BUG 量中的占比,更是还需要计算一番。

于是在刚创建了这么两个问题统计之后,就感觉不大行 —— 这样一个个排列是能看,但是并不好用,于是就在添加小工具里边翻着页找,看到了这么个东西,听名字和图标,感觉有那么点意味:

关于这个小工具,以前开始自定义 JIRA 面板的时候其实也看到过,不过那会需求没这么多,而且创建之后随便点了点那些选项,因为也不会用,就没管了。这次就想着稍微研究下。

# 使用 Rich Filter Statistics

点击创建之后,会是这么个样子:

默认情况下,Rich filter 是没任何可选项的,因此在这之前,必须点红框的超链接,创建一个自己的 Rich filter。这里直接先上之前的自己尝试的流程:

  1. 点击右上角,创建一个新的 Rich filter
  2. 在通用面板中选择之前自己已经创建好的普通过滤器

    注:这里可能需要手动复制,因为搜索功能相当不好使,东西太多了
  3. 选择完毕之后,下方还会直接展示过滤器的代码
  4. 此时,在 JIRA 面板中,已经可以选择该 Rich filter 了,不过要是就这样,那它跟通常的统计器也一样,只能选择系统内置的那几个变量,因此还必须得切到 Smart filters 页签:

    依然是首先创建一个 Smart filters ,标注好名字
    现在,相当于有了一个自定义的分类,在 JIRA 面板中就可以通过 Statistic type 选择了:

    但是这样是不够的,如此只会把所有的过滤器结果全展示为一条,跟最初的想法完全不符
  5. 回到 Smart filters,可以看到新创建的下方有这么个东西

    可以接受输入类型 (名字)[如果创建时选了颜色,还可以设置颜色],以及 JQL 筛选代码,输入完毕点旁边的加号就可以添加,筛选的结果基于创建整个 Rich Filter Statistics 最初的那个过滤器,因此可以省略掉已经筛过的判断,例如,直接筛选指定的名字。

最后结果如下:

回到 JIRA 面板,Statistic type 选择新创建的这个,效果如下:

# 综合统计功能

上述就是 Rich Filter Statistics 统计最基本或者最简单的使用方法。

不过后边又想到,既然 Rich Filter Statistics 统计可以有手工筛选器,那么可不可以把本周已完成 BUG,或者其它数据一块放这儿呢?又或者整个结合一起,毕竟看创建小工具的图标显示,它貌似还可以支持类表格的统计展示的。

而且额外那么多标签页和选项,理论上都是有用的。

# 添加 Reopen 统计

于是尝试了一番,标签页的 Custom values 可以生成二维过滤条件:

这里我创建了一条筛选 Reopen 单子的 Custom values,之后在 JIRA 面板就可以添加自定义的展示值:

之后效果如下:

# Rich Filter Controller

这个也是在工具面板里边偶然看到的,创建出来试了一下,可以作为动态控制显示的额外筛选条件。
所以也简单介绍下。

这个可以看做是 Rich Filter Statistics 的一个动态控制器,简单来说,目前我发现的用处是就是可以通过指定额外的 JQL 语句再作一次筛选。

JQL 语句支持事先定义好的,也可以实时填写。

  • 事先定义好的筛选选项,其实就是之前创建 Rich Filter 就看见的 Static filters 页签:

    这儿定义的内容对 Rich Filter Statistics 本身其实是没用的 (至少试了下没有),不过可以通过 Rich Filter Controller 小工具直接影响 Rich Filter Statistics 的展示效果
    创建方式很简单,名字 + JQL 语句即可:

  • 实时添加 JQL 来筛选的话,创建面板时需要勾选 Enable additional JQL filtering
    选项,如图所示:

动态筛选效果如下:

点击选项时,可以实时获得对应筛选分类结果。

# 完善 Rich Filter Statistics

理论上上述的统计条件已经可以用了,例如将过去一周改成本周,BUG 筛选改成任务、优化单筛选就可以统计本周工作量,要说其实跟上一个 Rich Filter 合并都可以。

# 1. 将无 BUG 产生者的 BUG 指定为任务单

其次,有时候我们可能需要将一些『老 BUG』、即已经找不着 BUG 产生者的问题,分配给新的人解决,这时候我们可能就需要区分一下,避免 BUG 被直接统计到新人头上。
这里我想的方式是:分配单子时增加一个指定的备注,然后在另一边的 jql 筛选时,将增加了指定备注的单子移除 BUG 统计单,并将其统计为任务单。

例如,我这儿选择用 『任务单』 这个关键字进行指定,统计为 BUG 单核任务分别可以作如下修改:

//任务单
type = Main-Task OR type = Improvement OR type = Sub-task OR type = Task OR type = Sub-suggestion or comment ~ 任务单

填写效果如下:

使用效果如下:

但是这里还有一个问题就是,备注的搜索只支持搜索指定文本,但是不支持筛选结果取反 —— 比如『不包括』指定文本就无法工作,例如以下语句:

//筛选BUG单,且备注没有注明为 任务单的
type = Sub-bug and comment !~ 任务单

经过后续研究,发现是由于备注为空的话,则同样会被直接排除掉!也即是说comment 搜索不支持无备注的单子!无备注的单子无论是包含还是不包含都会被直接排除掉!

最终导致得不到正常的结果,因此虽然可以将 BUG 单统计为任务,但是同样也还是会计算到 BUG 单中。

# 2. 统一使用一个筛选器

为了方便多时间周期的统计,例如 上周、上个月、本月 这种,最简单的方式是直接在一系列配置完成后,在基础上复制一份即可 Rich Filter。

后来我重新建立了一个普通的基础筛选器,其作用是筛选所有前台任务。基础筛选器中不包括时间判断,然后在此基础上进行进一步筛选。

status != Suspend AND status changed from Open to resolved by (chenzhihao, wanghan, wangjiaying, huangdong, renjun, chensihao, jiangyunfei, gaozirui) OR status in (Open, "In Progress", Reopened) AND assignee in (chenzhihao, wanghan, wangjiaying, huangdong, renjun, chensihao, jiangyunfei, gaozirui)

注:删除了 during (startOfWeek(), endOfWeek()) 判断

里边有任务统计,也有已经完成的 BUG 单,还包括当前身上存在的其它各种单子。

并且由于还会统计除了 BUG 单之外的单子,然后这些单子有的可能是策划或者运营建的,有时候连模块都不会填前台,但是却又交给前台解决,所以在无法确定那些单子是否真是由前台完成的情况下,只有用最笨的方式 —— 直接筛选所有前台开发的名字,以保证统计万无一失,避免遗漏。

基础筛选完毕后,后续操作基本就跟上述 上周的 BUG 统计 一致了。

不过,由于时间参数被去掉了,因此如果直接展示,效果就会包括所有历史记录,例如:

这时候有两种方式可以解决。

  • # 配合 Rich Filter Controller 控制时间显示

Static filters 参数如下:

//本周统计
(status = Open or status changed from Open to resolved during (startOfWeek(), endOfWeek()) )
//上周统计
status != Suspend AND status changed from Open to resolved during (startOfWeek(-1), endOfWeek(-1)) 
//本月统计
status != Suspend AND status changed from Open to resolved during (startOfMonth(), endOfMonth()) 
//上月统计
status != Suspend AND status changed from Open to resolved during (startOfMonth(-1), endOfMonth(-1)) 

然后就可以通过 Rich Filter Controller 控制:

不过这种方式有个缺点,就是控制器修改后会影响所有使用这一条 Rich Filter 的小工。
其次,其它成员第一次进入该页面时,默认无任何控制器生效 (即显示所有结果)
鉴于此,另外一个选择相比就好用些了。

  • # 利用组件的 Working query 参数


如上图所示,我们在创建 Rich Filter Statistics 面板时,可以发现编辑器页有一个 Working query 的参数。
这个参数可以对筛选的结果再作一次最终筛选,跟上一种方式理论一致。
因此可以直接复制上述代码,分别创建对应统计面板时按照需求粘上去,效果也是一样的。

# 总结

可以统计上周,也可以统计本周,以及本周做过的优化、任务,目前需求暂且算是可以了。

后边准备再研究试试其它采用 Rich Filter 的面板,毕竟看着有些参数,在 Rich Filter Statistics 根本没有体现出来,例如 Views 之类的选项。

  • 参考文档:
    • 基本文档
    • 搜索帮助