Jak mogę uzyskać „Kopiuj do katalogu wyjściowego”, aby pracować z testami jednostkowymi?

123

Podczas tworzenia projektu testu jednostkowego przed wykonaniem testów dane wyjściowe testu są kopiowane do folderu TestResults, a następnie testy są wykonywane. Problem, który mam, polega na tym, że nie wszystkie pliki w katalogu Debug / bin są kopiowane do projektu TestResults.

Jak mogę uzyskać plik, który jest kopiowany do katalogu Debug / bin, aby został również skopiowany do folderu TestResults?

Eric Schoonover
źródło

Odpowiedzi:

121

Standardowym sposobem na to jest określenie elementów wdrożenia w .testrunconfigpliku, do których można uzyskać dostęp za pośrednictwem elementu Edytuj konfiguracje uruchamiania testu w menu Test programu Visual Studio lub w folderze Elementy rozwiązania .

Mark Cidade
źródło
15
W VS2010 jest to: Test / Edycja ustawień testu / lokalny, następnie na liście wybierz „Wdrożenie”, zaznacz pole „Włącz ...” i dodaj plik (i).
Marcel
18
Być może będziesz musiał zamknąć swoje rozwiązanie (lub nawet Visual Studio) i ponownie otworzyć, zanim ta zmiana zacznie obowiązywać prawidłowo
RobV
RobV, stworzyłeś mój dzień. DZIĘKI!
Ignacio Soler Garcia
2
Jeśli używasz atrybutu [DeploymentItem] w kodzie, nie musisz określać plików w oknie dialogowym - zobacz kod @ tomfanning poniżej.
Patrick Szalapski,
Nie rozwiązuje to mojego problemu z kopiowaniem danych wyjściowych konfiguracji z bin lub folderu wydania, ponieważ w czasie projektowania nie mam informacji o tym, czy plik będzie w folderze debugowania lub wydania, a dla mnie jest to plik, który nie jest kopiowany do folder Out w wynikach testu
Gurpreet
61

Możesz określić atrybut wdrożenia, jak na przykładzie pokazanym poniżej; Musisz także ustawić właściwości „Treść” i „Kopiuj, jeśli nowszy” (nie ma dokumentacji dotyczącej późniejszych ustawień, ale ustawiłeś je, aby działały.

[TestMethod]
[DeploymentItem("mytestdata.xml")]
public void UploadTest()
{



}
Sanjay10
źródło
3
Nadal musisz to włączyć. Jak napisał Mercel w swoim komentarzu, w VS2010 jest to: Testuj / Edytuj ustawienia testu / lokalnie, następnie na liście wybierz „Wdrożenie”, zaznacz pole „Włącz ...”.
Patrick Szalapski,
Zmagam się z tym problemem w Visual Studio 2012 Express, a ponieważ jest to edycja limitowana, trudno było znaleźć jasną dokumentację. Wielkie dzięki za tę odpowiedź.
DavidHyogo,
2
Działa świetnie. Właściwie uważam, że jest to lepsza metoda i odpowiedź, ponieważ dokumentuje wymagane pliki tuż nad metodą testową.
bu5hm4nn
1
Zauważyłem, że atrybut DeploymentItem działa również, gdy jest określony na poziomie klasy testowej (zamiast na poziomie metody).
Jon Schneider
10

Musiałem włączyć opcję „Włącz wdrażanie” w sekcji, Test -> Edit Test Settings -> Local -> Deploymentaby [DeploymentItem]atrybut działał.

tomfanning
źródło
To prawda ... Właśnie to włączyłem i teraz atrybut działa. Dzięki!
Miguel Angelo
Jak wspomniałem w moim komentarzu do innej odpowiedzi, zmagam się z tym samym problemem w Visual Studio 2012 Express i dwie odpowiedzi razem dały mi rozwiązanie.
DavidHyogo,
5

Wszystkie trzy odpowiedzi są poprawne, w zależności od Twoich potrzeb.

Dodanie plików do wdrożenia w .testrunconfig (.testsettings w VS2010) spowoduje skopiowanie wszystkich tych plików do każdego testowego folderu wyjściowego, nawet w przypadku niepowiązanych testów wykonywanych w izolacji. Jeśli uruchomisz jeden test, wszystkie pliki danych testowych wymienione w sekcji wdrażania pliku .testssettings zostaną skopiowane do folderu wyjściowego testu.

W moich testach muszę skopiować oczekiwany plik XML do folderu wyjściowego testu, aby porównać go z rzeczywistym testowym plikiem XML. Używam atrybutu DeploymentItem tylko do kopiowania pliku XML związanego z uruchamianymi testami. W VS2010 musiałem włączyć wdrażanie w pliku .testsettings (ale nie dodawać żadnych ścieżek), a następnie odwołać się do ścieżki pliku XML względem TestProject w DeploymentItem.

Mam nadzieję że to pomoże.

GraehamF
źródło
2
Moim problemem była wspomniana tutaj ścieżka względna, myślałem, że plik XML powinien znajdować się w katalogu, w którym znajdował się test, ale musiał znajdować się w katalogu głównym projektu lub być poprzedzony katalogiem, w którym się znajdował.
Wes Grant
2

Miałem podobny problem, ale mój dotyczył wskazania pliku TraceAndTestImpact.testsettings zamiast pliku Local.testsettings. Możesz zmienić jeden na drugi w menu Test / Wybierz ustawienia aktywnego testu.

Szymon
źródło
2

Chciałbym po prostu ulepszyć zaakceptowaną odpowiedź, wspominając o sposobie, w jaki można ją wdrożyć specjalnie dla dll, zamiast normalnej metody używania jej do danych lub konfiguracji itp., W sytuacjach, w których CopyLocal nie działa:

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]
JamesDill
źródło
1

