Funktionieren MSTest-Bereitstellungselemente nur, wenn sie in der Projekttesteinstellungsdatei vorhanden sind?

75

Ich kann anscheinend nicht verstehen, wie MSTest-Bereitstellungselemente konfiguriert werden sollen. Ich konnte sie durch Ändern der Testeinstellungsdatei des Projekts zum Laufen bringen, aber dies ist weniger als ideal - die Konfiguration des Bereitstellungselements ist von einzelnen Tests getrennt, und die Dateipfade scheinen als absolute Pfade gespeichert zu sein, sofern die Dateien dies nicht sind unter dem Lösungsordner.

Soll ich nicht in der Lage sein, ein Bereitstellungselement mithilfe des [DeploymentItem]Attributs auf einer [TestClass]oder [TestMethod]ohne Erstellen / Ändern einer Projekttesteinstellungsdatei hinzuzufügen ? Wie schaffe ich das?

(Ehrlich gesagt verstehe ich die Notwendigkeit einer separaten Konfiguration für Bereitstellungselemente nicht. Warum nicht einfach die vorhandenen Einstellungen für "In Ausgabeverzeichnis kopieren" für Projektdateien verwenden, die Bereitstellungselemente sein sollten?)

Arathorn
quelle

Antworten:

223

Ok - dieser Beitrag hier hat mir geholfen herauszufinden, was ich tun muss, ohne manuell Elemente zur .testsettingsDatei hinzufügen zu müssen .

Schritt 1 - Aktivieren Sie das MS Test- DeploymentItemAttribut.

Zuerst müssen wir das DeploymentItemAttribut aktivieren / aktivieren .

Goto TEST -> EDIT Testeinstellungen -> Aktuelle Aktive Einstellungen .. zB :: Local (local.testsettings)

Alt-Text

Gehen Sie nun zu DEPLOYMENT und stellen Sie sicher, dass Enable Deployment aktiviert ist. (Standardmäßig ist es ausgeschaltet).

Alt-Text

Schritt 2 - Überprüfen Sie die Eigenschaften der Datei

Jetzt müssen wir sicherstellen, dass die Datei, die Sie im Komponententest verwenden möchten, so eingerichtet ist, dass sie beim Kompilieren in das BIN-Verzeichnis kopiert wird. In einem MS Test-Komponententest können nur Dateien verwendet werden, die sich im BIN-Verzeichnis befinden. Warum? Da jedes Mal, wenn ein MS-Test ausgeführt wird, eine Kopie der Quellen erstellt werden muss, bedeutet dies, dass eine Kopie der aktuellen BIN-Verzeichnisdateien (für die aktuelle Konfiguration) erstellt wird.

Zum Beispiel ... Die aktuelle Konfiguration ist Debug (im Gegensatz zu Release). Alt-Text

Ich füge dann meine Datei hinzu ... (beachte die Ordnerstruktur im Projekt) ...

Alt-Text

und stellen Sie dann sicher, dass diese Datei IMMER in das bin-Verzeichnis kopiert wird, wenn das Projekt kompiliert wird.

Alt-Text

PRO TIPP: Immer kopieren funktioniert auch, aber kopieren Sie die Quelldatei immer über die Zieldatei. Auch wenn sie identisch sind. Deshalb bevorzuge ich Kopieren, wenn Neuere ... aber was auch immer Ihr Boot schwimmt

Ok, meine Damen und Herren - immer noch bei mir? Wikid.

Wenn wir kompilieren, sollte die Datei jetzt im Bin-Verzeichnis vorhanden sein ....

Alt-Text

Schritt 3 - Verwenden Sie jetzt das Attribut DeploymentItem

Ok, jetzt können wir endlich das DeploymentItemAttribut in unserem Code verwenden. Wenn wir dies tun, weist dies den MSTest an, die Datei (vom Speicherort relativ zum bin-Verzeichnis) in das neue MS Test-Verzeichnis zu kopieren ...

[TestMethod]
[DeploymentItem(@"Test Data\100LogEntries.txt", "Test Data")]
public void Parsing100LogFileEntriesReturnsANewParsedLogEntriesWith100Items()
{
    // Arrange.
    const string fileName = @"Test Data\100LogEntries.txt";
    ILogEntryService logEntryService = new PunkBusterLogEntryService();

    // Act.
    var parsedLogEntries = logEntryService.ParseLogFile(fileName, 0);

    // Assert.
    Assert.IsNotNull(parsedLogEntries);
    Assert.AreEqual(100, parsedLogEntries.LogEntries.Count);
    // Snipped the remaining asserts to cut back on wasting your time.
}

Also lasst uns das zusammenfassen.

[TestMethod]

Wir alle wissen was das ist.

