今天为客户的质量管理部门人员提供TFS咨询过程中,客户的质量管理专家基于TFS提出了一个比较棘手的数据统计需求。需求是这样,客户的数十个软件项目通过质量管理部按照年度版本计划进行软件产品系统的发布,因此对需求的管理有一个基线跟踪的过程,也就是说,当产品发布后,质量管理部门希望统计出与该版本发布后相关的需求、Bug、任务等工作项是否发生变更,以及变更的什么数据。
初始讨论这个需求时,根据对TFS的了解,第一判断出这个数据是可以统计出来了,但是可能要费一番周折。实现的过程确时如此:
首先从TFS的数据Warehouse数据库入手,查询WIT之间的关联关系以及变更历史数据,管理关系的数据查询sql如下:
1、根据工作项ID查询出该工作项所有相关联的其他工作项目
select * from FactWorkItemLinkHistory wh
left join CurrentWorkItemView cwv on wh.SourceWorkItemID = cwv.System_Id
where cwv.System_Id ='25429'
2、从工作项历史记录数据中统计出1中的相关工作项的变更历史
select cwv.System_Title as versionTitle , linkCWV.System_Title as targetTitle,linkCWV.ProjectNodeName from FactWorkItemLinkHistory wh left join CurrentWorkItemView cwv on wh.SourceWorkItemID = cwv.System_Id and cwv.TeamProjectCollectionSK = wh.TeamProjectCollectionSK left join CurrentWorkItemView linkCWV on wh.TargetWorkItemID = linkCWV.System_Id and linkCWV.TeamProjectCollectionSK = wh.TeamProjectCollectionSK where cwv.System_Id ='25429'
3、通过添加过滤条件查询出工作项相关的工作项数据在某个基线后是否发生了变化
select cwv.System_Title as versionTitle , linkCWV.System_Title as targetTitle,linkCWV.ProjectNodeName from FactWorkItemLinkHistory wh left join CurrentWorkItemView cwv on wh.SourceWorkItemID = cwv.System_Id and cwv.TeamProjectCollectionSK = wh.TeamProjectCollectionSK left join CurrentWorkItemView linkCWV on wh.TargetWorkItemID = linkCWV.System_Id and linkCWV.TeamProjectCollectionSK = wh.TeamProjectCollectionSK where cwv.System_Id ='25429' and wh.TargetWorkItemID in (
select distinct System_Id from WorkItemHistoryView group by System_Id having max(LastUpdatedDateTime) >= cwv.LastUpdatedDateTime
)
通过上述统计,本以为已经统计出所需数据了,但是经过仔细的分析,TFS中的工作项任何的变更,比如添加了新的相关关联项,但其内容,比如需求说明、bug症状、测试步骤并没有方式变化,这样的数据就不应该是基线的变化,因此这样统计出的数据是有出入的,不准确。
基于这样的考虑,仅仅在TFS的Warehouse数据库中是统计不出相关报表的,必须从Collection数据库中来进行统计,Collection库结构是很复杂,如果仅仅是读取数据,分析一下,是没问题的,但如果是想直接修改里面的数据,就别考虑了,说不定就搞出问题,特别是在客户的大型生产环境中。
通过目测、查询、和搜索网络,终于找到了在Collection库中工作项各个字段修改历史记录的数据:
基于上面在两个数据库中的查询,终于统计出所需的数据。
网上搜到一个详细介绍TFS数据库的Blog,分析的很透彻。