2010-11-17 10 views
4

J'essaie de configurer MSBuild avec NUnit comme pilote de test unitaire, mais le script reste suspendu une fois que NUnit est terminé. Il ne semble pas finaliser son travail et laisser MSBuild continuer son travail.
Je travaille en .NET 4.0 et en utilisant NUnit 2.5.8.
Si j'exécute le test manuellement ou en utilisant le gui (soit VS2010 ou NUnit), cela fonctionne bien, mais pas quand MSBuild l'appelle.MSBuild se bloque après la fin de NUnit

J'apprécierais n'importe quelle aide avec la recherche d'erreur ou juste une tête sur où chercher des réponses.

La commande manuelle ressemble à ceci:
C: \ ....> nunit \ nunit-console.exe buildbinaries \ YYYY.XXXX.Extractor.Test.IntegrationTest.dll /xml=nunit.xml

et MSBuild abrégé:

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 

    <!-- define folders for build output and reports --> 
    <PropertyGroup> 
    <BuildPath>buildbinaries\</BuildPath> 
    <ReportPath>buildreports\</ReportPath> 
    <ReleaseFolder>release_artefacts\</ReleaseFolder> 
    <PublishFolder>c:\ZZZ Applications\published builds\</PublishFolder> 
    <DeploymentFolder>\\seldclq99\ZZZ_Costanza_Dev$\</DeploymentFolder> 
    </PropertyGroup> 

    <PropertyGroup> 
    <!-- specify assemblies that should be included in coverage report --> 
    <NCoverAssemblyList>YYYY.XXXX.Extractor.Business.dll; YYYY.XXXX.Extractor.Common.dll YYYY.XXXX.Extractor.Configuration.dll YYYY.XXXX.Extractor.DAL.Access.dll YYYY.XXXX.Extractor.DAL.Facade.dll YYYY.XXXX.Extractor.Service.Contracts.dll YYYY.XXXX.Extractor.Service.dll YYYY.XXXX.Extractor.Service.Host.WebHost.dll YYYY.XXXX.Extractor.ServiceGateway.dll</NCoverAssemblyList> 
    </PropertyGroup> 

    <!-- define item group for deliverables --> 
    <ItemGroup> 
    <Binaries Include="$(BuildPath)/**/*.*" Exclude="$(BuildPath)nunit*" /> 
    </ItemGroup> 

    <!-- 
    This is the default target that will be executed if MSBuild is not started 
    with a specific target (this is decided by the DefaultTargets attribute in 
    the root element of this XML document) 
    --> 
    <Target Name="BuildAndTest"> 
    <CallTarget Targets="SetupDirs" /> 
    <CallTarget Targets="Build" /> 
    <CallTarget Targets="UnitAndIntegrationTest" /> 
    <CallTarget Targets="FxCop" /> 
    <CallTarget Targets="CopyToReleaseFolder" /> 
    </Target> 

    <!-- Setup folders used during the build --> 
    <Target Name="SetupDirs"> 
    <RemoveDir Directories="$(ReportPath);$(BuildPath);$(ReleaseFolder)" ContinueOnError="true"/> 
    <MakeDir Directories="$(ReportPath);$(BuildPath);$(ReleaseFolder);$(AssemblyVersionFolder)" ContinueOnError="true"/> 
    </Target> 

    <Target Name="Build"> 
    <!-- build the software using msbuild --> 
    <!-- Build error in the Install build--> 
    <MSBuild ContinueOnError="true" RebaseOutputs="false" Targets="Clean;Rebuild" Projects="YYYYXXXXExtractor.sln" Properties="Configuration=Release;OutDir=..\$(BuildPath)" /> 

    </Target> 

    <!--Run the coverage stats--> 
    <Target Name="UnitAndIntegrationTest"> 
     <Exec Command="nunit\nunit-console.exe buildbinaries\YYYY.XXXX.Extractor.Test.IntegrationTest.dll /xml=$(ReportPath)nunit.xml "/> 
     <CallTarget Targets="UnitTest" /> 
    </Target> 

    <Target Name="UnitTest"> 
     <Exec Command="nunit\nunit-console.exe buildbinaries\YYYY.XXXX.Extractor.Test.UnitTest.dll /xml=$(ReportPath)nunit.xml"/> 
    </Target> 

    <!-- Run FxCop --> 
    <!-- The ForceError.bat fires if the xml file is not found... aka an error was found --> 
    <!-- The quiet command forces an Xml file ONLY if warnings or Errors are found --> 
    <Target Name="FxCop"> 
    <Exec Command="..\tools\fxcop\FxCopCmd.exe /p:..\FxCopSettings.FxCop /o:$(ReportPath)fxcop.xml" /> 
    <Exec Condition="Exists('$(ReportPath)fxcop.xml')" Command="..\tools\fxcop\FX_Cop_Failed_Rule_Checks.bat" /> 

    <!--STATS: Run again but don't fail and this time run for all rules.--> 
    <Exec Command="..\tools\fxcop\FxCopCmd.exe /p:..\FxCopSettingsALLRULES.FxCop /o:$(ReportPath)fxCopAllRules.xml" /> 

    </Target > 

Répondre

1

J'ai remarqué un comportement similaire sur des serveur de build depuis la mise à niveau vers .NET 4. MsBuild semble se bloquer par intermittence sur soit NUnit, FxCop ou CTDO sur les commandes EXEC. Si vous vérifiez le gestionnaire de tâches, le processus pour la commande exécutée en externe (par exemple Nunit.exe) est toujours en cours. Si vous tuez manuellement le processus, MsBuild continue sur sa voie joyeuse - ce qui est loin d'être idéal!

Cela peut-il être un bug dans la dernière version de MsBuild? Notre serveur de compilation fonctionnait assez bien jusqu'à la mise à niveau .NET 4.

3

J'ai eu le même problème avec NUnit 2.5.8. Il y a une discussion de ceci sur le site de nunit au sujet du processus de test suspendu. Je suis passé à NUnit 2.5.7 et le problème est parti.

Il semble que cela ait été corrigé il y a quelques semaines dans 2.5.9.

+0

Pour une raison inconnue, 2.5.7 ne démarre pas du tout sur notre machine. Il ne chargera pas le fichier nunit.core.dll. Donc ce n'est pas une solution viable pour moi malheureusement. –

+0

Ce problème n'a toujours pas été résolu dans le dernier nunit. Le bug est suivi ici si vous êtes intéressé: https://bugs.launchpad.net/nunitv2/+bug/602761 –

0

Si vous exécutez ProcessExplorer sur votre serveur, vous remarquerez qu'un processus hors bande appelé nunit-agent est généré, ce qui finit par bloquer le coureur nunit.

Je n'ai pas validé que c'est corrigé dans 2.5.9, mais il pourrait s'agir d'informations qui pourraient être utiles.

+0

Oui, chaque fois que je termine manuellement l'invite de commande MSBuild, l'agent nunit reste. –