基于Jupiter建立code review机制 .

code review是项目过程中一项非常重要的工作,可以有效检查出代码层面的问题,而这些问题常常是QA难以发现的。但在现实工作中code review常常因为无法量化而流于形式,无法形成有效地闭环,很多时候只是在PM提醒下互相看两眼,或是组织大家开code review会议,在会议上大伙一起对着投影做集体review,效果可想而知不会太好。

解决以上的问题关键在于形成一个机制并且借助有效的工具去实施,这一点上可以借鉴QA的bug系统,对每一个有问题的点建立问题发现、问题分配和问题解决等生命周期,并且记录在案,使每个code reviewer担当起类似QA的职责。

code review机制

code review机制和流程可见下图所示:

整个流程下来关键在于所有code review的工作能把项目所有人纳入进来,而不只是Leader或项目核心成员的事情,另外要把每个issue形成闭环,让发现的问题正在得到解决

具体实施方法

实施的方法是根据所定的机制和流程而来,对于上面的流程通过一个excel也能完成,但不适合整个team并行来做,Jupiter就是一个为了让整个team来做review的工具,它是一个eclipse plugin,因此能很好和需要review的code结合起来,非常方便。下面讲一下通过Jupiter来完成以上流程的具体步骤(安装就不多说了,eclipse里面直接更新http://jupiter-eclipse-plugin.googlecode.com/svn/trunk/site/即可):

1)Coder把需review的code提交给Reviewer

某个模块的开发者完成代码后需要把涉及到的代码提交给Reviewer

进入项目的Properties面板,选择Review子面板:

新建一个Review单元,按照新建流程一路下去即可,关键在Reviewer Setting面板里指定谁来review你的代码,如下例所示:

在Author Setting面板里指定谁对这个代码负责,一般都是这个代码的coder,如下例所示:

以上的指定就是要弄明白review过程中的各个角色,其他选项就根据需要指定即可,使用默认也行。

新建一个review单元后得把产生的.review文件commit上去,因为所有的流程和动作都是基于这个文件,大家的合作就是基于这个文件的版本管理,所以只有commit这个文件才算是提交了一个review单元,Reviewer才能感知到这个review项

2)Reviewer review提交给自己的code并注明意见

Reviewer更新所有.review文件后,进入Jupiter的Individual阶段:

在Reviewer ID里选择代表自己的那一项,完了后即可开始具体的代码review,在review面板里能方便地找到需要review的文件:

在具体的代码行上可以加上review注释:

保存后在代码就会有个明显的标示表示这里需要修改:

完成所有review工作后commit .review文件

3)Leader根据工作量安排把issues分配给修改人

Leader更新所有.review文件后,进入Jupiter的Team阶段:

对每个issue选择分配给谁,默认是是分配给此代码的coder

4)coder修复具体的issues

coder更新所有.review文件后,进入Jupiter的Rework阶段:

可以看到所有分配给自己的修复任务,修复好后,更改status为Resolved

5)issues确认和关闭

Reviewer或Leader在Jupiter的Rework阶段查看每个issue的修复结果,确实修复好的更改status为closed,如果没有修复好的找到coder进行交流,需要集体确认和讨论的留到code review会议上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java.lang.NullPointerException at com.example.machinepotest.mappertest.tes(mappertest.java:23) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)
05-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值