[DeploymentItem(@"Test Data\100LogEntries.txt", "Test Data")]

Beginnen Sie im bin-Verzeichnis, gehen Sie in den Test DataOrdner und kopieren Sie die 100LogEntries.txtDatei in einen Zielordner Test Dataim Stammverzeichnis von MS Test, das MS Test erstellt, wenn jeder Test ausgeführt wird.

So sieht meine Ausgabeordnerstruktur aus. (Entschuldigen Sie das ganze Durcheinander ...)

Alt-Text

und voila! Wir haben Bereitstellungsdateien programmgesteuert.

PRO TIPP 2 - Wenn Sie kein zweites String-Argument im DeploymentItemAttribut verwenden, wird die Datei in den Stamm-OUT-Ordner des aktuellen MS-Tests kopiert.

const string fileName = @"Test Data\100LogEntries.txt";

Jetzt ist der Pfad zur Datei relativ zum OUTOrdner für den aktuellen MS-Test. Als solches habe ich explizit gesagt, dass ich die Datei in einem Verzeichnis namens ... bereitstellen soll, Test Dataalso muss ich sicherstellen, dass ich das in meinem Code richtig referenziere, wenn ich die Datei einlesen möchte.

Nur zur Bestätigung -> Der vollständige Pfad dieses Dateinamens wird C:\lots of blah blah blah\My Solution\TestResults\PureKrome_PUREKROME-PC 2011-01-05 23_41_23\Out\Test Datafür diesen aktuellen MS-Test in etwas wie ... übersetzt .

HTH.

Habe jetzt ein Bild von einem Einhorn, um so viel zu lesen :)

Alt-Text

Pure.Krome
quelle
81
Obwohl es ein Pegasus ist. ;-)
Damien Ryan
19
OH MEIN GOTT! Wie zum Teufel habe ich nicht bemerkt, dass das Horn fehlte. Das ist zu lustig! Cheers Damien :) (Ich wurde vom Regenbogen geblendet ....)
Pure.Krome
Dies war ein Lebensretter, hat mir wirklich geholfen, dies herauszufinden, da VS 2010 nicht gut lief, aber ReSharper war, wenn es um Bereitstellungsdateien ging
Urda
1
In den Dokumenten wird beispielsweise angegeben DeploymentItem, dass relative Pfade relativ zum "RelativeRootPath" in der Testkonfiguration oder in den Testeinstellungen gefunden werden. Standardmäßig ist dies der Lösungsordner. Ihre Dateien befinden sich nicht in "$ (SolutionDir) \ Test Data". Sie befinden sich in "$ (SolutionDir) \ Tests \ Test Data". Haben Sie Ihren RelativeRootPath geändert? oder sind die docs falsch? oder funktioniert deine Antwort durch eine andere Magie?
Anthony Mastrean
3
@Random - 2012 funktioniert es nicht, da Testlisten entfernt und durch TestCategory-Attribute ersetzt wurden.
Phill
15

Ich dachte, ich würde einen Weg teilen, wie ich auf Probleme mit MSTest und Bereitstellungselementen stieß. Wenn Sie Ihren Test ein zweites Mal oder öfter im Fenster "Testergebnisse" debuggen / ausführen, werden die Einstellungen aus einem vorherigen Lauf verwendet. Wenn Sie jedoch denselben Test im Fenster "Testansicht" debuggen / ausführen, werden die neuesten Einstellungen verwendet. Ich habe eine Stunde verloren, um herauszufinden, warum Änderungen an Local.testsettings nicht verwendet wurden, als ich Debug für denselben Test über das Fenster "Testergebnisse" gestartet habe.

Dies ist das Fenster Testergebnisse (starten Sie die Tests von hier aus nicht erneut, nachdem Sie Änderungen an Local.testsettings vorgenommen haben):

Das Testergebnisfenster

Und dies ist das Fenster Testansicht (starten Sie die Tests von hier aus, nachdem Sie Änderungen an Local.testsettings vorgenommen haben):

Das Testansichtsfenster

Ich hoffe, das erspart jemandem in Zukunft Kopfschmerzen.

Robert Bernstein
quelle
Danke dafür. Ich habe so viel Zeit damit verbracht, Visual Studio neu zu starten, bevor ich dies gelesen habe!
Mattythomas2000
7

In Visual Studio 2012 ist das Ausgabeverzeichnis das Arbeitsverzeichnis. Dies bedeutet, dass das DeploymentItem-Attribut für den allgemeinen Fall nicht benötigt wird (wenn Sie keine spezifischen Bereitstellungselemente pro Test oder Klasse haben). Dies bedeutet, dass Sie das DeploymentItem-Attribut nicht verwenden müssen, wenn es eine Reihe von Dateien gibt, die alle Ihre Tests verwenden sollen, oder wenn Sie nicht zu wählerisch sind, ob jede TestClass / TestMethod separate Bereitstellungsabhängigkeiten aufweist.

