wake-up-neo.com

Probleme mit dem Attribut "DeploymentItem"

Ich unterhalte derzeit ein "altes" System, das in C # .net geschrieben ist, einige veraltete Funktionen entfernt und einige Änderungen vorgenommen hat. Gott sei Dank, der vorherige hat einige Unit Tests (MSTests) geschrieben. Ich bin mit JUnit-Tests ziemlich vertraut, habe aber mit MSTests noch nicht viel gemacht.

Die Testmethoden haben ein DeploymentItem-Attribut, das eine Textdatei angibt, die von der getesteten Geschäftslogikmethode analysiert wird, und ein zweites DeploymentItem, in dem nur ein Pfad angegeben wurde, der eine Reihe von TIF-Dateien enthält, die ebenfalls bereitgestellt werden müssen.

[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
   ...
}

Die Tests funktionierten zuvor, aber jetzt musste ich die Namen der TIF-Dateien ändern, die im Verzeichnis\files\tif enthalten sind. Nach einer Regel müssen die TIF-Dateinamen einem bestimmten Muster entsprechen, das auch von der ExistsTifTest()-Methode geprüft wird .. Nun musste ich die Dateinamen ändern, um sie an die neuen Anforderungen anzupassen, und plötzlich gibt es keine TIF-Dateien mehr wie zuvor eingesetzt werden.

Kann mir jemand einen Hinweis geben, warum dies passiert oder was kann die Ursache sein? Das gleiche passiert auch, wenn ich eine neue Textdatei mit der Bezeichnung "my2ndTest.txt" neben "valid_entries.txt" im Verzeichnis\files\valid\mit dem entsprechenden DeploymentItem-Attribut für die Testmethode hinzufüge. Die Datei wird nicht bereitgestellt?

Ich habe die Images jetzt bereitgestellt, indem ich den Implementierungspfad direkt in testrunconfig definiert habe, aber ich würde gerne verstehen, warum diese Dinge passieren oder warum meine neue Datei "my2ndTest.txt" beispielsweise nicht bereitgestellt wird, während die anderen dies tun.

90
Juri

DeploymentItem ist ein bisschen chaotisch. 

Jede Datei in Ihrer Projektmappe hat in VS.NET die Einstellung "In Ausgangsordner kopieren". Sie müssen "Immer kopieren" (oder ähnliches) verwenden, um die Dateien in den Ausgabeordner zu verschieben.

Stellen Sie sicher, dass Sie dieses Set für die neuen Dateien haben. Wenn Sie dieses Set nicht haben, werden die Dateien nicht in den Ausgabeordner kopiert und können dann nicht vom Ausgabeordner in den Ordner bereitgestellt werden, in dem MSTest das Zeug ausführt.

Wenn ich Dateien habe, die ich für meine Unit-Tests benötige, habe ich festgestellt, dass das Einbetten dieser Dateien als Ressourcen in eine Assembly und das "Auspacken" dieser Assembly während der Tests eine vorhersehbare Vorgehensweise darstellt. YMMV.

note: Diese Kommentare basieren auf meinen Erfahrungen mit VS2010. Kommentare zu meiner Antwort deuten darauf hin, dass dies mit VS2012 kein Problem ist. Ich stehe immer noch zu den Kommentaren, dass die Verwendung eingebetteter Ressourcen weniger "Magie" beinhaltet und für mich die Phase des "Anordnens" meiner Unit-Tests viel expliziter macht.

101
Martin Peck

In VS2010 war für Local.testsettings das Kontrollkästchen "Enable Deployment" (Enable Deployment) deaktiviert, und das DeploymentItem-Attribut funktionierte nicht. Ich habe es überprüft und alles hat gut funktioniert .. Ich hoffe das hilft!

74
Ivan Muzzolini

Ich habe auch ähnliche Probleme gehabt, aber ich habe eine einfache 3-Schritte-Lösung dafür gefunden: 

Angenommen, Ihre Ordnerstruktur sieht folgendermaßen aus: SolutionFolder\ TestProjectFolder\ SubFolder\

  1. Gehen Sie zu "Solutions Items/Local.testsettings"> "Bereitstellung"> Aktivieren Sie "Bereitstellung aktivieren".
  2. Wenn Sie VS2010 verwenden, stellen Sie sicher, dass für die Dateien, die Sie bereitstellen möchten, die Eigenschaft "In Ausgabeordner kopieren" auf "Immer kopieren" oder "Bei Neuem kopieren" eingestellt ist.
  3. Attributieren Sie Ihre Testmethode mit einem der folgenden Werte:
    • [DeploymentItem(@"TestProjectFolder\SubFolder")], um den gesamten Inhalt von <SubFolder> im Testlaufverzeichnis bereitzustellen 
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")], um den gesamten Inhalt von <SubFolder> für <TargetFolder> im Testlaufverzeichnis bereitzustellen

