Як я можу змусити “Копіювати у вихідний каталог” роботу з тестами одиниць?


123

Коли я будую тестовий проект одиниці перед виконанням тестів, тестовий вихід копіюється в папку TestResults, а потім виконуються тести. Проблема, яка у мене виникає, полягає в тому, що не всі файли в каталозі Debug / bin копіюються в проект TestResults.

Як я можу отримати файл, скопійований у каталог Debug / bin, щоб він також був скопійований у папку TestResults?

Відповіді:


121

Стандартний спосіб зробити це шляхом вказівки елементів розгортання у .testrunconfigфайлі, доступ до яких можна отримати через пункт « Редагувати конфігурації тестового запуску» в меню « Тест Visual Studio » або в папці « Рішення» .


15
У VS2010 це: Тест / Редагувати параметри тесту / місцеві, потім у списку виберіть "Розгортання", встановіть прапорець "Увімкнути ..." та додайте файл (и).
Марсель

18
Можливо, вам доведеться закрити своє рішення (або навіть Visual Studio) і знову відкритись, перш ніж ця зміна набуде належного ефекту
RobV

РобВ, ти зробив мій день. ДЯКУЮ!
Ігнасіо Солер Гарсія

2
Якщо ви використовуєте атрибут [DeploymentItem] в коді, вам не потрібно вказувати файли в діалоговому вікні - див. Код @ tomfanning нижче.
Патрік Шалапський

Це не вирішує мою проблему з копіюванням конфігураційного виводу з бін чи папки випуску, оскільки в час проектування я не маю інформації про те, чи буде файл у папці налагодження чи випуску, і для мене це файл, який не отримує копіювання папка Out в результатах тестів
Gurpreet

61

Ви можете вказати атрибут розгортання, як приклад, показаний нижче; Також вам потрібно встановити властивість "Вміст" та "Скопіювати, якщо новіше" (на наступні налаштування немає документації, але ви встановили ці параметри для роботи.

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



}

3
Вам ще потрібно це ввімкнути. Як написав Mercel у своєму коментарі, у VS2010 це: Test / Edit Test Settings / local, потім у списку виберіть "Deployment", встановіть прапорець "Enable ...".
Патрік Шалапський

Я борюся з цією проблемою в Visual Studio 2012 Express, і тому що це обмежене видання, важко було знайти чітку документацію. Велике спасибі за цю відповідь.
DavidHyogo

2
Чудово працює. Я фактично думаю, що це кращий метод та відповідь, оскільки він документує потрібні файли прямо над тестовим методом.
bu5hm4nn

1
Я виявив, що атрибут DeploymentItem також працює, коли вказано на рівні тестового класу (замість рівня методу).
Джон Шнайдер

10

Мені довелося ввімкнути "Увімкнути розгортання" в розділі Test -> Edit Test Settings -> Local -> Deployment" [DeploymentItem]Атрибут для роботи".


Це правда ... Я просто включив це, і тепер атрибут працює. Дякую!
Мігель Анжело

Як було сказано в моєму коментарі до іншої відповіді, я бореться з тією ж проблемою у візуальній студії 2012 express, і два відповіді разом нарешті дали мені рішення.
DavidHyogo

5

Усі три відповіді правильні, залежно від ваших потреб.

Додавання файлів для розгортання в .testrunconfig (.testsettings в VS2010) скопіює всі ці файли у кожну папку тестових вихідних даних, навіть для непов'язаних тестів, які виконуються ізольовано. Якщо ви запустили один тест, всі файли даних тестів, перелічені у розділі розгортання .testssettings, будуть скопійовані у папку вихідного тесту.

У своїх тестах мені потрібно скопіювати очікуваний XML-файл у папку тестового виводу, щоб порівняти його з фактичним XML-тестом. Я використовую атрибут DeploymentItem лише для того, щоб скопіювати файл XML, пов'язаний із запущеним тестом. У VS2010 я повинен був увімкнути розгортання у файлі .testsettings (але не додати жодних шляхів), а потім посилатись на шлях XML-файлу відносно TestProject у DeploymentItem.

