MSTest skopiuj plik do folderu testowego

108

Mam test, który wymaga wczytania pliku XML, a następnie jego przeanalizowania. Jak mogę za każdym razem skopiować ten plik do folderu uruchamiania testowego?

Plik XML jest ustawiony na „Kopiuj, jeśli nowszy” i tryb kompilacji na „brak” (ponieważ tak naprawdę nie jest to możliwe do kompilacji)

Aaron Powell
źródło

Odpowiedzi:

131

użyj DeploymentItematrybutu

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
źródło
17
Atrybut DeploymentItem można również określić na poziomie klasy, aby wpłynąć na każdy test w klasie.
Hannes Nel
24
Nie zapominaj, że jeśli masz swoje elementy w podfolderze, aby uwzględnić je również w podkatalogu wdrażania [DeploymentItem ("SubFolder \ testFile1.xml", "SubFolder")]
omgtitb
31
W nawiązaniu do komentarza Thomasa, domyślną wartością RelativePathRoot jest folder rozwiązania, więc jeśli Twoje rozwiązanie wygląda tak (.. \ SolutionFolder \ TestProject \ TestData \ aFile.txt) Twój element DeploymentItem wyglądałby tak ... ([DeploymentItem (@ "TestProject \ TestData \ aFile.txt", "TestData")]) .. i możesz odwołać się do pliku w teście, używając tego .. (string file = @ "TestData \ aFile.txt";)
Michael Dausmann
6
Dokumentacja DeploymentItemAttribute dla VS2010 : ten atrybut można określić w metodzie testowej lub w klasie testowej.
Alex Che
12
Większość postów, które widziałem, nie wspomina o tym, że jeśli nie możesz tego uruchomić, prawdopodobnie musisz zaznaczyć pole wyboru „Włącz wdrożenie”, które możesz znaleźć, przechodząc do Test -> Edytuj ustawienia testu -> local (local.testsettings) -> karta Wdrożenie. Właśnie to zrobiłem, a następnie DeploymentItem działało dobrze.
Dave
26

Wygląda na to, że jeśli dostarczysz plik TestSettings dla rozwiązania, możesz odznaczyć opcję „Włącz wdrożenie” i zatrzymać próbę uruchomienia programu mstest z ...TestResults\...\outfolderu, w którym nie kopiuje dodatkowych plików (chyba że ustawisz je jako opcję wdrażania) .

Jest to również przydatne, jeśli polegasz na tym, że dodatkowe pliki znajdują się w zachowanej strukturze folderów, ponieważ wszystkie elementy wdrożenia wydają się być kopiowane bezpośrednio (płasko) do folderu tymczasowego uruchamiania (na zewnątrz), jeśli używasz opcji Wdrożenie, dodaj folder w ustawieniach testowych ( powyższe odpowiedzi sugerują, że możesz zachować strukturę, jeśli dodasz każdy element jako własny element DeploymentItem).

Dla mnie działało dobrze, uruchamiając testy bezpośrednio w Visual Studio (tj. Moje dodatkowe pliki w ich strukturze zostały znalezione i wykorzystane przez testy), ponieważ utworzyłem plik TestSettings z innego powodu dawno temu (który ma odznaczone Włącz wdrożenie), ale nie wtedy, gdy TeamCity uruchomiłem mstest, aby uruchomić testy, ponieważ nie określiłem, że powinien być używany plik TestSettings.

Aby utworzyć plik TestSettings w programie Visual Studio, kliknij prawym przyciskiem myszy rozwiązanie i wybierz opcję Nowy element, a następnie wybierz szablon TestSettings. Aby użyć pliku TestSettings w wierszu polecenia mstest.exe, dodaj opcję /testsettings:C:\Src\mySolution\myProject\local.testsettings (lub dodaj jako dodatkową opcję wiersza poleceń w TeamCity z odpowiednią ścieżką)

TamW
źródło
3

Najlepszym rozwiązaniem dla mnie jest użycie ustawień testowych, zwłaszcza jeśli wiele testów wymaga tych samych plików danych.

Najpierw utwórz plik testsettings i dodaj potrzebne elementy wdrożenia (nazwa pliku lub folderu):

<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>
<...../>
  • Uruchomiony w programie Visual Studio, użyj opcji „wybierz plik ustawień testu” z menu „Test \ Ustawienia testu”, aby wybrać nowe ustawienia testu

  • Uruchamiając mstest, użyj parametru / testsettings, aby mstest użył ustawień testsettings.

FrankyHollywood
źródło
2

Możesz zdefiniować DeploymentItem w klasie, która zawiera metodę z atrybutem AssemblyInitialize. Wtedy masz pewność, że pliki są kopiowane niezależnie od tego, który test uruchomisz.

Niestety atrybut DeploymentItem jest wykonywany tylko na klasach, które zawierają uruchomione testy. Więc jeśli masz 10 klas testowych, które używają tego samego zestawu plików, musisz dodać atrybut do wszystkich z nich.

Dowiedział się również, że zmiany w plikach * .testsettings nie są automatycznie odświeżane w programie Visual Studio. Dlatego po dodaniu plików / folderów do wdrożenia w testsettings, musisz ponownie otworzyć plik rozwiązania, a następnie uruchomić testy.

Sielu
źródło
2

W programie Visual Studio 2012 vstest.console.exe (wbudowany moduł uruchamiający testy) działa z katalogiem wyjściowym jako bieżącą ścieżką. Oznacza to, że wystarczy uwzględnić elementy w rozwiązaniu z właściwością „Zawsze kopiuj” lub „Kopiuj, jeśli nowszy”, aby mogły zostać użyte w teście. Nie potrzebujesz atrybutu DeploymentItem w przypadku ogólnym. To samo dotyczy uruchamiania programu vstest.console.exe z wiersza poleceń w katalogu output / test.

W niektórych przypadkach używany jest oddzielny folder, a jednym z nich jest użycie atrybutu DeploymentItem. Więcej informacji znajdziesz tutaj .

akarlon
źródło