2009-07-17 6 views
20

Devo sapere come dire a MSTEST di eseguire tutti i progetti di test in un file di soluzione. Questo deve essere fatto dalla riga di comando. In questo momento devo passare un file di progetto specifico, sto cercando di farlo funzionare da un file SOLUTION.Come posso comunicare a MSTEST di eseguire tutti i progetti di test in una soluzione?

Spero che ciò sia possibile, perché in Visual Studio, premendo Ctrl + R, A, vengono eseguiti TUTTI i test nella soluzione attualmente aperta.

Il modo in cui ho interpretato i file della guida, è necessario passare in ogni DLL in particolare.

Voglio eseguirlo dalla riga di comando dal mio server CruiseControl.NET, così posso scrivere altre utilità per farlo accadere. Se c'è un modo strano per far sì che questo accada attraverso qualche altro metodo, fammi sapere.

Come dire a MSTEST di eseguire tutti i progetti di test per una soluzione?

<exec> 
    <!--MSTEST seems to want me to specify the projects to test --> 
    <!--I should be able to tell it a SOLUTION to test!--> 
    <executable>mstest.exe</executable> 
    <baseDirectory>C:\projects\mysolution\</baseDirectory> 
    <buildArgs>/testcontainer:testproject1\bin\release\TestProject1.dll 
    /runconfig:localtestrun.Testrunconfig 
    /resultsfile:C:\Results\testproject1.results.trx</buildArgs> 
    <buildTimeoutSeconds>600</buildTimeoutSeconds> 
</exec> 
+0

Hai mai risolto questo problema? Non riesco a capire come rendere il materiale "CreateItem" in CC.NET? – D3vtr0n

risposta

-1

vorrei solo scrivere un bersaglio che lo chiama nel modo desiderato, poi improvvisare un file batch che chiama il target che contiene tutte le DLL da testare.

A meno che non si aggiungano progetti di test tutto il tempo, molto raramente è necessario modificarlo.

+0

Aggiungiamo progetti di test ogni 4-5 mesi, mettendo il progetto in una soluzione "master" per "auto building" è già un habbit. Sto cercando di minimizzare l'aggiunta di ulteriori passaggi da ricordare. la cosa spaventosa del test è quanto sia facile non eseguire mai i test che hai scritto. – Jeremiah

+0

Ogni progetto non di test ha un singolo progetto di test corrispondente? –

-1

Perché non fare in modo che msbuild restituisca tutti gli assiemi di test in una cartella.

Provare a impostare le proprietà OutputPath, OutputDir, OutDir in msbuild per ottenere ciò.

quindi eseguire il più mstest contro tutti gli assembly in quella cartella.

+0

il problema è che gli assembly di test sono proprio accanto agli assiemi reali che stanno testando. inviando mstest un comando come "* .dll". Sto cercando di rendere questo processo abbastanza stupido, quindi stiamo sempre testando i progetti che aggiungiamo. se aggiungiamo un nuovo progetto di test, che probabilmente accadrà ogni 4-5 mesi (abbastanza breve da dimenticare i passaggi), voglio elaborare semplicemente la lettura di una soluzione per i progetti di test. – Jeremiah

+0

Hai suffisso il tuo test assembly con. Test? – Ryu

0

È possibile applicare alcune convenzioni sulla denominazione e sulla posizione dei progetti di test, quindi è possibile eseguire MSTest su, ad esempio, tutti * Test.dll sotto la posizione della soluzione.

Per quanto ne so, non c'è modo di raccontare un progetto di test da una solitaria "normale" progetto DLL su un file di soluzione. Quindi, un'alternativa potrebbe essere quella di analizzare i file di progetto e/o i file .vsmdi per trovare i progetti di test, ma potrebbe essere piuttosto complicato.

0

Non so direttamente ma è qui che VSMDI [fx: sputa in un angolo] può aiutare. Nella tua soluzione aggiungi tutti i test al VSMDI. E quindi passare il VSMDI al meglio usando/testmetadata.

Tuttavia, suggerirei di seguire le convenzioni di cui sopra. Utilizza una convenzione di denominazione e esegui il dump del file SLN utilizzando say per ciclo nello script di comando

10

Per elaborare la risposta di VladV e rendere le cose un po 'più concrete, seguire la convenzione di denominazione proposta eseguendo i test può essere facilmente essere automatizzato con MSBuild. Il seguente frammento del file msbuild del mio progetto attuale fa esattamente quello che hai chiesto.

<Target Name="GetTestAssemblies"> 
    <CreateItem 
     Include="$(WorkingDir)\unittest\**\bin\$(Configuration)\**\*Test*.dll" 
     AdditionalMetadata="TestContainerPrefix=/testcontainer:"> 
     <Output 
      TaskParameter="Include" 
      ItemName="TestAssemblies"/> 
    </CreateItem> 
</Target> 
<!-- Unit Test --> 
<Target Name="Test" DependsOnTargets="GetTestAssemblies"> 
    <Message Text="Normal Test"/> 
