2011-02-08 50 views
1

我正在使用MSBuild,並使用項目名稱上的正則表達式來獲取所有測試項目,如下所示。MSBUILD針對匹配項目運行NCover

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

如何有效地使用@(UnitTestProjects)在此NCover的背景下目標?

回答

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 Task所需的所有信息可能相當困難,可能半自動化方法可能適用於您。

你可以導入添加到您的測試項目,將養活你的全球測試項目的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」。

+0

嗨Filburt。我正在尋找將單元測試項目集合傳遞給NCover的答案。 – Fenton 2011-02-09 09:19:24