MSTest-Kopierdatei zum Testen des Laufordners

108

Ich habe einen Test, bei dem eine XML-Datei eingelesen und dann analysiert werden muss. Wie kann ich diese Datei jedes Mal in den Testlaufordner kopieren lassen?

Die XML-Datei ist auf "Kopieren, wenn neuer" und den Kompilierungsmodus "Keine" eingestellt (da dies nicht wirklich kompilierbar ist).

Aaron Powell
quelle

Antworten:

131

Verwenden Sie ein DeploymentItemAttribut

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");
        }
    }
}
Preet Sangha
quelle
17
Das DeploymentItem-Attribut kann auch auf Klassenebene angegeben werden, um jeden Test in der Klasse zu beeinflussen.
Hannes Nel
24
Vergessen Sie nicht, dass, wenn Sie Ihre Elemente in einem Unterordner haben, diese auch in das Unterverzeichnis der Bereitstellung aufgenommen werden sollen [DeploymentItem ("SubFolder \ testFile1.xml", "SubFolder")]
omgtitb
31
Neben dem Kommentar von Thomas lautet der Standardwert für RelativePathRoot der Lösungsordner. Wenn Ihre Lösung also so aussieht (.. \ SolutionFolder \ TestProject \ TestData \ aFile.txt), sieht Ihr DeploymentItem folgendermaßen aus .. ([DeploymentItem (@ "TestProject \ TestData \ aFile.txt", "TestData")]) .. und Sie würden die Datei im Test mit diesem referenzieren .. (string file = @ "TestData \ aFile.txt";)
Michael Dausmann
6
Dokumentation zu DeploymentItemAttribute für VS2010 : Dieses Attribut kann für eine Testmethode oder eine
Alex Che
12
Was die meisten Beiträge, die ich gesehen habe, nicht erwähnen, ist, dass Sie, wenn Sie dies nicht zum Laufen bringen können, wahrscheinlich das Kontrollkästchen "Bereitstellung aktivieren" aktivieren müssen, das Sie finden, wenn Sie zu Test -> Testeinstellungen bearbeiten -> gehen local (local.testsettings) -> Registerkarte Bereitstellung. Ich habe das gerade gemacht und dann hat DeploymentItem gut funktioniert.
Dave
26

Wenn Sie eine TestSettings-Datei für die Lösung bereitstellen, können Sie anscheinend die Option "Bereitstellung aktivieren" deaktivieren und verhindern, dass mstest versucht, in dem ...TestResults\...\outOrdner ausgeführt zu werden, in dem Ihre zusätzlichen Dateien nicht kopiert werden (es sei denn, Sie machen sie zu einer Bereitstellungsoption). .

Dies ist auch nützlich, wenn Sie davon abhängen, dass sich die zusätzlichen Dateien in einer beibehaltenen Ordnerstruktur befinden, da Bereitstellungselemente scheinbar alle direkt (flach) in den temporären Ausführungsordner (out) kopiert werden, wenn Sie die Option Bereitstellung, Ordner hinzufügen in den Testeinstellungen verwenden ( Die obigen Antworten legen nahe, dass Sie die Struktur beibehalten können, wenn Sie jedes Element als eigenes DeploymentItem hinzufügen.

Bei mir funktionierte es einwandfrei, Tests direkt in Visual Studio auszuführen (dh meine zusätzlichen Dateien in ihrer Struktur wurden gefunden und von Tests verwendet), da ich vor langer Zeit aus einem anderen Grund eine TestSettings-Datei erstellt hatte (bei der die Bereitstellung aktiviert ist), jedoch nicht bei TeamCity hat mstest ausgeführt, um Tests auszuführen, da ich nicht angegeben habe, dass die TestSettings-Datei verwendet werden soll.

Um eine TestSettings-Datei in Visual Studio zu erstellen, klicken Sie mit der rechten Maustaste auf die Lösung, wählen Sie Neues Element und wählen Sie die TestSettings-Vorlage aus. Um die TestSettings-Datei an der Eingabeaufforderung von mstest.exe zu verwenden, fügen Sie die Option hinzu /testsettings:C:\Src\mySolution\myProject\local.testsettings (oder fügen Sie sie als zusätzliche Befehlszeilenoption in TeamCity mit dem entsprechenden Pfad hinzu).

TamW
quelle
3

Die beste Lösung für mich ist die Verwendung von Testeinstellungen, insbesondere wenn mehrere Tests dieselben Datendateien benötigen.

Erstellen Sie zunächst eine Testeinstellungsdatei und fügen Sie die erforderlichen Bereitstellungselemente hinzu (Datei- oder Ordnername):

<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>
<...../>
  • Verwenden Sie in Visual Studio "Testeinstellungsdatei auswählen" im Menü "Test \ Testeinstellungen", um neue Testeinstellungen auszuwählen

  • Wenn Sie mstest ausführen, verwenden Sie den Parameter / testsettings, damit mstest Ihre Testeinstellungen verwendet.

FrankyHollywood
quelle
2

Sie können DeploymentItem in einer Klasse definieren, die eine Methode mit dem AssemblyInitialize-Attribut enthält. Dann sind Sie sicher, dass die Dateien kopiert werden, unabhängig davon, welchen Test Sie ausführen.

Leider wird das DeploymentItem-Attribut nur für Klassen ausgeführt, die Tests enthalten, die Sie ausführen. Wenn Sie also 10 Testklassen haben, die denselben Satz von Dateien verwenden, müssen Sie das Attribut allen hinzufügen.

Es wurde auch festgestellt, dass Änderungen in * .testsettings-Dateien in Visual Studio nicht automatisch aktualisiert werden. Daher müssen Sie nach dem Hinzufügen von Dateien / Ordnern zur Bereitstellung in Testeinstellungen die Lösungsdatei erneut öffnen und dann die Tests ausführen.

Sielu
quelle
2

In Visual Studio 2012 wird vstest.console.exe (der integrierte Testläufer) mit dem Ausgabeverzeichnis als aktuellem Pfad ausgeführt. Dies bedeutet, dass Sie die Elemente nur mit der Eigenschaft "Immer kopieren" oder "Wenn neuer kopieren" in Ihre Lösung aufnehmen müssen, damit sie von Ihrem Test verwendet werden können. Sie benötigen das DeploymentItem-Attribut für den allgemeinen Fall nicht. Gleiches gilt, wenn Sie vstest.console.exe über die Befehlszeile in Ihrem Ausgabe- / Testverzeichnis ausführen.

In einigen Fällen wird ein separater Ordner verwendet. Einer davon ist, wenn Sie das DeploymentItem-Attribut verwenden. Sehen Sie hier für weitere Informationen.

Acarlon
quelle