项目度量代码行统计方法(LOC)

项目度量代码行统计方法

一、 目的

进一步完善提高项目代码行的统计精确度及统计效率,从而完善提高项目度量的质量和效率。

二、 适用对象

配置管理人员、参与度量统计工作的质量工程师。

三、 工具

Microsoft Line Of Code Counter 2.3.1.0

四、 流程简述

第一步、提取项目源码

根据负责度量的质量管理工程师提供的项目版本(基线记录的tag)、CVS路径信息及统计语言类型,将相应项目源码检出至本地新建目录中。(入过基线的可以通过tag号进行提取,其他的情况需要QA与项目经理协商确认)

第二步、通过工具进行统计

请统一使用统计工具“Microsoft Line Of Code Counter”,进行统计,具体方法请参考 “Microsoft Line Of Code Counter 操作简介”

第三步、进行填表记录并通知相关人员

请将统计结果准确及时填入到该项目的《项目基线记录表.xls》中相应位置。同时发送一封统计情况的邮件给相应QA人员。

五、 Microsoft Line Of Code Counter操作简介

主界面:

如下图所示:

clip_image0032

操作原理:新建一个统计任务,通过一个记录着统计语言类型的可配置的xml文件,可进行单个文件夹或两个文件夹的代码行统计。(该xml文件已经按照项目度量标准配置完毕,请将附件中的LineCounters.xml文件替换至本地LOC安装目录)

操作流程:

第一步、新建一个任务

通过点击Counter Task→New,或使用快捷键Ctrl+N,打开新建任务窗口。如下图所示:

clip_image0051

Task Name :推荐使用项目简称(配置库名称),命名只能由字母、数字、“-”和空格组成。

Source Management :Team Foundation Server 模式和Visual SourSafe模式,不推荐采用。我们只使用File System模式。

Latest Folder :统计项目的初试版本时,可以选用该选项。该选项只统计一个目录。

Diff-File System :比较统计两个目录的文件的增、删、改等行数情况。

Reports :选择统计日志输出样式。一般默认选择StandardReport就可了。

Filter category :选择过滤类型,用于在任务栏里,进行帅选显示使用。根据我们的统计需求,不会涉及到该功能。一般默认即可。

根据需要,填写完成后,点击OK按钮即完成新建任务。

第二步、开始统计

接上一步,回到主界面,左键点选任务栏里的任务,然后点击位于主界面上部的Configure小图标clip_image0071 。勾选所需统计的目录:clip_image0091 ,点击Apply按钮确认。再次回到主界面,勾选该任务的Enable选项后,点击位于主界面上部的Count小图标clip_image0111 ,开始统计。

说明:

1. 该任务统计时,已经将控制统计类型的xml配置文件按照度量规范要求调整完成了。

2. 可以多任务同时进行,统计结果也会汇总在一起列出。

3. 选中每个任务时,右侧的任务属性栏里就会显示出该任务的一些信息,便于查看区分。

第三步、查看统计结果

统计任务结束后,会自动显示出统计结果界面。我们一般需要提取两个地方的数据:

1. 当执行单一文件夹统计任务时,可在Language页面提取每个语言的Base值作为统计结果

2. 当执行两个文件夹差异统计时,可在Language页面提取每个语言的Added、Modified、Deleted行数信息,需要自己计算求和,作为统计结果。

若想将统计结果保存,可点击下方clip_image0131 按钮,再点击Export小图标clip_image0151 ,可以保存为Excel格式或PDF格式的文档。

说明:若想浏览其他详细内容,可以点击菜单栏里的Help→User Guide选项获取该工具的用户手册。

六、 LineCounters.xml

<?xml version="1.0" encoding="utf-8" ?>

<lineCounters version="1.0.0.5">

<!--

lineCounter Attributes:

name="[userReadableName]" - the name of the counter type which will be displayed in the counter results

lineCounters can contain any number of fileExtension and/or codeArea elements

