File di copia MSTest nella cartella della corsa di prova


108

Ho un test che richiede un file XML per essere letto e quindi analizzato. Come posso copiare ogni volta questo file nella cartella della corsa di prova?

Il file XML è impostato su "Copia se più recente" e una modalità di compilazione "nessuno" (poiché non è realmente una cosa compilabile)

Risposte:


131

usa un DeploymentItemattributo

using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using CarMaker;

namespace DeploymentTest
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod()]
        [DeploymentItem("testFile1.xml")]
        public void ConstructorTest()
        {
            string file = "testFile1.xml";
            Assert.IsTrue(File.Exists(file), "deployment failed: " + file +
                " did not get deployed");
        }
    }
}

17
L'attributo DeploymentItem può anche essere specificato a livello di classe, per influire su ogni test nella classe.
Hannes Nel

24
Non dimenticare che, se hai i tuoi elementi in una sottocartella, includerli anche nella sottodirectory di distribuzione [DeploymentItem ("SubFolder \ testFile1.xml", "SubFolder")]
omgtitb

31
Oltre al commento di Thomas, il valore predefinito per RelativePathRoot è la cartella della soluzione, quindi se la soluzione è simile a questa (.. \ SolutionFolder \ TestProject \ TestData \ aFile.txt) Il tuo DeploymentItem sarebbe simile a questo .. ([DeploymentItem (@ "TestProject \ TestData \ aFile.txt", "TestData")]) .. e faresti riferimento al file nel test usando questo .. (string file = @ "TestData \ aFile.txt";)
Michael Dausmann

6
Documentazione DeploymentItemAttribute per VS2010 : questo attributo può essere specificato su un metodo di test o su una classe di test.
Alex Che

12
Ciò che la maggior parte dei post che ho visto non menziona è che se non riesci a farlo funzionare, probabilmente devi selezionare la casella di controllo "Abilita distribuzione", che puoi trovare se vai su Test -> Modifica impostazioni di prova -> local (local.testsettings) -> scheda Distribuzione. Ho appena fatto questo e poi DeploymentItem ha funzionato bene.
Dave

26

Sembra che se fornisci un file TestSettings per la Soluzione, puoi deselezionare l'opzione "Abilita distribuzione" e impedire a mstest di tentare di eseguire dalla ...TestResults\...\outcartella in cui non copia i tuoi file aggiuntivi (a meno che non li rendi un'opzione di distribuzione) .

Ciò è utile anche se si dipende dal fatto che i file aggiuntivi si trovino in una struttura di cartelle preservata perché tutti gli elementi di distribuzione sembrano essere copiati direttamente (flat) nella cartella di esecuzione temporanea (out) se si utilizza l'opzione Deployment, Add Folder in TestSettings ( le risposte sopra suggeriscono che puoi mantenere la struttura se aggiungi ogni elemento come proprio DeploymentItem).

Per me ha funzionato bene eseguendo i test direttamente in Visual Studio (cioè i miei file extra nella loro struttura sono stati trovati e usati dai test) perché avevo creato un file TestSettings per un altro motivo molto tempo fa (che ha Abilita distribuzione deselezionata), ma non quando TeamCity ha eseguito mstest per eseguire i test perché non avevo specificato che doveva essere utilizzato il file TestSettings.

Per creare un file TestSettings in Visual Studio, fare clic con il pulsante destro del mouse sulla soluzione e scegliere Nuovo elemento, quindi selezionare il modello TestSettings. Per utilizzare il file TestSettings al prompt dei comandi di mstest.exe, aggiungi l'opzione /testsettings:C:\Src\mySolution\myProject\local.testsettings (o aggiungi come opzione della riga di comando aggiuntiva in TeamCity con il percorso appropriato)



3

La migliore soluzione per me è usare le impostazioni di test, soprattutto se più test richiedono gli stessi file di dati.

Per prima cosa crea un file di impostazioni di prova e aggiungi gli elementi di distribuzione necessari (nome file o cartella):

<TestSettings name="Local" id="00ebe0c6-7b64-49c0-80a5-09796270f111" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>These are default test settings for a local test run.</Description>
  <Deployment>
    <DeploymentItem filename="Folder1\TestScripts\test.xml" outputDirectory="TestScripts"/>
    <DeploymentItem filename="Folder2\TestData\" outputDirectory="TestData"/>
  </Deployment>
<...../>
  • In esecuzione in Visual Studio, usa "seleziona File Impostazioni Test" dal menu "Test \ Impostazioni Test" per selezionare nuove impostazioni di test

  • Eseguendo mstest, utilizza il parametro / testsettings per fare in modo che mstest utilizzi le tue impostazioni di test.


2

È possibile definire DeploymentItem in una classe che contiene un metodo con l'attributo AssemblyInitialize. Quindi sei sicuro che i file vengano copiati indipendentemente dal test che esegui.

Purtroppo l'attributo DeploymentItem viene eseguito solo sulle classi che contengono i test che stai eseguendo. Quindi, se hai 10 classi di test che usano lo stesso set di file, devi aggiungere l'attributo a tutti loro.

Abbiamo anche scoperto che le modifiche nei file * .testsettings non vengono aggiornate automaticamente in Visual Studio. Pertanto, dopo aver aggiunto file / cartelle nella distribuzione in testsettings, è necessario riaprire il file della soluzione e quindi eseguire i test.


2

In Visual Studio 2012, vstest.console.exe (il test runner integrato) viene eseguito con la directory di output come percorso corrente. Ciò significa che è sufficiente includere gli elementi nella soluzione con la proprietà "Copia sempre" o "Copia se più recente" affinché possano essere utilizzati dal test. Non è necessario l'attributo DeploymentItem per il caso generale. Lo stesso vale quando si esegue vstest.console.exe dalla riga di comando all'interno della directory di output / test.

Esistono alcuni casi in cui viene utilizzata una cartella separata, uno dei quali è quando si utilizza l'attributo DeploymentItem. Vedi qui per maggiori informazioni.

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.