Come posso fare in modo che "Copia nella directory di output" funzioni con i test unitari?


123

Quando compilo un progetto di unit test prima che i test vengano eseguiti, l'output del test viene copiato in una cartella TestResults e quindi i test vengono eseguiti. Il problema che sto riscontrando è che non tutti i file nella directory Debug / bin vengono copiati nel progetto TestResults.

Come posso ottenere un file che viene copiato nella directory Debug / bin per essere copiato anche nella cartella TestResults?

Risposte:


121

Il modo standard per eseguire questa operazione è specificare gli elementi di distribuzione nel .testrunconfigfile, a cui è possibile accedere tramite l' elemento Modifica configurazioni esecuzione test nel menu Test di Visual Studio o nella cartella Elementi soluzione .


15
In VS2010 questo è: Prova / Modifica impostazioni di prova / locale, quindi nell'elenco, seleziona "Distribuzione", seleziona la casella "Abilita ..." e aggiungi i file.
Marcel

18
Potrebbe essere necessario chiudere la soluzione (o anche Visual Studio) e riaprirla prima che questa modifica abbia effetto correttamente
RobV

RobV, mi hai reso la giornata. GRAZIE!
Ignacio Soler Garcia

2
Se si utilizza l'attributo [DeploymentItem] nel codice, non è necessario specificare i file nella finestra di dialogo - vedere il codice di @ tomfanning di seguito.
Patrick Szalapski

Questo non risolve il mio problema con la copia dell'output di configurazione dal bin o dalla cartella di rilascio perché in fase di progettazione non ho informazioni sul fatto che il file sarà nella cartella di debug o di rilascio e per me questo è il file in cui non viene copiato la cartella Out nei risultati dei test
Gurpreet

61

È possibile specificare l'attributo di distribuzione come un esempio mostrato di seguito; Inoltre è necessario impostare le proprietà "Contenuto" e "Copia se più recente" (non c'è documentazione sulle impostazioni successive, ma le hai impostate per farlo funzionare.

[TestMethod]
[DeploymentItem("mytestdata.xml")]
public void UploadTest()
{



}

3
Devi ancora abilitarlo. Come ha scritto Mercel nel suo commento, in VS2010 questo è: Test / Modifica impostazioni di test / locale, quindi nell'elenco, seleziona "Distribuzione", seleziona la casella "Abilita ...".
Patrick Szalapski

Sto lottando con questo problema in Visual Studio 2012 Express e poiché è un'edizione limitata è stato difficile trovare una documentazione chiara. Un grande grazie per questa risposta.
DavidHyogo

2
Funziona alla grande. In realtà penso che questo sia il metodo migliore e la risposta in quanto documenta i file richiesti proprio sopra il metodo di prova.
bu5hm4nn

1
Ho scoperto che l'attributo DeploymentItem funziona anche quando specificato a livello di classe di test (invece che a livello di metodo).
Jon Schneider

10

Ho dovuto attivare "Abilita distribuzione" sotto Test -> Edit Test Settings -> Local -> Deploymentaffinché l' [DeploymentItem]attributo funzionasse.


Questo è vero ... L'ho appena abilitato e ora l'attributo funziona. Grazie!
Miguel Angelo

Come accennato nel mio commento a un'altra risposta, sto lottando con lo stesso problema in Visual Studio 2012 Express e le 2 risposte insieme mi hanno finalmente dato la soluzione.
DavidHyogo,

5

Tutte e tre le risposte sono corrette, a seconda delle tue esigenze.

L'aggiunta di file da distribuire in .testrunconfig (.testsettings in VS2010) copierà tutti quei file in ogni cartella di output del test, anche per i test non correlati eseguiti in isolamento. Se esegui un test, tutti i file di dati del test elencati nella sezione di distribuzione di .testssettings verranno copiati nella cartella di output del test.

Nei miei test ho bisogno di copiare un file XML previsto nella cartella di output del test per confrontarlo con l'XML di output del test effettivo. Utilizzo l'attributo DeploymentItem per copiare solo il file XML relativo ai test in esecuzione. In VS2010 ho dovuto abilitare la distribuzione nel file .testsettings (ma non aggiungere alcun percorso) e quindi fare riferimento al percorso del file XML relativo a TestProject in DeploymentItem.

Spero che questo ti aiuti.


2
Il mio problema era il percorso relativo menzionato qui, pensavo che l'Xml dovesse essere nella directory in cui si trovava il test, ma doveva essere nella radice del progetto, o essere preceduto dalla directory in cui si trovava.
Wes Grant

