Как я могу заставить «Копировать в выходной каталог» для работы с модульными тестами?

123

Когда я создаю проект модульного теста перед выполнением тестов, результаты теста копируются в папку TestResults, а затем тесты выполняются. У меня проблема в том, что не все файлы из каталога Debug / bin копируются в проект TestResults.

Как я могу получить файл, скопированный в каталог Debug / bin, который также будет скопирован в папку TestResults?

Эрик Шуновер
источник

Ответы:

121

Стандартный способ сделать это - указать элементы развертывания в .testrunconfigфайле, доступ к которому можно получить с помощью элемента « Изменить конфигурации выполнения теста» в меню « Тест Visual Studio» или в папке « Элементы решения ».

Марк Сидаде
источник
15
В VS2010 это: Test / Edit Test Settings / local, затем в списке выберите «Deployment», установите флажок «Enable ...» и добавьте файл (ы).
Марсель
18
Возможно, вам придется закрыть свое решение (или даже Visual Studio) и снова открыть его, прежде чем это изменение вступит в силу должным образом
RobV
RobV, ты сделал мой день. СПАСИБО!
Игнасио Солер Гарсия
2
Если вы используете атрибут [DeploymentItem] в коде, вам не нужно указывать файлы в диалоговом окне - см. Код @ tomfanning ниже.
Патрик Салапски
Это не решает мою проблему с копированием вывода конфигурации из папки bin или release, потому что во время разработки у меня нет информации о том, будет ли файл находиться в папке отладки или выпуска, и для меня это файл, который не копируется в Папка Out в результатах тестирования
Gurpreet 08
61

Вы можете указать атрибут развертывания, как в примере, показанном ниже; Также вам необходимо установить свойства «Содержимое» и «Копировать, если новее» (документации по более поздним настройкам нет, но вы установили их, чтобы они работали.

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



}
Sanjay10
источник
3
Вам все равно нужно включить это. Как написал Мерсел в своем комментарии, в VS2010 это: Test / Edit Test Settings / local, затем в списке выберите «Развертывание», установите флажок «Включить ...».
Патрик Салапски
Я борюсь с этой проблемой в Visual Studio 2012 Express, и, поскольку это ограниченный выпуск, было трудно найти четкую документацию. Большое спасибо за такой ответ.
DavidHyogo
2
Прекрасно работает. Я действительно думаю, что это лучший метод и ответ, поскольку он документирует необходимые файлы прямо над методом тестирования.
bu5hm4nn
1
Я обнаружил, что атрибут DeploymentItem также работает, если он указан на уровне тестового класса (вместо уровня метода).
Джон Шнайдер
10

Мне пришлось включить «Разрешить развертывание», Test -> Edit Test Settings -> Local -> Deploymentчтобы [DeploymentItem]атрибут работал.

tomfanning
источник
Это правда ... Я только что включил, и теперь атрибут работает. Спасибо!
Мигель Анджело
Как упоминалось в моем комментарии к другому ответу, я борюсь с той же проблемой в Visual Studio 2012 Express, и 2 ответа вместе, наконец, дали мне решение.
DavidHyogo
5

Все три ответа верны, в зависимости от ваших потребностей.

Добавление файлов для развертывания в .testrunconfig (.testsettings в VS2010) скопирует все эти файлы в каждую выходную папку теста, даже для несвязанных тестов, выполняемых изолированно. Если вы запустите один тест, все файлы тестовых данных, перечисленные в разделе развертывания .testssettings, будут скопированы в папку вывода теста.

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

Надеюсь это поможет.

GraehamF
источник
2
Моя проблема заключалась в упомянутом здесь относительном пути, я думал, что Xml должен находиться в каталоге, в котором находится тест, но он должен быть в корне проекта или ему предшествует каталог, в котором он был.
Уэс Грант,
2

У меня была аналогичная проблема, но моя была связана с указанием на файл TraceAndTestImpact.testsettings вместо файла Local.testsettings. Вы можете переключаться с одного на другой в меню Test / Select Active Test Settings.

Саймон
источник
2

Хотел бы просто улучшить принятый ответ, упомянув способ его развертывания специально для dll, а не обычный метод использования его для данных или конфигурации и т. Д. В обстоятельствах, когда CopyLocal не работает:

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]
JamesDill
источник
1

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

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).

Kasper
источник
3
Да, но это похоже на хитрость. Это должен быть довольно распространенный сценарий, и я надеюсь, что есть какой-то параметр или свойство, которое я неправильно настроил.
Эрик Шуновер,
0

В Visual Studio 2012 вам не нужен атрибут DeploymentItem в простом случае. Смотрите мой ответ здесь

acarlon
источник
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 с использованием DeploymentAttribtue и Copy to Output становится громоздкой, если у вас есть большое количество файлов данных. Я обнаружил, что лучше хранить файлы в их исходном месте.

Полная информация в моем другом ответе здесь. https://stackoverflow.com/a/53004985/2989655

Надеюсь это поможет.

Sau001
источник