2011-02-08 6 views
1

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

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

私は今、テストはすべて100%のカバレッジを与えていることを確認する(UnitTestProjects)@を使用してNCoverにそれらすべてを通過したいです。単一のプロジェクトでこれを行うには

、私はこのような何かを:

<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)@使うのですか?あなたの@(UnitTestProjects)あなたの目標は、このようにそれを使用する必要がありますバッチ処理に

答えて

1

<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 Taskをフィードするために必要なすべての情報を抽出するのは非常に難しいため、半自動化されたアプローチが役立つかもしれません。あなたのグローバルテストプロジェクトItemGroupを供給します、あなたのテストプロジェクトにインポートを追加することができ

:あなたNCoverタスクに

<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> 

使用方法は上記と同じになります。

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

+0

こんにちはFilburt。私はユニットテストプロジェクトのコレクションをNCoverに渡す際の答えを具体的に探しています。 – Fenton

+0

@SohneeあなたのNCoverタスクの実際の例とおそらくもっと実用的な解決策を使って、私の更新された答えを見てください。 – Filburt

+0

こんにちはFilburt - 答えを更新していただきありがとうございます。私はそれをスピンします。 – Fenton

関連する問題