我的组织正致力于通过自定义MSBuild任务将DotCover的控制台运行器(描述为here和here)集成到基于MSBuild的构建过程中。
正如您所料,我们正在讨论NUnit在我们的单元测试程序集上运行。虽然我们对DotCover产生的覆盖结果非常满意,但我们发现我们的测试现在可以在不导致构建失败的情况下失败。前进一步,后退两步。
DotCover(至少我们运行它的方式)完全隐藏了覆盖进程的结果,包括控制台输出和退出代码。我希望它在这方面更像NCover - 回显所有输出和覆盖过程中的退出代码。
有没有人知道如何使用DotCover控制台运行器实现这些功能?获取所涵盖流程的退出代码是最重要的,因为我们需要在测试失败的情况下使构建失败。
答案 0 :(得分:1)
我们正在使用MSBuild和MSBuild社区任务来使构建失败。
您可以使用MSBuild.CommunityTasks的XmlRead任务分析dotCover生成的输出xml文件。
<Target Name="DetermineCoverage">
<Message Text="==================================================" />
<Message Text="Determine Unit Test Coverage" />
<XmlRead
XPath="/Root/@CoveragePercent"
XmlFileName="dotCoverOutput.xml">
<Output TaskParameter="Value" PropertyName="CoveragePercent"/>
</XmlRead>
<Message Text="==" />
<Message Text="== Coverage Percentage $(CoveragePercent)" />
<Error
Text="Unit Test coverage did not exceed the desired threshold"
Condition="$(CoveragePercent) < 90" />
<Message Text="==================================================" />
</Target>
答案 1 :(得分:0)
由于我需要快速解决方法,因此我添加了一个后处理步骤来刮取在DotCover运行期间生成的NUnit xml文件,以便测试用例失败,如果找到任何内容,我就会失败。我是通过简单的自定义MSBuild任务完成的:
public class CheckNUnitResults : Task
{
[Required]
public string ResultFile { get; set; }
public override bool Execute()
{
Log.LogMessageFromText("Analyzing nunit results : " + ResultFile, MessageImportance.Normal);
var failedCases =
XDocument
.Load(ResultFile)
.Descendants("test-case")
.Where(xe => xe.Attribute("success").Value.Equals("False"));
var fail = failedCases.Any();
if (fail)
{
Log.LogError("Found test case failures : " +
string.Join(", ", failedCases
.Select(xe => xe.Attribute("name").Value)
.ToArray()));
}
return !fail;
}
}
这是从MSBuild调用的:
<CheckNUnitResults ResultFile="YourNUnitResultFile.xml" />
(我在包含我的结果文件的ItemGroup的循环中调用它)
答案 2 :(得分:0)
我遇到了同样的问题。
另一种解决方法是首先在dotCover之外使用测试运行器运行单元测试。这将显示正确的返回代码。
然后作为第二步,运行dotCover以获得覆盖率结果。
希望这有助于某人。