2

Ho avuto un problema simile, ma il mio aveva a che fare con il puntamento al file TraceAndTestImpact.testsettings anziché al file Local.testsettings. È possibile passare da uno all'altro nel menu Test / Seleziona impostazioni test attivo.


2

Vorrei solo migliorare la risposta accettata menzionando un modo per farlo distribuire specificamente per dll piuttosto che il normale metodo di usarlo per dati o configurazione ecc., Per le circostanze in cui CopyLocal non funziona:

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]

1

Quanto segue funziona in VS2012 per i progetti di test inclusi in più soluzioni senza utilizzare un file di impostazioni di prova:

1) Disporre i file e le cartelle che si desidera distribuire in una cartella nella directory del progetto di prova.

2) Nelle proprietà del progetto, crea una fase di post compilazione

xcopy /Y /S /i "$(ProjectDir)<Project_Folder_Name>\*" "$(TargetDir)<Deployment_Folder_Name>"

$(ProjectDir)e $(TargetDir)sono macro che verranno interpretate da VS e dovrebbero essere incluse come tali.

<Project_Folder_Name> è il nome della cartella creata nel passaggio 1.

<Deployment_Folder_Name>è il nome della cartella in cui verranno distribuiti i file di test e deve essere denominato in modo che sia univoco quando più progetti di test vengono distribuiti nella stessa directory, ad es <Project_Name>_TestInputs.

Anche i file di test nelle posizioni condivise devono essere copiati nella cartella di distribuzione della directory di destinazione per limitare le interazioni di test. Fornisci il percorso di origine relativo alla $(ProjectDir)macro. Ad esempio "$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml".

3) Aggiungere una [DeploymentItem(source, destination)]proprietà a ciascun metodo di test che utilizza un file di distribuzione (best practice) o alla classe di test (pratica più semplice per i pigri o frettolosi e il modo più semplice per aggiornare un progetto con i percorsi relativi utilizzati in precedenza o un file di impostazioni di test ).

In un metodo di test, sourceè il percorso del file o della directory utilizzato nel metodo di test relativo alla directory di destinazione come creato da xcopyed destinationè il percorso della directory in cui verrà creato rispetto alla directory di distribuzione. In modo che i test vengano eseguiti in modo coerente nella directory di destinazione o in una directory di distribuzione. Il percorso di destinazione dovrebbe essere lo stesso del percorso di origine senza un riferimento al file. Esempio: [DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")]. Il DeploymentItemdovrebbe essere incluso in ogni metodo che utilizza il file o la directory.

In una classe, sourcee destinationsono entrambi il nome della cartella creata nella directory di destinazione da xcopy; questo copierà l'intera cartella nella directory di distribuzione quando viene eseguito un test nella classe. Esempio:[DeploymentItem("Example_TestInputs","Example_TestInputs")]

4) Nei metodi di test, ora puoi accedere a file e directory con sicurezza che saranno nella directory di lavoro indipendentemente da dove Visual Studio ha deciso di metterlo quel giorno, ad es File.Exists(".\Example_TestInputs\C1219TDL-2008.xml").


0

Prova la riga di comando dell'evento Post-Build da Visual Studio (se stai usando quell'IDE).


3
Lo sono, ma sembra un po 'un trucco. Questo deve essere uno scenario abbastanza comune e spero che ci sia solo qualche opzione o proprietà che non sto impostando correttamente.
Eric Schoonover,

0

In Visual Studio 2012 non è necessario un attributo DeploymentItem per il caso semplice. Vedi la mia risposta qui


0
[TestMethod]
[DeploymentItem("ProjectName/Folder/SubFolder/file.xml", "Folder/Subfolder")]
public void YourTestMethod()
{
   // in the method you are testing you should have this:
   var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) + "/Folder/Subfolder/file.xml";
}

0

La risposta accettata è corretta, così come la maggior parte delle altre risposte. Tuttavia, nel corso degli anni ho scoperto che il sistema Deploment di Visual Studio Unit Tests utilizzando DeploymentAttribtue e Copy to Output risulta macchinoso se si dispone di un numero elevato di file di dati. Ho scoperto che mantenere i file nella loro posizione originale ha funzionato meglio.

Dettagli completi nella mia altra risposta qui. https://stackoverflow.com/a/53004985/2989655

Spero che questo ti aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.