2

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

如您所料,我们将介绍 NUnit 在我们的单元测试程序集上运行。虽然我们对 DotCover 生成的覆盖率结果非常满意,但我们发现我们的测试现在可以失败而不会导致构建失败。前进一步,后退两步。

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

有谁知道如何使用 DotCover 控制台运行程序实现其中任何一个?获取所涵盖进程的退出代码是最重要的,因为我们需要在测试失败的情况下构建失败。

4

3 回答 3

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>
于 2011-11-18T20:34:07.160 回答
1

我遇到了同样的问题。

另一种解决方法是首先使用 dotCover 之外的测试运行程序运行单元测试。这将公开正确的返回码。

然后作为第二步,运行 dotCover 以获取覆盖结果。

希望这可以帮助某人。

于 2015-08-27T20:16:09.277 回答
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 上循环调用它)

于 2011-04-27T23:02:26.237 回答