Poniższe działa w VS2012 dla projektów testowych zawartych w wielu rozwiązaniach bez użycia pliku ustawień testowych:

1) Ułóż pliki i foldery, które chcesz wdrożyć, w folderze w katalogu projektu testowego.

2) We właściwościach projektu utwórz krok po kompilacji

xcopy /Y /S /i "$(ProjectDir)<Project_Folder_Name>\*" "$(TargetDir)<Deployment_Folder_Name>"

$(ProjectDir)i $(TargetDir)są to makra, które będą interpretowane przez VS i jako takie powinny być uwzględnione.

<Project_Folder_Name> to nazwa folderu utworzonego w kroku 1.

<Deployment_Folder_Name>to nazwa folderu, w którym zostaną wdrożone pliki testowe, i powinna zostać nazwana tak, aby była unikalna, gdy wiele projektów testowych jest wdrażanych w tym samym katalogu, np <Project_Name>_TestInputs.

Pliki testowe w udostępnionych lokalizacjach należy również skopiować do folderu wdrażania katalogu docelowego, aby ograniczyć interakcje testowe. Podaj ścieżkę źródłową względem $(ProjectDir)makra. Na przykład "$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml".

3) Dodaj [DeploymentItem(source, destination)]właściwość do każdej metody testowej, która używa pliku wdrożenia (najlepsze rozwiązanie) lub do klasy testowej (łatwiejsza praktyka dla leniwych lub spieszących się, a najłatwiejszy sposób zaktualizowania projektu poprzednio używane ścieżki względne lub plik ustawień testowych ).

W metodzie testowej sourcejest ścieżką do pliku lub katalogu używanego w metodzie testowej względem katalogu docelowego utworzonego przez xcopyi destinationjest ścieżką do katalogu, w którym zostanie utworzony, względem katalogu wdrażania. Aby testy działały spójnie w katalogu docelowym lub w katalogu wdrożeniowym. Ścieżka docelowa powinna być taka sama jak ścieżka źródłowa bez odwołania do pliku. Przykład: [DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")]. DeploymentItemPowinny być zawarte w każdej metodzie, która wykorzystuje ten plik lub katalog.

W klasie sourcei destinationoba są nazwą folderu utworzonego w katalogu docelowym przez xcopy; spowoduje to skopiowanie całego folderu do katalogu wdrożeniowego po uruchomieniu dowolnego testu w klasie. Przykład:[DeploymentItem("Example_TestInputs","Example_TestInputs")]

4) W metodach testowych możesz teraz uzyskiwać dostęp do plików i katalogów z pewnością, że będą one w katalogu roboczym niezależnie od tego, gdzie Visual Studio zdecydowało się to umieścić tego dnia, np File.Exists(".\Example_TestInputs\C1219TDL-2008.xml").

Richard Morris
źródło
0

Wypróbuj wiersz polecenia zdarzenia po kompilacji z poziomu programu Visual Studio (jeśli używasz tego środowiska IDE).

Kasper
źródło
3
Tak, ale wygląda na to, że trochę hack. To musi być dość powszechny scenariusz i mam nadzieję, że jest tylko jakaś opcja lub właściwość, której nie ustawiam prawidłowo.
Eric Schoonover
0

W programie Visual Studio 2012 nie potrzebujesz atrybutu DeploymentItem dla prostego przypadku. Zobacz moją odpowiedź tutaj

akarlon
źródło
0
[TestMethod]
[DeploymentItem("ProjectName/Folder/SubFolder/file.xml", "Folder/Subfolder")]
public void YourTestMethod()
{
   // in the method you are testing you should have this:
   var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) + "/Folder/Subfolder/file.xml";
}
Nina
źródło
0

Przyjęta odpowiedź jest poprawna, podobnie jak większość pozostałych odpowiedzi. Jednak przez lata odkryłem, że system Deploment testów jednostkowych programu Visual Studio przy użyciu DeploymentAttribtue i Copy to Output jest uciążliwy, jeśli masz dużą liczbę plików danych. Zauważyłem, że przechowywanie plików w ich pierwotnej lokalizacji działa lepiej.

Pełne szczegóły w mojej drugiej odpowiedzi tutaj. https://stackoverflow.com/a/53004985/2989655

Mam nadzieję że to pomoże.

Sau001
źródło