Eine letzte Anmerkung zu MSTest (zumindest für VS2010): 

Wenn Sie möchten, dass <TargetFolder> denselben Namen wie <SubFolder> hat, schlägt die Verwendung von [DeploymentItem(@"SubFolder", @"SubFolder")] automatisch fehl, wenn der MSTest-Läufer einen dummen Edge-Fall trifft. Deshalb sollten Sie dem <SubFolder> den <TestProjectFolder> so voranstellen: [DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]

17
Murari Kumar

Um hoffentlich jemand anderem zu helfen: Ich habe alle Vorschläge ausprobiert und still mein Bereitstellungsobjekt wurde nicht kopiert.

Was ich tun musste ( wie hier vorgeschlagen ) war, dem DeploymentItem-Attribut einen zweiten Parameter hinzuzufügen:

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]
14
Peter K.

Wenn Sie Ihre .testrunconfig-Datei aufrufen und bei der Bereitstellung die Option "Bereitstellung aktivieren" deaktivieren, werden die Tests an ihrem normalen Speicherort ausgeführt, und alles funktioniert wie beim Ausführen der App außerhalb eines Komponententests.

10
Josh Close

Dies bezieht sich wahrscheinlich nicht auf Ihr genaues Problem, aber hier ein paar Tipps, die ich mit dem Attribut [DeploymentItem] gefunden habe.

  1. In Ausgabeverzeichnis kopieren sollte auf Immer kopieren eingestellt sein.

Es funktioniert NICHT, wenn es mit dem Attribut [TestInitialize] verwendet wird