Сподіваюся, це допомагає.


2
Моя проблема полягала у згаданому тут відносному шляху, я вважав, що Xml має бути в каталозі, в якому був тест, але він повинен бути в корені проекту, або мати попередній каталог, в якому він був.
Уес Грант

2

У мене була подібна проблема, але моє стосувалося вказівки на файл TraceAndTestImpact.testsettings замість файлу Local.testsettings. Ви можете переходити від одного до іншого в меню "Тест / Вибрати активні параметри тесту".


2

Хочеться просто покращити прийнятий відповідь, зазначивши спосіб змусити його розгортатись спеціально для dll, а не звичайний метод його використання для даних або конфігурації тощо, у випадках, коли CopyLocal не працює:

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]

1

Наступні роботи в VS2012 для тестових проектів, включених до декількох рішень без використання файлу тестових наборів:

1) Впорядкуйте файли та папки, які ви хочете розгорнути, у папку в каталозі тестових проектів.

2) У властивостях проекту створіть крок побудови після публікації

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

$(ProjectDir)і $(TargetDir)це макроси, які будуть інтерпретовані VS і повинні бути включені як такі.

<Project_Folder_Name> - назва папки, створеної на кроці 1.

<Deployment_Folder_Name>- це назва папки, в якій будуть розгорнуті тестові файли, і вона повинна бути названа таким чином, щоб вона була унікальною, коли кілька тестових проектів розгорнуто в один і той же каталог, наприклад <Project_Name>_TestInputs.

Тестові файли в спільних місцях також повинні бути скопійовані в папку розгортання цільового каталогу для обмеження тестових взаємодій. Надайте вихідний шлях відносно $(ProjectDir)макросу. Наприклад"$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml" .

3) Додати а [DeploymentItem(source, destination)] властивість або до кожного методу тестування, який використовує файл розгортання (найкраща практика), або до тестового класу (легша практика для ледачих чи поспішних, і найпростіший спосіб оновити проект раніше використовуваних відносних шляхів або файлу тестових налаштувань ).

У методі тестування source- це шлях до файлу або каталогу, що використовується у методі тестування відносно цільового каталогу, створеного файлом, xcopyі destinationце шлях до каталогу, в якому він буде створений відносно каталогу розгортання. Таким чином, тести працюють послідовно або в цільовому каталозі, або в каталозі розгортання. Шлях до місця призначення повинен бути таким же, як вихідний шлях без посилання на файл. Приклад: [DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")]. Це DeploymentItemмає бути включено до кожного методу, який використовує цей файл або каталог.

У класі, sourceі destinationобидва є назвою папки, створеної в цільовому каталозі xcopy; це скопіює всю папку в каталог розгортання при запуску будь-якого тесту в класі. Приклад:[DeploymentItem("Example_TestInputs","Example_TestInputs")]

4) У методах тестування тепер ви можете з упевненістю отримувати доступ до файлів і каталогів, вони будуть знаходитись у робочому каталозі незалежно від того, де в цей день Visual Studio вирішив поставити його File.Exists(".\Example_TestInputs\C1219TDL-2008.xml").


0

Спробуйте командний рядок події Post-Build з Visual Studio (якщо ви використовуєте цей IDE).


3
Я є, але це здається трохи злому. Це має бути досить розповсюдженим сценарієм, і я сподіваюся, що є лише якийсь варіант або властивість, яку я не налаштовую належним чином.
Ерік Шкоуновер

0

У Visual Studio 2012 вам не потрібен атрибут DeploymentItem для простого випадку. Дивіться мою відповідь тут


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";
}

0

Прийнята відповідь є правильною, як і більшість інших відповідей. Однак протягом багатьох років я виявив, що система розробки тестів Visual Studio Unit з використанням DeploymentAttribtue та Copy to Output є громіздкою, якщо у вас є велика кількість файлів даних. Я виявив, що збереження файлів у оригінальному місці розташування працювало краще.

Повна інформація в моїй іншій відповіді тут. https://stackoverflow.com/a/53004985/2989655

Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.