MSBUILD запускает NCover против совпавших проектов - PullRequest
1 голос
/ 08 февраля 2011

Я использую 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>

Как эффективно использовать @ (UnitTestProjects) вконтекст этой цели NCover?

1 Ответ

1 голос
/ 09 февраля 2011

Для пакетирования вашего @(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".

...