2011-02-08 6 views
1

J'utilise MSBuild et j'obtiens tous les projets de test en utilisant une regex sur le nom du projet, comme ceci.MSBUILD Exécuter NCover contre des projets correspondants

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

Je veux maintenant utiliser @ (UnitTestProjects) et passez-les tous à NCover pour vérifier que les tests sont tous donnent une couverture de 100%.

Pour ce faire, sur un seul projet, je fais quelque chose comme ceci:

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

Comment utiliser efficacement @ (UnitTestProjects) dans le cadre de cet objectif NCover?

Répondre

1

Pour votre Batching @(UnitTestProjects) votre cible devra l'utiliser comme ceci:

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

Une solution plus fiable serait, de fournir une liste des TaskItems, tenant des métadonnées sur votre projet (Test).

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

Votre question suggère que vous êtes à la recherche d'une approche automatisée qui vous permettra d'ajouter de nouveaux projets de test sans avoir à maintenir une liste de configuration de TaskItems.

Puisqu'il serait assez difficile, pour extraire toutes les informations nécessaires pour alimenter votre tâche NCover peut-être une approche semi-automatisée pourrait fonctionner pour vous.

Vous pouvez ajouter une importation à votre projet de test qui alimenteront votre projet de test global 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> 

L'utilisation dans votre NCover tâche sera la même chose que ci-dessus. De cette façon, votre script de build principal n'a pas besoin de connaître un projet de test spécifique; il ne traite que votre ItemGroup "TestProject".

+0

Salut Filburt. Je cherche des réponses spécifiques sur le passage de la collection de projets de tests unitaires à NCover. – Fenton

+0

@Sohnee Voir ma réponse mise à jour avec un exemple réel pour votre tâche NCover et une solution peut-être plus pratique. – Filburt

+0

Salut Filburt - merci pour la mise à jour de la réponse - ressemble plus à ce que je suis après. Je vais faire un tour. – Fenton

Questions connexes