TFS使用NUnit构建2010代码覆盖率

TFS使用NUnit构建2010代码覆盖率,nunit,code-coverage,Nunit,Code Coverage,我想知道你们中是否有人在运行NUnit测试时有过在TFS Build Server 2010中生成代码覆盖率报告的经验 我知道,使用打包的替代方案(MSTest+在testrunconfig文件上启用覆盖率)可以很容易地完成这项工作,但使用NUnit时需要更多的工作。我在这里和那里找到了一些指向NCover的信息,但它似乎过时了。我想知道是否还有其他选择,是否有人真的实现了这一点 以下是有关我们环境/需求的更多信息: -TFS构建服务器2010 -测试在普通类库中(不是测试库-即,没有关联的te

我想知道你们中是否有人在运行NUnit测试时有过在TFS Build Server 2010中生成代码覆盖率报告的经验

我知道,使用打包的替代方案(MSTest+在testrunconfig文件上启用覆盖率)可以很容易地完成这项工作,但使用NUnit时需要更多的工作。我在这里和那里找到了一些指向NCover的信息,但它似乎过时了。我想知道是否还有其他选择,是否有人真的实现了这一点

以下是有关我们环境/需求的更多信息: -TFS构建服务器2010 -测试在普通类库中(不是测试库-即,没有关联的testrunconfig文件),并在NUnit中实现。我们没有MST测试。
-我们感兴趣的是在每个构建中运行覆盖率报告,如果可能的话,为通过/失败标准设置覆盖率阈值要求

我们已经用NUnit NCover完成了,并且对我们的结果非常满意
NUnit执行之后是执行,以便在构建日志中发布测试结果。然后NCover启动,生成代码覆盖率结果。

一个主要的缺点是设置正确调用NCover的参数并不是一件小事。但自从我安装了它,我就再也不用维护它了

有两件事可能构成不利因素:

  • NUnitTfs不能很好地与NCover一起工作(至少我找不到一种方法在同一个步骤中同时执行这两个,所以(因为NCover调用了NUnit)我必须运行两次单元测试:(1)获得测试结果,(2)通过NCover获得覆盖率结果。自然,这会使我的构建持续更长时间
  • 设置参数以正确调用NCover并不是一件小事。但是自从我安装了它之后,我就再也不用维护它了。
在任何情况下,结果报告(特别是趋势方面)对于监控我们的代码在时间内的演变非常有用。特别是如果您在平台上工作(而不是在短期项目上),趋势报告非常有价值

编辑
我将试着以一种快速而肮脏的方式展示我是如何实现这一点的,我希望它会有用。我们目前的构建服务器上有NCover 3.4.12。
关于NUnit程序集,我们的简单命名约定是,如果我们有一个生产程序集“123.dll”,则存在另一个名为“123_NUnit.dll”的程序集来实现其测试。因此,每个生成都有几个感兴趣的*_NUnit.dll程序集

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

首先,在构建过程模板中实现了一些附加参数,然后可以在每个构建定义中设置这些参数:

然后,我们在“制定nunitCommandLine”中形成NUnit参数:

然后在“调用NUnit”中使用此选项

如果此操作成功&我们已为此生成设置覆盖率,我们将移动到“Generate 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循环“For All nunit DLL”中运行。当我们退出循环时,我们进入“Final NCover Activities”&首先是“Merge NCCovs”部分,其中NCover.Console.exe再次执行-这一次使用不同的参数:

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 rep”中完成的,其中我们使用以下参数调用NCover.reporting:

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
              )

谢谢!我们很快就会尝试这一点。必须运行两次测试似乎有点痛苦,但我愿意为报告目的付出代价。我相信,如果需要,我们可以找到并行运行它们的方法。下面有几个问题:(1)您是否有任何资源可以共享您是否为您的覆盖率设置了任何构建失败/通过标准(例如,当覆盖率<80%时使构建失败)?你好,RTORES,很高兴为您服务!我目前正在休假,因此我对资源的访问有限-在几周内提供帮助没有问题。on(2):不,我不这么认为,因为我策略性地将代码覆盖率视为我们代码质量的“软”指标——我相信如果您需要的话,这是可以做到的。太好了,我感谢您的帮助。关于#2,是的,我同意,覆盖率不是一个直接的质量指标。我们希望更多地设置这些阈值,以帮助我们改进开发团队的测试习惯(我们从0%开始,因此希望避免下滑)。感谢更新!上次尝试这样做时,我无法使其正常工作。我将很快检查此问题。您是否了解如何将NCover结果发布到TFS,以便它显示在生成摘要报告中?
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
              )