Sie können einfach auf Projekt | klicken Alle Dateien anzeigen und die Unterordner und Dateien in Visual Studio mit dem Attribut "Immer kopieren" oder "Wenn neuer kopieren" in Ihr Projekt aufnehmen. Die Dateien werden mit intakter Hierarchie in Ihr Ausgabeverzeichnis kopiert.

Gleiches gilt, wenn Sie vstest.console.exe über die Befehlszeile ausführen. Sehen Sie hier für die Details.

Aktualisieren

Es gibt Fälle, in denen das Standardverzeichnis nicht das Ausgabeverzeichnis ist. Insbesondere wenn Sie Run All Testsden Standardpfad auswählen , wird unter TestResults\Deploy_...Gleiches gilt, wenn Sie eine runsettingsDatei verwenden oder Tests verwendenDeploymentItems

Das Ausgabeverzeichnis ist das Standardverzeichnis, wenn Sie DeploymentItems nicht verwenden, und: -

  • Klicken Sie mit der rechten Maustaste auf die Tests in Visual Studio und wählen Sie Ausführen / Debuggen oder
  • Sie werden über die Befehlszeile mit vstest.console.exe ausgeführt.
Acarlon
quelle
Nicht wahr, in einigen Fällen legt der Agent das Arbeitsverzeichnis genauso fest wie VS2010. Wissen Sie, wie Sie dieses Verhalten steuern können?
Zufälliger
@Zufällig. Hat der Link bei der Beantwortung Ihrer Frage geholfen? Es zeigt, wie die Tests auf verschiedene Arten und in verschiedenen Ordnern ausgeführt werden. Ich bin mir Ihrer Einzelheiten nicht sicher und kann daher nicht für Ihre Umgebung antworten. In meinem automatisierten Build werden die Tests immer vom Ausgabeverzeichnis ausgeführt, sodass sie in meiner Umgebung ziemlich deterministisch erscheinen.
Acarlon
Ich bin über den Link gegangen und habe festgestellt, dass ich entweder Tests ohne ausgewählte Testeinstellungsdatei ausführen kann und Tests im Debug-Ordner ausgeführt werden, damit ich sie mit xcopy bereitstellen kann, oder dass ich Testeinstellungen verwende und jeder Lauf in einem eigenen Ordner mit einem Zeitstempel ausgeführt wird xcopy noch DeploymentItem funktionieren. Ich habe feste und relative Pfade für DeploymentItem ausprobiert und es schlägt immer noch fehl. Das Aktivieren von "Bereitstellung aktivieren" in Testeinstellungen hat keine Auswirkungen. Mein Setup ist ziemlich vanille mit einem Unterschied - ich baue auf x86 und .NET 3.5 (beide in allen Projekteinstellungen behoben)
Random
1

Wenn Sie in einzelnen Testfällen ein separates Bereitstellungselement benötigen, verwenden Sie bitte die [DeploymentItem("string file path")]Attribute in den einzelnen Testfällen.

Pritam Karmakar
quelle
2
Mein Problem ist jedoch, dass das DeploymentItem-Attribut nicht funktioniert.
Arathorn
Gleiches hier :( Ich habe es nur durch Ändern der Einstellungsdatei zum
Laufen gebracht
0

In meinem Fall füge ich das DeploymentItem-Attribut hinzu, das nicht sofort wirksam werden kann. Ich muss die Lösung schließen und erneut öffnen, damit die konfigurierten DeploymentItem-Attribute wirksam werden.

Jack Liu Shurui
quelle
Eigentlich war die Abstimmung nicht fair. Ich habe das gesamte Tutorial gelesen und verschiedene Dinge ausprobiert, aber die Lösung war: Bereinigen Sie das Projekt, erstellen Sie es neu und führen Sie dann die Tests aus. Plötzlich hat alles
geklappt
-1

In VS.NET 2012 funktioniert dies standardmäßig

einfrieren
quelle
-1

In VS 2012 müssen Sie lediglich die Datei log4net.properties (oder eine andere Konfigurationsdatei für log4net) kopieren, falls diese neuer ist. (Klicken Sie mit der rechten Maustaste auf die Datei log4net.properties, um die Eigenschaften aufzurufen und zu konfigurieren.)

Frank Zhang
quelle
1
Die Frage hat bereits eine akzeptierte Antwort und Ihre Antwort enthält keine zusätzlichen Informationen. Die Frage ist nicht einmal nach log4net.properties.
Günther