如何从DotCover控制台运行器获取所涵盖可执行文件的退出代码?

时间:2011-04-27 21:26:28

标签: msbuild nunit code-coverage dotcover

我的组织正致力于通过自定义MSBuild任务将DotCover的控制台运行器(描述为herehere)集成到基于MSBuild的构建过程中。

正如您所料,我们正在讨论NUnit在我们的单元测试程序集上运行。虽然我们对DotCover产生的覆盖结果非常满意,但我们发现我们的测试现在可以在不导致构建失败的情况下失败。前进一步,后退两步。

DotCover(至少我们运行它的方式)完全隐藏了覆盖进程的结果,包括控制台输出和退出代码。我希望它在这方面更像NCover - 回显所有输出和覆盖过程中的退出代码。

有没有人知道如何使用DotCover控制台运行器实现这些功能?获取所涵盖流程的退出代码是最重要的,因为我们需要在测试失败的情况下使构建失败。

3 个答案:

答案 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) &lt; 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以获得覆盖率结果。

希望这有助于某人。