2011-07-29 43 views
4

我在想,如果你们中的任何一个人在运行NUnit测试时在TFS构建服务器2010中生成代码覆盖率报告的经验。TFS使用NUnit构建2010代码覆盖范围

我知道使用打包替代方法(MSTest +启用testrunco​​nfig文件覆盖范围)可以轻松完成此操作,但使用NUnit时会涉及更多一点。我在这里和那里发现了一些信息,指向NCover,但似乎过时了。我想知道是否还有其他选择,以及是否有人实际执行了这个。

下面是关于我们的环境/需要更多的信息: - TFS构建服务器2010 - 测试都是纯类库(未测试库 - 即没有关联的testrunco​​nfig文件),并在NUnit的实现。我们没有MSTests。 - 我们有兴趣将覆盖范围报告作为每个构建的一部分运行,并且如果可能的话,设置合格/不合格标准的覆盖阈值要求。

回答

4

我们用NUnit-NCover完成了它,并对我们的结果非常满意。
NUnit执行之后是NUnitTfs执行,以便让我们的测试结果在生成日志中发布。然后NCover开始,生成我们的代码覆盖率结果。

作为一个缺点的一个主要问题是,设置正确调用NCover的参数并不是微不足道的。但是自从我安装它之后,我从来不需要维护它。

两件事情可能会带来的缺点:

  • NUnitTfs不NCover(很好地工作,至少我无法找到一个方法来执行这两个在同一步骤,所以(因为NCover NUnit的调用)我必须进行两次单元测试:(1)获得测试结果,(2)获得NCover的覆盖结果。当然,这使得我的构建持续更长时间。
  • 设置正确调用NCover的参数wasn' t琐碎,但自从我安装它,我从来没有维护它。

在任何情况下,生成的报告(特别是趋势方面)在监视我们的代码如何在时间内演变时非常有用。特别是如果您正在开发一个平台(而不是短期项目),趋势报告具有很大的价值。

编辑
我会尽力呈现一个快速&肮脏的方式我如何'已经实现了这个,我希望它是有用的。我们目前在我们的构建服务器上拥有NCover 3.4.12。
关于我们的NUnit程序集的简单命名约定是,如果我们有一个生产程序集“123.dll”,则存在另一个名为“123_nunit.dll”的程序集来实现它的测试。所以,每个版本都有几个感兴趣的* _nunit.dll程序集。

“如果不禁用测试”下的构建过程模板中的部分是为了实现我们的目标而重新构建的部分,特别是名为“为测试程序集运行MSTest”的部分。整个实现是here,经过一些清理,使流程更容易理解(图片太大,无法直接插入此处)。

起初,一些额外的参数在构建过程中模板&实现然后可在每个构建定义设置:
enter image description here

然后,我们形成“制定nunitCommandLine” NUnit的ARGS:

String.Format("{0} /xml={1}\\{2}.xml", nunitDLL, TestResultsDirectory, Path.GetFileNameWithoutExtension(nunitDLL)) 

这然后在 “调用NUnit的”
enter image description here

我用这种情况成功&我们已经为这个构建设置了覆盖范围,我们转到“生成NCover NCCOV”(这个特定程序集的覆盖文件)。为此,我们调用NCover.Console.exe具有以下的参数数量:

String.Format("""{0}"" ""{1}"" //w ""{2}"" //x ""{3}\{4}"" //literal //ias {5} //onlywithsource //p ""{6}""", 
       NUnitPath, 
       Path.GetFileName(nunitDLL), 
       Path.GetDirectoryName(nunitDLL), 
       Path.GetDirectoryName(Path.GetDirectoryName(nunitDLL)), 
       Path.GetFileName(nunitDLL).Replace("_nunit.dll", ".nccov"), 
       Path.GetFileNameWithoutExtension(nunitDLL).Replace("_nunit", ""), 
       BuildDetail.BuildNumber) 

所有这些运行在foreach循环中“对于所有的NUnit的dll”。当我们退出循环,我们在第一部分“合并NCCovs”,其中NCover.Console.exe再次执行进入“最终NCover活动” & - 这一次不同ARGS:

String.Format("""{0}\*.nccov"" //s ""{0}\{1}.nccov"" //at ""{2}\{3}\{3}.trend"" //p {1} ", 
       Path.GetDirectoryName(Path.GetDirectoryName(testAssemblies(0))), 
       BuildDetail.BuildNumber, 
       NCoverDropLocation, 
       BuildDetail.BuildDefinition.TeamProject 
      ) 

当这个已经运行,我们已经达到了将这个版本的所有NCCOV文件合并到一个NCCOV文件中,这个文件是在构建之后命名的。趋势文件(在整个生命周期中监视构建)已经用当前版本的元素进行了更新。

我们现在只生成最终的HTML报告,这是在“生成最终NCover代表”在这里我们调用NCover.reporting具有以下ARGS完成:

String.Format(" ""{0}\{1}.nccov"" //or FullCoverageReport //op ""{2}\{1}_NCoverReport.html"" //p ""{1}"" //at ""{3}\{4}\{4}_{5}.trend"" ", 
       Path.GetDirectoryName(Path.GetDirectoryName(testAssemblies(0))), 
       BuildDetail.BuildNumber, 
       PathForNCoverResults, 
       NCoverDropLocation, 
       BuildDetail.BuildDefinition.TeamProject, 
       BuildType 
      ) 
+0

谢谢!我们很快就会尝试。有两次运行测试似乎有点痛苦,但我愿意为报告目的付出代价。我敢肯定,如果需要,我们可以设法让它们并行运行。几个后续问题:(1)你有任何资源来设置这个你可以分享? (2)您是否有针对您的覆盖率数据设置的构建失败/传递标准(例如,当覆盖率<80%时,使构建失败)? – rtorres

+0

你好rtorres,很高兴成为服务!我目前正在度假,所以我对我的资源的访问有限 - 在几周内帮助不成问题。关于(2):不,我不这样做,因为我策略性地将代码覆盖率视为我们代码质量的“软”指标 - 但我相信如果您需要它,可以完成此操作。 – pantelif

+0

太好了,谢谢你的帮助。在#2,是的,我同意,覆盖面不是一个直接的质量指标。我们希望将这些阈值设置为帮助我们改进开发团队测试习惯的一种方式(我们从0%开始,所以希望避免滑倒)。 – rtorres