Как я могу получить «Copy to Output Directory» для работы с модульными тестами? - PullRequest
122 голосов
/ 23 октября 2008

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

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

Ответы [ 11 ]

121 голосов
/ 23 октября 2008

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

57 голосов
/ 10 августа 2010

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

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



}
10 голосов
/ 21 июля 2011

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

5 голосов
/ 01 декабря 2010

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

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

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

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

2 голосов
/ 30 августа 2011

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

1 голос
/ 26 октября 2015

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

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]
1 голос
/ 05 сентября 2014

В 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)] к каждому методу тестирования, использующему файл развертывания (лучшая практика), или к классу тестов (проще для ленивых или спешащих, и самый простой способ обновить проект ранее использовавшимся). относительные пути или файл testsettings).

В тестовом методе 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 голосов
/ 27 октября 2018

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

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

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

0 голосов
/ 18 июля 2017
[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 голосов
/ 08 августа 2013

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

...