it-roy-ru.com

Как я могу получить "Copy to Output Directory" для работы с модульными тестами?

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

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

121
Eric Schoonover

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

121
Mark Cidade

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

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



}
57
Sanjay10

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

10
tomfanning

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

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

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

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

5
GraehamF

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

2
Simon

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

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

Следующее работает в 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").

1
Richard Morris

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

0
acarlon
[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
Nina

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

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

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

0
Sau001

Попробуйте выполнить командную строку события Post-Build из Visual Studio (если вы используете эту IDE).

0
Kasper