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 の外部でテスト ランナーを使用して単体テストを実行することです。これにより、正しいリターン コードが表示されます。

次に、2 番目のステップとして、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 に答える