<Exec 
    WorkingDirectory="$(WorkingDir)\unittest" 
    Command="MsTest.exe @(TestAssemblies->'%(TestContainerPrefix)%(FullPath)',' ') /noisolation /resultsfile:$(MSTestResultsFile)"/> 
    <Message Text="Normal Test Done"/> 
</Target> 

Inoltre, l'integrazione di MsBuild con CruiseControl è un gioco da ragazzi.

Modifica
Ecco come si puo 'chiamare' msbuild dal ccnet.config.

In primo luogo, se non si utilizza già MSBuild per la build automation aggiungere il seguente codice XML in tutto il frammento presentato in precedenza:

<Project DefaultTargets="Build" 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    ..... <insert snippet here> ..... 
</Project> 

Salva questo esempio RunTests.proj accanto alla soluzione nell'albero dei sorgenti. Ora è possibile modificare il bit di ccnet.config sopra al seguente:

<msbuild> 
    <executable>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe</executable> 
    <workingDirectory>C:\projects\mysolution\</workingDirectory> 
    <baseDirectory>C:\projects\mysolution\</baseDirectory> 
    <projectFile>RunTests.proj</projectFile> 
    <targets>Test</targets> 
    <timeout>600</timeout> 
    <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger> 
</msbuild> 
+0

Come e dove lo si incorpora nella configurazione di CruiseControl? Questo codice che hai fornito deve risiedere in uno script .build di attività NANT? Oppure questo XML va direttamente nella configurazione di CC.NET? – D3vtr0n

+0

Vorrei che fosse un "pezzo di torta". Penso che sia un P.O.S. personalmente! Come lo fai in CruiseControl.NET?La domanda originale non chiedeva come fare in MSBuild! – D3vtr0n

+0

@Devtron ha ampliato la risposta, questo aiuto? –

1

so che questa discussione è piuttosto vecchio, ma la sua ancora alto su Google così ho pensato che potrebbe aiutare uno o due. In ogni caso, poiché non esiste una soluzione soddisfacente per questo. Ho scritto un compito di msbuild per questo. dettagli possono essere trovati qui: http://imistaken.blogspot.com/2010/08/running-all-tests-in-solution.html

+0

È bello e tutto tranne come funziona in CruiseControl.NET? Con il task EXEC che compila i test? – D3vtr0n

2

questo è un vecchio thread, ma mi sono stati alle prese con lo stesso problema e ho capito che si può davvero semplicemente eseguire MSTest su ogni dll nella intera soluzione e non lo fa veramente causare problemi. MSTest sta cercando i metodi negli assembly contrassegnati con l'attributo [TestMethod] e gli assembly che non sono assiemi "test" non avranno alcun metodo decorato con quell'attributo. Quindi ottieni un "Nessun test da eseguire". messaggio indietro e nessun danno fatto.

Così, per esempio a Nant si può fare questo:

<target name="default"> 
    <foreach item="File" property="filename"> 
     <in> 
      <items> 
       <include name="**\bin\Release\*.dll" /> 
      </items> 
     </in> 
     <do> 
      <echo message="${filename}" /> 
      <exec program="C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"> 
       <arg value="/testcontainer: ${filename}" /> 
       <arg value="/nologo" /> 
      </exec> 
     </do> 
    </foreach> 
</target> 

e verrà eseguito tutti i metodi di prova in ogni DLL in ogni cartella di uscita bin \ nella soluzione. Quelle che non sono le dll di test restituiranno un "Nessun test da eseguire". e quelli che hanno fatto i test faranno funzionare i test. L'unica parte che non ho ancora capito è che (in NAnt) l'esecuzione si arresta la prima volta che un comando restituisce un valore diverso da zero. Quindi, se un test unitario fallisce, non continua ad eseguire alcun test negli assembly successivi. Non è grandioso, ma se passano tutti i test, allora correranno tutti.

+1

btw - il modo per far sì che NAnt continui a funzionare anche se alcuni test di unità falliscono è quello di mettere l'attributo failonerror = "false" nell'operazione exec. In questo modo tutti i test verranno eseguiti anche se alcuni in un progetto falliscono. È possibile memorizzare i valori di ritorno di ogni esecuzione di prova in una proprietà e dopo che tutti i test sono stati eseguiti, è possibile controllare tale proprietà e se è maggiore di 0, è possibile che non venga eseguita manualmente in questo modo:

2

Ho appena risolto questo problema di recente. Ecco la mia proposta: utilizzare l'opzione testmetadata + LISTA-TEST di mstest

  1. In primo luogo è necessario creare un LISTA-TEST in testmetadata del file (vsmdi)
  2. linea di comando dovrebbe essere mstest /testmetadata:....vsmdi /testlist:<name>
  3. Quindi utilizzare CCNet config per eseguire mstest
+4

ma ciò significa che è necessario mantenere il file .vsmdi ogni volta che si aggiunge un nuovo test – gbjbaanb

+0

Per quanto vale, gli elenchi di test sono deprecati a partire da VS2012. –