为了批处理您@(UnitTestProjects)
的目标,您必须像这样使用它:
<Target Name="Coverage">
<NCover TestRunnerExe="C:\Program Files\NUnit 2.5.8\bin\net-2.0\nunit-console.exe"
TestRunnerArgs=""%(UnitTestProjects.Identity)" "%(UnitTestProjects.Identity)""
<!--
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=""%(TestProject.Identity)" "%(TestProject.Identity)""
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”。