项目度量代码行统计方法
一、 目的
进一步完善提高项目代码行的统计精确度及统计效率,从而完善提高项目度量的质量和效率。
二、 适用对象
配置管理人员、参与度量统计工作的质量工程师。
三、 工具
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操作简介
主界面:
如下图所示:
操作原理:新建一个统计任务,通过一个记录着统计语言类型的可配置的xml文件,可进行单个文件夹或两个文件夹的代码行统计。(该xml文件已经按照项目度量标准配置完毕,请将附件中的LineCounters.xml文件替换至本地LOC安装目录)
操作流程:
第一步、新建一个任务
通过点击Counter Task→New,或使用快捷键Ctrl+N,打开新建任务窗口。如下图所示:
Task Name :推荐使用项目简称(配置库名称),命名只能由字母、数字、“-”和空格组成。
Source Management :Team Foundation Server 模式和Visual SourSafe模式,不推荐采用。我们只使用File System模式。
Latest Folder :统计项目的初试版本时,可以选用该选项。该选项只统计一个目录。
Diff-File System :比较统计两个目录的文件的增、删、改等行数情况。
Reports :选择统计日志输出样式。一般默认选择StandardReport就可了。
Filter category :选择过滤类型,用于在任务栏里,进行帅选显示使用。根据我们的统计需求,不会涉及到该功能。一般默认即可。
根据需要,填写完成后,点击OK按钮即完成新建任务。
第二步、开始统计
接上一步,回到主界面,左键点选任务栏里的任务,然后点击位于主界面上部的Configure小图标
。勾选所需统计的目录:
,点击Apply按钮确认。再次回到主界面,勾选该任务的Enable选项后,点击位于主界面上部的Count小图标
,开始统计。
说明:
1. 该任务统计时,已经将控制统计类型的xml配置文件按照度量规范要求调整完成了。
2. 可以多任务同时进行,统计结果也会汇总在一起列出。
3. 选中每个任务时,右侧的任务属性栏里就会显示出该任务的一些信息,便于查看区分。
第三步、查看统计结果
统计任务结束后,会自动显示出统计结果界面。我们一般需要提取两个地方的数据:
1. 当执行单一文件夹统计任务时,可在Language页面提取每个语言的Base值作为统计结果
2. 当执行两个文件夹差异统计时,可在Language页面提取每个语言的Added、Modified、Deleted行数信息,需要自己计算求和,作为统计结果。
若想将统计结果保存,可点击下方
按钮,再点击Export小图标
,可以保存为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>(?<=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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="<!-- --> comments" isCode="false" multiLine="true">
<startExpression>^s*<!--.*$</startExpression>
<endExpression>[*]*--></endExpression>
</codeArea>
<pspMetricArea name="Funtion" toCount="true" caseSensitive="false" >
<pspMetricAreaStartFlag><!--PSP_METRICS_FUNCTION_BEGIN</pspMetricAreaStartFlag>
<pspMetricAreaEndFlag><!--PSP_METRICS_FUNCTION_END</pspMetricAreaEndFlag>
<PspMetricNameFlag>(?<=PSP_METRICS_FUNCTION_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_PROCEDURE_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_CLASS_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(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>(?<=PSP_METRICS_METHOD_BEGIN(W)*:(W)*)(w)*</PspMetricNameFlag>
<ObjectType>(?<=<Object_Type>(W)*:(W)*)(w)*</ObjectType>
</pspMetricArea>
</lineCounter>
</lineCounters>转载于:https://my.oschina.net/tadcat/blog/150355


