1

私は MSBuild を使用しており、このようにプロジェクト名に正規表現を使用してすべてのテスト プロジェクトを取得しています。

<RegexMatch Input="@(AllProjects)" Expression="(.)*Test(.)*">
    <Output  TaskParameter="Output" ItemName="UnitTestProjects"/>
</RegexMatch>

@(UnitTestProjects) を使用し、それらすべてを NCover に渡して、テストがすべて 100% のカバレッジを提供していることを確認します。

単一のプロジェクトでこれを行うには、次のようにします。

<Target Name="Coverage">
    <NCover TestRunnerExe="C:\Program Files\NUnit 2.5.8\bin\net-2.0\nunit-console.exe"
        TestRunnerArgs="&quot;C:\SomeProject\bin\SomeProject.dll&quot; &quot;C:\SomeProject\bin\SomeProjectTest.dll&quot;"
        WorkingDirectory="C:\SomeProject\bin\"
        AppendTrendTo="coverage.trend"
        OnlyAssembliesWithSource="True"
        ProjectName="SomeProjectCoverage"    />
</Target>

この NCover ターゲットのコンテキストで @(UnitTestProjects) を効果的に使用するにはどうすればよいですか?

4

1 に答える 1

1

バッチ処理の場合@(UnitTestProjects)、ターゲットは次のように使用する必要があります。

<Target Name="Coverage">
    <NCover TestRunnerExe="C:\Program Files\NUnit 2.5.8\bin\net-2.0\nunit-console.exe"
    TestRunnerArgs="&quot;%(UnitTestProjects.Identity)&quot; &quot;%(UnitTestProjects.Identity)&quot;"

<!--
If you receive the Task Output (*Test.dll) you will have to extract
the working dir path
-->
    WorkingDirectory="C:\SomeProject\bin\"
    AppendTrendTo="coverage.trend"
    OnlyAssembliesWithSource="True"
<!--
... the same thing applies to finding out the current project name
from your Task Ouput.
-->
    ProjectName="SomeProjectCoverage"    />
</Target>

より信頼性の高い解決策は、(テスト) プロジェクトに関するメタデータを保持する TaskItems のリストを提供することです。

<ItemGroup>
    <TestProject Include="MyProject1.Test.dll">
        <TestProjectName>MyProject1</TestProjectName>
        <MyTestProjectWorkingDir>C:\MyProject1\bin</MyTestProjectWorkingDir>
    </TestProject>
    <TestProject Include="MyProject2.Test.dll">
        <TestProjectName>MyProject2</TestProjectName>
        <MyTestProjectWorkingDir>C:\MyProject2\bin</MyTestProjectWorkingDir>
    </TestProject>
</ItemGroup>

<Target Name="Coverage">
    <NCover TestRunnerExe="C:\Program Files\NUnit 2.5.8\bin\net-2.0\nunit-console.exe"
    TestRunnerArgs="&quot;%(TestProject.Identity)&quot; &quot;%(TestProject.Identity)&quot;"
    WorkingDirectory="%(TestProject.MyTestProjectWorkingDir)"
    AppendTrendTo="coverage.trend"
    OnlyAssembliesWithSource="True"
    ProjectName="%(TestProject.MyTestProjectName)"    />
</Target>

あなたの質問は、TaskItems の構成リストを維持することなく、新しいテスト プロジェクトを追加できる自動化されたアプローチを探していることを示唆しています。

NCover タスクにフィードするために必要なすべての情報を抽出するのは非常に難しいため、半自動化されたアプローチが有効な場合があります。

グローバル テスト プロジェクトの ItemGroup にフィードするインポートをテスト プロジェクトに追加できます。

<ItemGroup>
    <!-- add existing ItemGroup -->
    <TestProject Include="@(TestProject)" />

    <!-- add project itself -->
    <TestProject Include="MyProject1.Test.dll">
        <TestProjectName>MyProject1</TestProjectName>
        <MyTestProjectWorkingDir>C:\MyProject1\bin</MyTestProjectWorkingDir>
    </TestProject>
</ItemGroup>

NCover タスクでの使用法は上記と同じです。

この方法では、マスター ビルド スクリプトは特定のテスト プロジェクトについて知る必要がありません。ItemGroup "TestProject" を処理するだけです。

于 2011-02-09T08:31:00.587 に答える