[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{

Es sollte auf Ihrem [TestMethod] sein, z.

    [TestInitialize]
    public void Setup()
    {
        string spreadsheet = Path.GetFullPath("test.xlsx");
        Assert.IsTrue(File.Exists(spreadsheet));
        ...
    }

    [TestMethod]
    [DeploymentItem("test.xlsx")]
    public void ExcelQuestionParser_Reads_XmlElements()
    {
        ...
    }
8
Matt Frear

Nachdem ich alle anderen hier aufgeführten Vorschläge ausprobiert hatte, konnte ich immer noch nicht herausfinden, was los war. Schließlich stellte ich fest, dass im Menü Test/Test Settings keine Einstellungsdatei ausgewählt wurde, was bedeutet, dass die Bereitstellung nicht aktiviert war. Ich klickte auf die Menüoption Test/Test Settings/Test Settings File, wählte die Datei Local.TestSettings aus und alles funktionierte.

5
Mike

Ich bin mir nicht sicher, ob dies die Frage genau beantwortet, aber es kann einigen helfen. Erstens habe ich festgestellt, dass das Kontrollkästchen "Bereitstellung aktivieren" aktiviert werden muss, damit die Bereitstellung funktioniert. Zweitens sagt das Dokument, dass der Quellpfad "relativ zum Projektpfad" ist, was ich zunächst als " Projektordner. Tatsächlich scheint es sich auf den Build-Ausgabeordner zu beziehen ..__ Wenn ich also einen Projektordner mit dem Namen 'TestFiles' und eine Datei mit dem Namen Testdata.xml habe, funktioniert das Attribut auf diese Weise nicht:

[DeploymentItem(@"TestFiles\Testdata.xml")] 

Ich kann die Testdata.xml-Datei Copy Always markieren, sodass der Build eine Kopie unter dem Ausgabeordner (z. B. Debug\TestFiles\TestData.xml) ablegt. Der Implementierungsmechanismus findet dann die Kopie der Datei, die sich in diesem Pfad (TestFiles\Testdata.xml) befindet, relativ zur Build-Ausgabe . Oder ich kann das Attribut folgendermaßen einstellen:

[DeploymentItem(@"..\\..\TestFiles\Testdata.xml")] 

und der Implementierungsmechanismus wird die Originaldatei finden. __ So funktioniert entweder beide, aber ich habe festgestellt, dass ich mit dem Copy Always gelegentlich das gleiche Problem habe, das ich beim Bearbeiten der Datei app.config in einem Projekt habe - wenn nicht Code ändern oder einen Neuaufbau erzwingen, führt nichts zum Kopieren von Dateien, die zum Erstellen beim Erstellen markiert sind. 

4
user1546704

Das Deployment-Flag wurde zuerst deaktiviert. Aber selbst nachdem ich es aktiviert hatte, wurden aus unbekannten Gründen nichts, auch nicht Ziel-DLLs, kopiert. Versehentlich öffnete ich das Testlauffenster und tötete alle vorherigen Läufe. Magisch fand ich alle DLLs und Dateien, die ich im nächsten Testlauf im Testordner benötigte. Sehr verwirrend.

3
Schultz9999

Ich hatte große Probleme mit dem Bereitstellen von Dateien, die bereitgestellt werden sollten, und versuchte alle oben genannten Vorschläge.

Dann habe ich VS2010 geschlossen; startete es neu, lud die Lösung und alles funktionierte. (!)

Ich habe ein bisschen nachgesehen; Nachdem Sie das Flag 'Bereitstellung aktivieren' auf local.TestSetting gesetzt haben, sollten Sie den Test nicht einfach über das Fenster Testergebnisse erneut ausführen. Sie müssen den vorherigen Testlauf von der Benutzeroberfläche entfernen, z. Führen Sie einen anderen Test aus oder öffnen Sie Ihre Lösung erneut.

2

Ich habe daran in VS2013 gearbeitet. Meine Erkenntnisse, um dies zum Laufen zu bringen: 

  • In Ausgabeverzeichnis kopieren sollte auf Immer kopieren: MANDATORY gesetzt sein. 
  • "Bereitstellung aktivieren" in .TestSettings: NICHT ERFORDERLICH. Ich habe das Ohne eine .TestSettings-Datei erhalten. 
  • Einen Ordner als zweiten Parameter angeben: OPTIONAL. Formt das Ausgabeordnerlayout, funktioniert ohne. 
  • Leerzeichen im Dateinamen: Das hat mir Kopfschmerzen bereitet - die Datei wurde nie kopiert. Das Entfernen der Leerzeichen hat dieses Problem behoben. Habe noch nicht Fluchtcharaktere untersucht. 

Ein Tipp, den ich auch auf die harte Tour gelernt habe: Vergessen Sie nicht, dieses Attribut jedem einzelnen Test hinzuzufügen. Die Datei wurde beim ersten zugeordneten Test im Testlauf kopiert, blieb jedoch verloren, als die Reihenfolge der Tests geändert wurde und nicht zugeordnete Tests versuchten, die Datei zuerst zu finden. 

1
Volkirith

Da ich das DeploymentItem-Attribut immer als verwirrend empfunden habe, mache ich die Bereitstellung solcher Dateien mit dem Post-Build-Skript Projekt-Post-Build-Skript zum Kopieren der Dateien aus dem Build-Zielordner (Bin\Debug) an den Speicherort, an dem der Test sie erwartet.

1
Ismail Hawayel

Wir haben viel Zeit damit verbracht, Probleme mit der Bereitstellung von Elementen zu lösen, um dieses Problem in lokaler Reihenfolge zu lösen und Teamcity-Tests zu wiederholen. Es ist nicht einfach.

Sehr gutes Werkzeug zum Debuggen dieses Problems ist ProcessExplorer . Mit dem Prozess-Explorer können Sie überprüfen, wo Visual Studio nach den Implementierungselementen sucht, und die Korrektur für das Projekt vornehmen. Filtern Sie einfach alle Dateivorgänge, deren Pfad den Dateinamen der Implementierungseinheit enthält, und Sie werden ihn sehen.

1
Tomas Kubes

Für diejenigen, die lieber das Chaos von DeploymentItem vermeiden und die von @Martin Peck (akzeptierte Antwort) vorgeschlagene Vorgehensweise wählen, können Sie den folgenden Code verwenden, um auf den Inhalt der eingebetteten Ressource zuzugreifen:

public string GetEmbeddedResource(string fullyQulifiedResourceName)
{
    var Assembly = Assembly.GetExecutingAssembly();
    // NOTE resourceName is of the format "Namespace.Class.File.extension";

    using (Stream stream = Assembly.GetManifestResourceStream(fullyQulifiedResourceName))
    using (StreamReader reader = new StreamReader(stream))
    {
        string result = reader.ReadToEnd();
    }
}

Für Einzelheiten siehe this SO Thread

1

Neben dem Deployment-Attribut, das überprüft werden muss, habe ich etwas anderes über das DeploymentItem-Attribut entdeckt.

[TestMethod()]
[DeploymentItem("folder\subfolder\deploymentFile.txt")]
public void TestMethod1()
{
   ...
}

Ihre deployFile.txt muss relativ zur Lösungsdatei und nicht zur testfile.cs sein.

 enter image description here

1
Pavenhimself

Für mich war die Hauptursache etwas anderes: Der Produktionscode, den meine Tests ausübten, war das Umbenennen und/oder Löschen der bereitgestellten XML-Testdatei. 

Wenn ich also meine Tests einzeln ausführen würde, würden sie bestanden. Wenn sie jedoch alle zusammen ausgeführt werden, schlägt der 2. und nachfolgende Test mit Fehlern fehl, die die Datei nicht gefunden haben (was ich ursprünglich als DeploymentItem-Attribut falsch erkannt hatte). .

Meine Lösung bestand darin, dass jede einzelne Testmethode eine Kopie der bereitgestellten Datei erstellt (mithilfe von dieser Technik ), und dass dann der getestete Produktionscode die kopierte Datei anstelle der Originaldatei verwendet.

1
Jon Schneider

Versuchen Sie dies für VS2010. Sie müssen also nicht für jedes TIF DeployItems hinzufügen
Entferne das 

[DeploymentItem(@"files\valid\valid_entries.txt")]  
[DeploymentItem(@"files\tif\")]  

Fügen Sie eine Testkonfiguration hinzu.
- Klicken Sie im Lösungs-Explorer mit der rechten Maustaste auf den Lösungsknoten
- Hinzufügen -> Neues Element ...
- Wählen Sie links den Knoten Testeinstellungen aus, und wählen Sie den Punkt rechts aus
- Klicken Sie auf Hinzufügen 

Nennen Sie es zB TDD

Wählen Sie TDD unter TestMenu> Edit Testsettings.

Klicken Sie auf die Bereitstellung. Aktivieren Sie es und fügen Sie dann die gewünschten Dateien und Verzeichnisse hinzu. Es wird ein Pfad relativ zur Lösung angezeigt. Die Dateien werden angelegt. Die Originaldatei ist zum Beispiel hier: 

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate\Authority.xml  

Wenn ich meinen Gerätetest durchführe, wird er in kopiert 

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate.Tests\bin\Debug\TestResults\Patrik_HERKULES 2011-12-17 18_03_27\Authority.xml  

in testcode rufe ich es von:

[TestMethod()]
public void Read_AuthorityFiles_And_ParseXML_To_Make_Dictonary()  
{  
  string authorityFile = "Authority.xml";  
  var Xmldoc = XDocument.Load(authorityFile);  

Es ist nicht notwendig, Immer kopieren zu wählen. Legen Sie die Dateien in das Testprojekt. fügen Sie fest codierte Pfade in den Testcode ein. Für mich hat diese Lösung am besten funktioniert. Ich habe es mit DeploymentItem versucht, immer zu kopieren, aber es gefiel mir nicht.

1

Ich habe auch ähnliche Probleme gehabt. Ich habe alle oben genannten Schritte, aber immer noch kein Glück. Ich verwende VS2010. Dann habe ich festgestellt, dass $ Menu> Test> Aktive Testeinstellung auswählen> Auswirkung auf Trace und Test ausgewählt wurde. Es begann zu arbeiten, nachdem ich Trace geändert und die Auswirkungen auf Local getestet habe. Diese Seite enthält sehr hilfreiche Informationen zum Kopieren von Dateien in einen Ordner mit Testergebnissen. Ich denke auch, dass ich diese Erfahrung hinzufügen möchte.

0
MJK

Verwenden Sie nicht DeploymentItem.

Es ist sehr schwierig, das Setup richtig einzurichten, und es funktionierte weder mit meinem ReSharper-Testläufer noch mit dem nativen für MSTEST in Visual Studio 2017.

Klicken Sie stattdessen mit der rechten Maustaste auf Ihre Datendatei und wählen Sie properties aus. Wählen Sie Zum Ausgabeverzeichnis kopieren: Immer .

Tun Sie dies jetzt in Ihrem Test. Das Verzeichnis ist einfach das Verzeichnis der Datei relativ zum Testprojekt. Einfach.

    [TestMethod()]
    public void ParseProductsTest()
    {
        // Arrange
        var file = @"Features\Products\Files\Workbook_2017.xlsx";
        var fileStream = File.Open(file, FileMode.Open);
        // etc.
    }

Vorbehalt. Ich habe keine Ahnung, ob dies mit automatisierten Build- und Testsystemen gut funktioniert. Ich bin noch nicht da.

0
Jess

Mein großes "Gotcha" war die Art, wie DeploymentItem Verzeichnisse behandelt. Ich verwendete die Zwei-Parameter-Version mit beiden als Verzeichnispfad mit den Unterverzeichnissen, die ich bereitstellen wollte. Ich wusste anfangs nicht, dass es nur das Zeug in den Ordner ROOT kopiert und nicht die gesamte rekursive Ordnerstruktur!

Ich hatte im Wesentlichen [DeploymentItem (@ "Foo \", @ "Foo \")] und erwartete, dass es meine Foo\Bar bereitstellt. Ich musste es speziell in [DeploymentItem (@ "Foo\Bar \", @ "Foo\Bar \")] ändern und jetzt funktioniert es wie ein Zauber.

0
StalePhish