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

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

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

Ответ 1

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

Ответ 2

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

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



}

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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