fileExtension Value:

this a file extension for which the counter is valid

codeArea Attributes:

name="[userReadableName]" - the name of the code area which will be displayed in the counter results. It is often appeneded to the lineCounter name for display. This is a required attribute

isCode="[true|false]" - true if code that matches this codeArea is considered for the Total Lines of Code count. Default is false

multiLine="[true|false]" - true if the code area spans more than one line. Default is false

caseSensitive="[true|false]" - true if the expressions are to be matched in a case sensitive manner. Default is true

description="[user readable description]"

multi line codeAreas must contain a startExpression element and an endExpression element

single line codeAreas can contain any number of expression elements

by default, all lines are considered Lines of Code unless otherwise matched

-->

<lineCounter name="JAVA">

<fileExtension>java</fileExtension>

<fileExtension>mf</fileExtension>

<codeArea name="Blank lines" isCode="false">

<expression>^s*$</expression>

</codeArea>

<codeArea name="// comments" isCode="false">

<expression>^s*//.*$</expression>

</codeArea>

<codeArea name="/* */ comments" multiLine="true">

<startExpression>^s*/*.*$</startExpression>

<endExpression>[*]**/</endExpression>

</codeArea>

<pspMetricArea name="Class" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>//(W)*PSP_METRICS_CLASS_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>//(W)*PSP_METRICS_CLASS_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

<pspMetricArea name="Method" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>//(W)*PSP_METRICS_METHOD_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>//(W)*PSP_METRICS_METHOD_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

</lineCounter>

<lineCounter name="PHP">

<fileExtension>html</fileExtension>

<fileExtension>php</fileExtension>

<fileExtension>js</fileExtension>

<fileExtension>css</fileExtension>

<fileExtension>inc</fileExtension>

<fileExtension>jsp</fileExtension>

<fileExtension>asp</fileExtension>

<fileExtension>xml</fileExtension>

<codeArea name="Blank lines" isCode="false">

<expression>^s*$</expression>

</codeArea>

<codeArea name="&lt;!-- --&gt; comments" isCode="false" multiLine="true">

<startExpression>^s*&lt;!--.*$</startExpression>

<endExpression>[*]*--&gt;</endExpression>

</codeArea>

<pspMetricArea name="Funtion" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>&lt;!--PSP_METRICS_FUNCTION_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>&lt;!--PSP_METRICS_FUNCTION_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_FUNCTION_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

</lineCounter>

<lineCounter name="C/C++">

<fileExtension>java</fileExtension>

<fileExtension>mf</fileExtension>

<codeArea name="Blank lines" isCode="false">

<expression>^s*$</expression>

</codeArea>

<codeArea name="// comments" isCode="false">

<expression>^s*//.*$</expression>

</codeArea>

<codeArea name="# comments" isCode="false">

<expression>^s*//.*$</expression>

</codeArea>

<pspMetricArea name="Class" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>//(W)*PSP_METRICS_CLASS_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>//(W)*PSP_METRICS_CLASS_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

<pspMetricArea name="Method" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>//(W)*PSP_METRICS_METHOD_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>//(W)*PSP_METRICS_METHOD_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

</lineCounter>

<lineCounter name="SQL">

<fileExtension>sql</fileExtension>

<codeArea name="Begin/End tags" isCode="false" caseSensitive="false">

<expression>^s*begins*$</expression>

<expression>^s*ends*$</expression>

</codeArea>

<codeArea name="Comments" isCode="false">

<expression>^s*--.*$</expression>

</codeArea>

<codeArea name="Blank lines" isCode="false">

<expression>^s*$</expression>

</codeArea>

<codeArea name="/* */ comments" multiLine="true">

<startExpression>^s*/*.*$</startExpression>

<endExpression>[*]**/</endExpression>

</codeArea>

<pspMetricArea name="Procedure" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>--(W)*PSP_METRICS_PROCEDURE_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>--(W)*PSP_METRICS_PROCEDURE_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_PROCEDURE_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

