2013-07-28 4 views
6

Ich habe eine Menge Nachforschungen im Internet und einige Einstellungen versucht, aber ich konnte das Verhalten der Ausführung von MsTest in Visual Studio 2012 auf der Befehlszeile nicht reproduzieren .Ausführen von MsTest über die Befehlszeile mit einem benutzerdefinierten Assembly-Basisverzeichnis

Unsere Lösung besteht aus vielen Projekten, die in demselben Ordner gruppieren, der sich auf der Lösungsebene befindet (z. B. C: \ MySolution \ bin) - dies ist der zu testende Code (CUT). Die Tests sind in einem separaten Projekt gruppiert, das sich in einer eigenen Lösung befindet und in einem eigenen Ablageordner erstellt wird (z. B. C: \ MySolution \ Tests \ bin). Es gibt wirklich viele Plugins, daher möchten wir, dass MsTest den CUT-Bin-Ordner referenziert, wenn der Test ausgeführt wird, alles in den TestResults-Ordner zu kopieren. Wir haben dies in Visual Studio 2012 erreicht, indem wir die .testrunconfig-Datei bearbeitet und ". \ Bin" als "Stammordner für die zu ladenden Assemblies" angegeben haben (in der Registerkarte "Unit Test" beim Bearbeiten der testrunconfig). So können wir die Testlösung in VS2012 laden und die Tests dort ausführen, ohne den Inhalt des Bin-Ordners in das Verzeichnis TestResults kopieren zu müssen.

Jetzt wollte ich eine .bat-Datei erstellen, die MsTest auf die gleiche Weise wie in VS2012 ausführen würde, so dass wir das Starten von Visual Studio nur zum Ausführen der Tests weglassen können. Ich arbeite jetzt an der Ausführung von MsTest in der Befehlszeile, war aber ziemlich frustriert. Das ist, was ich versucht (Befehl auf der Lösungsebene in einer Eingabeaufforderung VS-Befehl ausgeführt):

MSTest /testcontainer:Tests\bin\Tests.dll

Dies überhaupt nicht funktioniert, ist es konnte nicht einmal die referenzierten DLLs finden, die Tests.dll ausführen muss. So wiederverwendet ich die Konfiguration und lief es wieder:

MSTest /runconfig:LocalTestRun.testrunconfig /testcontainer:Tests\bin\Tests.dll

Noch hat es nicht funktioniert. Es könnte die Tests starten, aber alle sind fehlgeschlagen. Ich habe viele Warnungen der Art

Warnung: Testlauf Bereitstellungsproblem: Die Assembly oder das Modul '....' direkt oder indirekt referenziert durch den Testcontainer 'C: \ MySolution \ Tests \ bin \ test.dll 'wurde nicht gefunden.

und am Ende gesagt, es:

das 'C: \ MySolution \ Testresults \ User_Machine 2013.07.28 13_16_59 \ Out \ ist' Basisverzeichnis konfigurierte Anwendung nicht existiert. Das Testverzeichnis wird stattdessen verwendet.

Wenn ich die Option geändert applicationBaseDirectory im testrunconfig in einen absoluten Pfad (C: \ MySolution \ ist), es funktionierte. Immer noch bekomme ich viele Warnungen wie:

Warnung: Testlauf Bereitstellungsproblem: Die Assembly oder das Modul '....' direkt oder indirekt referenziert durch den Testcontainer 'C: \ MySolution \ Tests \ bin \ tests .dll 'wurde nicht gefunden.

Wie auch immer, es ist keine wirklich machbare Lösung, einen absoluten Pfad anzugeben. Wie kann ich MsTest in der Befehlszeile mit einem anderen, aber relativen Assembly-Basisverzeichnis ausführen?

Mein LocalTestRun.testrunconfig ist wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
<TestSettings name="Local Test Run" id="...." xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010"> 
    <Description>This is a default test run configuration for a local test run.</Description> 
    <Deployment> 
    <DeploymentItem filename="Tests\....\Resources\" /> 
    </Deployment> 
    <Execution hostProcessPlatform="MSIL"> 
    <TestTypeSpecific> 
     <UnitTestRunConfig testTypeId="...."> 
     <AssemblyResolution applicationBaseDirectory=".\bin"> 
      <TestDirectory useLoadContext="true" /> 
     </AssemblyResolution> 
     </UnitTestRunConfig> 
     <WebTestRunConfiguration testTypeId="...."> 
     <Browser name="Internet Explorer 7.0"> 
      <Headers> 
      <Header name="User-Agent" value="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" /> 
      <Header name="Accept" value="*/*" /> 
      <Header name="Accept-Language" value="{{$IEAcceptLanguage}}" /> 
      <Header name="Accept-Encoding" value="GZIP" /> 
      </Headers> 
     </Browser> 
     </WebTestRunConfiguration> 
    </TestTypeSpecific> 
    <AgentRule name="LocalMachineDefaultRole"> 
    </AgentRule> 
    </Execution> 
</TestSettings> 
+0

Für zukünftige Leser, überprüfen Sie meine Antwort hier: http://StackOverflow.com/Questions/5481120/Mstest-Cannot-Find-the-Assembly/36918484#36918484 – granadaCoder

Antwort

2

Nach mehr Suche haben wir die Testkonsole Läufer zu verwenden, die mit VS2012 enthalten ist:

VSTest.Console.exe Tests \ bin \ Tests.dll/Framework: framework40 /Settings:LocalTestRun.testrunconfig

Dies funktioniert mit einem relativen Pfad wie applicationBaseDirectory.

1

Dies liegt an einem MSTest-Fehler, der das aktuelle Verzeichnis in ein eigenes Arbeitsverzeichnis und nicht in den bin- (oder Bereitstellungs) -Ordner des Testprojekts setzt. Die Abhilfe ist es, den folgenden Code in dem Konstruktor Ihrer Testklasse auszuführen:

Environment.CurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); 

Ich habe die Idee von http://www.ademiller.com/blogs/tech/2008/01/gotchas-mstest-appdomain-changes-in-vs-2008/; Beachten Sie jedoch, dass in meinem Fall die Einstellung von Environment.CurrentDirectory und nicht umgekehrt erforderlich ist, wie im Artikel vorgeschlagen.

+1

Für mich in vs2013 mit .net4.5, die Folgendes funktioniert: Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory; – Kinetic