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