Wie kann ich "In Ausgabeverzeichnis kopieren" für Unit-Tests verwenden?

123

Wenn ich ein Unit-Test-Projekt erstelle, bevor die Tests ausgeführt werden, wird die Testausgabe in einen TestResults-Ordner kopiert und anschließend werden die Tests ausgeführt. Das Problem ist, dass nicht alle Dateien im Debug / bin-Verzeichnis in das TestResults-Projekt kopiert werden.

Wie kann ich eine Datei, die in das Debug / bin-Verzeichnis kopiert wurde, auch in den TestResults-Ordner kopieren lassen?

Eric Schoonover
quelle

Antworten:

121

Die Standardmethode hierfür ist die Angabe der Bereitstellungselemente in der .testrunconfigDatei, auf die über das Element Testlaufkonfigurationen bearbeiten im Menü Visual Studio- Test oder im Ordner Lösungselemente zugegriffen werden kann .

Mark Cidade
quelle
15
In VS2010 ist dies: Testeinstellungen bearbeiten / bearbeiten / lokal. Wählen Sie dann in der Liste "Bereitstellung" aus, aktivieren Sie das Kontrollkästchen "Aktivieren ..." und fügen Sie die Datei (en) hinzu.
Marcel
18
Möglicherweise müssen Sie Ihre Lösung (oder sogar Visual Studio) schließen und erneut öffnen, bevor diese Änderung ordnungsgemäß wirksam wird
RobV
RobV, du hast meinen Tag gemacht. VIELEN DANK!
Ignacio Soler Garcia
2
Wenn Sie das Attribut [DeploymentItem] im Code verwenden, müssen Sie die Dateien nicht im Dialogfeld angeben - siehe den folgenden Code von @ tomfanning.
Patrick Szalapski
Dies löst mein Problem beim Kopieren der Konfigurationsausgabe aus dem Bin- oder Release-Ordner nicht, da ich zur Entwurfszeit keine Informationen darüber habe, ob sich die Datei im Debug- oder Release-Ordner befindet, und für mich ist dies die Datei, in die nicht kopiert wird der Out-Ordner in den Testergebnissen
Gurpreet
61

Sie können das Bereitstellungsattribut wie im folgenden Beispiel angeben. Außerdem müssen Sie die Eigenschaften "Inhalt" und "Wenn neuer kopieren" festlegen (es gibt keine Dokumentation zu den späteren Einstellungen, aber Sie haben diese festgelegt, damit dies funktioniert.

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



}
Sanjay10
quelle
3
Sie müssen dies noch aktivieren. Wie Mercel in seinem Kommentar schrieb, lautet dies in VS2010: Testeinstellungen testen / bearbeiten / lokal. Wählen Sie dann in der Liste "Bereitstellung" aus und aktivieren Sie das Kontrollkästchen "Aktivieren ...".
Patrick Szalapski
Ich habe mit diesem Problem in Visual Studio 2012 Express zu kämpfen und da es sich um eine limitierte Edition handelt, war es schwierig, eine klare Dokumentation zu finden. Ein großes Dankeschön für diese Antwort.
DavidHyogo
2
Funktioniert super. Ich denke tatsächlich, dass dies die bessere Methode und Antwort ist, da sie die erforderlichen Dateien direkt über der Testmethode dokumentiert.
bu5hm4nn
1
Ich fand , dass das DeploymentItem Attribut funktioniert auch , wenn bei der Prüfung angegebene Klassenstufe (anstelle der Verfahren Ebene).
Jon Schneider
10

Ich musste "Bereitstellung aktivieren" unter aktivieren, Test -> Edit Test Settings -> Local -> Deploymentdamit das [DeploymentItem]Attribut funktioniert.

Tomfanning
quelle
Das ist wahr ... Ich habe es gerade aktiviert und jetzt funktioniert das Attribut. Vielen Dank!
Miguel Angelo
Wie in meinem Kommentar zu einer anderen Antwort erwähnt, habe ich mit dem gleichen Problem in Visual Studio 2012 Express zu kämpfen, und die beiden Antworten zusammen gaben mir schließlich die Lösung.
DavidHyogo
5

Alle drei Antworten sind je nach Ihren Anforderungen richtig.

Durch Hinzufügen von Dateien zur Bereitstellung in der .testrunconfig (.testsettings in VS2010) werden alle diese Dateien in jeden Testausgabeordner kopiert, auch für nicht verwandte Tests, die isoliert ausgeführt werden. Wenn Sie einen Test ausführen, werden alle im Bereitstellungsabschnitt von .testssettings aufgeführten Testdatendateien in den Testausgabeordner kopiert.

In meinen Tests muss ich eine erwartete XML-Datei in den Testausgabeordner kopieren, um sie mit der tatsächlichen Testausgabe-XML zu vergleichen. Ich verwende das DeploymentItem-Attribut, um nur die XML-Datei zu kopieren, die sich auf die ausgeführten Tests bezieht. In VS2010 musste ich die Bereitstellung in der .testsettings-Datei aktivieren (aber keine Pfade hinzufügen) und dann auf den XML-Dateipfad relativ zum TestProject im DeploymentItem verweisen.

Hoffe das hilft.