</lineCounter>

<lineCounter name="VC.NET">

<fileExtension>h</fileExtension>

<fileExtension>cs</fileExtension>

<fileExtension>clw</fileExtension>

<fileExtension>dsp</fileExtension>

<fileExtension>dsw</fileExtension>

<fileExtension>cpp</fileExtension>

<fileExtension>aspx</fileExtension>

<codeArea name="Imports statements" isCode="true">

<expression>^s*Imports.*$</expression>

</codeArea>

<codeArea name="Blank lines" isCode="false">

<expression>^s*$</expression>

</codeArea>

<codeArea name="' comments" isCode="false">

<expression>^s*'.*$</expression>

</codeArea>

<pspMetricArea name="Class" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>'(W)*PSP_METRICS_CLASS_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>'(W)*PSP_METRICS_CLASS_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

<pspMetricArea name="Method" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>'(W)*PSP_METRICS_METHOD_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>'(W)*PSP_METRICS_METHOD_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

</lineCounter>

<lineCounter name="界面C++/VB">

<fileExtension>cpp</fileExtension>

<fileExtension>hpp</fileExtension>

<fileExtension>dsp</fileExtension>

<fileExtension>vbp</fileExtension>

<fileExtension>bvw</fileExtension>

<codeArea name="Imports statements" isCode="true">

<expression>^s*Imports.*$</expression>

</codeArea>

<codeArea name="Blank lines" isCode="false">

<expression>^s*$</expression>

</codeArea>

<codeArea name="' comments" isCode="false">

<expression>^s*'.*$</expression>

</codeArea>

<pspMetricArea name="Class" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>'(W)*PSP_METRICS_CLASS_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>'(W)*PSP_METRICS_CLASS_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

<pspMetricArea name="Method" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>'(W)*PSP_METRICS_METHOD_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>'(W)*PSP_METRICS_METHOD_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

</lineCounter>

<lineCounter name="DELPHI">

<fileExtension>dpr</fileExtension>

<fileExtension>pas</fileExtension>

<codeArea name="Imports statements" isCode="true">

<expression>^s*Imports.*$</expression>

</codeArea>

<codeArea name="Blank lines" isCode="false">

<expression>^s*$</expression>

</codeArea>

<codeArea name="' comments" isCode="false">

<expression>^s*'.*$</expression>

</codeArea>

<pspMetricArea name="Class" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>'(W)*PSP_METRICS_CLASS_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>'(W)*PSP_METRICS_CLASS_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

<pspMetricArea name="Method" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>'(W)*PSP_METRICS_METHOD_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>'(W)*PSP_METRICS_METHOD_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

</lineCounter>

<lineCounter name="PB">

<fileExtension>pbl</fileExtension>

<fileExtension>pbt</fileExtension>

<codeArea name="Imports statements" isCode="true">

<expression>^s*Imports.*$</expression>

</codeArea>

<codeArea name="Blank lines" isCode="false">

<expression>^s*$</expression>

</codeArea>

<codeArea name="' comments" isCode="false">

<expression>^s*'.*$</expression>

</codeArea>

<pspMetricArea name="Class" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>'(W)*PSP_METRICS_CLASS_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>'(W)*PSP_METRICS_CLASS_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

<pspMetricArea name="Method" toCount="true" caseSensitive="false" >

<pspMetricAreaStartFlag>'(W)*PSP_METRICS_METHOD_BEGIN</pspMetricAreaStartFlag>

<pspMetricAreaEndFlag>'(W)*PSP_METRICS_METHOD_END</pspMetricAreaEndFlag>

<PspMetricNameFlag>(?&lt;=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>

<ObjectType>(?&lt;=&lt;Object_Type&gt;(W)*:(W)*)(w)*</ObjectType>

</pspMetricArea>

</lineCounter>

</lineCounters>

转载于:https://my.oschina.net/tadcat/blog/150355