我想知道你们是否有人在运行NUnit测试时在TFS Build Server 2010中生成代码覆盖率报告的经验。
我知道可以使用打包的替代方案轻松完成(MSTest +在testrunconfig文件上启用覆盖范围),但在使用NUnit时会更加复杂。我在这里和那里发现了一些指向NCover的信息,但它似乎已经过时了。我想知道是否还有其他选择,是否有人实际上已经实现了这一点。
以下是有关我们的环境/需求的更多信息: - TFS Build Server 2010 - 测试在普通类库中(不是测试库 - 即没有关联的testrunconfig文件),并在NUnit中实现。我们没有MSTests。 - 我们有兴趣将覆盖率报告作为每个构建的一部分运行,并且如果可能的话,设置通过/未通过标准的覆盖阈值要求。
答案 0 :(得分:4)
我们已经使用NUnit-NCover完成了它,并对我们的结果非常满意。
执行NUnit之后执行NUnitTfs,以便在构建日志中发布我们的测试结果。然后NCover开始生成我们的代码覆盖率结果。
造成缺点的一个主要问题是,为正确调用NCover设置参数并非易事。但是自从我安装它以来,我从来没有必要维护它。
有两件事可能构成缺点:
在任何情况下,生成的报告(特别是趋势方面)对于监控我们的代码在时间内如何发展非常有用。特别是如果您正在使用平台(而不是短期项目),趋势报告非常有价值。
修改强>
我会尝试以快速和快速的方式呈现肮脏的方式我是如何实现这一点的,我希望它有用。我们目前在构建服务器上有NCover 3.4.12
我们关于NUnit程序集的简单命名约定是,如果我们有一个生产程序集“123.dll”,则存在另一个名为“123_nunit.dll”的程序集,它实现了它的测试。因此,每个构建都有几个感兴趣的* _nunit.dll程序集。
“如果不禁用测试”下的构建过程模板中的部分是为了实现我们的目标而重新编写的部分,特别是名为“运行测试程序集的MSTest”的部分。整个实现是here,经过一些清理后可以更容易理解流程(图片太大而无法直接插入此处)。
首先,在构建过程模板&中实现了一些额外的参数。然后可以在每个构建定义中设置:
然后我们在“Formulate nunitCommandLine”中形成NUnit args:
String.Format("{0} /xml={1}\\{2}.xml", nunitDLL, TestResultsDirectory, Path.GetFileNameWithoutExtension(nunitDLL))
然后将其用于“调用NUnit”
如果成功&我们为此构建设置了覆盖范围,我们转移到“生成NCover NCCOV”(此特定程序集的coverage文件)。为此,我们使用以下作为Args:
调用NCover.Console.exeString.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 dlls”中运行。当我们退出循环时,我们进入“最终NCover活动”&首先是“Merge NCCovs”部分,再次执行NCover.Console.exe - 这次使用不同的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报告,这是在“Generate final 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
)