GraehamF
quelle
2
Mein Problem war der hier erwähnte relative Pfad. Ich dachte, die XML-Datei sollte sich in dem Verzeichnis befinden, in dem sich der Test befand, aber sie musste sich im Projektstamm befinden oder dem Verzeichnis vorangestellt sein, in dem sie sich befand.
Wes Grant
2

Ich hatte ein ähnliches Problem, aber mein Problem hatte damit zu tun, dass auf die Datei TraceAndTestImpact.testsettings anstelle der Datei Local.testsettings verwiesen wurde. Sie können im Menü Test / Aktive Testeinstellungen auswählen von einem zum anderen wechseln.

Simon
quelle
2

Ich möchte die akzeptierte Antwort nur verbessern, indem ich eine Möglichkeit erwähne, sie speziell für DLLs bereitzustellen, anstatt die normale Methode, sie für Daten oder Konfigurationen usw. zu verwenden, für die Umstände, in denen CopyLocal nicht funktioniert:

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

Das Folgende funktioniert in VS2012 für Testprojekte, die in mehreren Lösungen enthalten sind, ohne eine Testeinstellungsdatei zu verwenden:

1) Ordnen Sie die Dateien und Ordner, die Sie bereitstellen möchten, in einem Ordner im Testprojektverzeichnis an.

2) Erstellen Sie in den Projekteigenschaften einen Post-Build-Schritt

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

$(ProjectDir)und $(TargetDir)sind Makros, die von VS interpretiert werden und als solche enthalten sein sollten.

<Project_Folder_Name> ist der Name des in Schritt 1 erstellten Ordners.

<Deployment_Folder_Name>ist der Name des Ordners, in dem die Testdateien bereitgestellt werden, und sollte so benannt werden, dass er eindeutig ist, wenn mehrere Testprojekte in demselben Verzeichnis bereitgestellt werden, z <Project_Name>_TestInputs.

Testdateien an freigegebenen Speicherorten sollten auch in den Zielverzeichnis-Bereitstellungsordner kopiert werden, um die Testinteraktionen einzuschränken. Geben Sie den Quellpfad relativ zum $(ProjectDir)Makro an. Zum Beispiel "$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml".

3) Fügen Sie [DeploymentItem(source, destination)]entweder jeder Testmethode, die eine Bereitstellungsdatei verwendet (Best Practice) oder der Testklasse (einfachere Übung für Faule oder Eilige), eine Eigenschaft hinzu und aktualisieren Sie ein Projekt am einfachsten über die zuvor verwendeten relativen Pfade oder eine Testeinstellungsdatei ).

Bei einer Testmethode sourceist dies der Pfad zu der Datei oder dem Verzeichnis, die bzw. das in der Testmethode verwendet wird, relativ zum Zielverzeichnis, wie von erstellt, xcopyund destinationder Pfad zu dem Verzeichnis, in dem es relativ zum Bereitstellungsverzeichnis erstellt wird. Damit die Tests entweder im Zielverzeichnis oder in einem Bereitstellungsverzeichnis konsistent ausgeführt werden. Der Zielpfad sollte mit dem Quellpfad ohne Dateiverweis identisch sein. Beispiel : [DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")]. Das DeploymentItemsollte in jeder Methode enthalten sein, die diese Datei oder dieses Verzeichnis verwendet.

In einer Klasse sourceund destinationsind beide der Name des Ordners, der im Zielverzeichnis von erstellt wurde xcopy; Dadurch wird der gesamte Ordner in das Bereitstellungsverzeichnis kopiert, wenn ein Test in der Klasse ausgeführt wird. Beispiel:[DeploymentItem("Example_TestInputs","Example_TestInputs")]

4) In den Testmethoden können Sie jetzt sicher auf Dateien und Verzeichnisse zugreifen, die sich im Arbeitsverzeichnis befinden, unabhängig davon, wo Visual Studio sie an diesem Tag abgelegt hat, z File.Exists(".\Example_TestInputs\C1219TDL-2008.xml").

Richard Morris
quelle
0

Probieren Sie die Post-Build-Ereignisbefehlszeile in Visual Studio aus (wenn Sie diese IDE verwenden).

Kasper
quelle
3
Ich bin es, aber das scheint ein bisschen wie ein Hack. Dies muss ein ziemlich häufiges Szenario sein, und ich hoffe, dass es nur eine Option oder Eigenschaft gibt, die ich nicht richtig einstelle.
Eric Schoonover
0

In Visual Studio 2012 benötigen Sie für den einfachen Fall kein DeploymentItem-Attribut. Siehe meine Antwort hier

Acarlon
quelle
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";
}
Nina
quelle
0

Die akzeptierte Antwort ist korrekt, ebenso wie die meisten anderen Antworten. Im Laufe der Jahre habe ich jedoch festgestellt, dass das Deploment-System von Visual Studio Unit Tests mit DeploymentAttribtue und Copy to Output umständlich ist, wenn Sie über eine große Anzahl von Datendateien verfügen. Ich habe festgestellt, dass es besser funktioniert, die Dateien an ihrem ursprünglichen Speicherort zu belassen.

Alle Details in meiner anderen Antwort hier. https://stackoverflow.com/a/53004985/2989655

Hoffe das hilft.

Sau001
quelle