Ответ 1
Стандартный способ сделать это - указать элементы развертывания в файле .testrunconfig
, доступ к которому можно получить через пункт "Редактировать параметры тестового запуска" в меню "Visual Studio Test" или в папке "Решения".
Когда я создаю проект unit test перед выполнением тестов, тестовый вывод копируется в папку TestResults, а затем выполняется тестирование. Проблема, с которой я сталкиваюсь, заключается в том, что не все файлы в каталоге Debug/bin копируются в проект TestResults.
Как я могу получить файл, который скопирован в каталог Debug/bin, который также будет скопирован в папку TestResults?
Стандартный способ сделать это - указать элементы развертывания в файле .testrunconfig
, доступ к которому можно получить через пункт "Редактировать параметры тестового запуска" в меню "Visual Studio Test" или в папке "Решения".
Вы можете указать атрибут развертывания, например, пример, показанный ниже; Также вам нужно установить свойство "Содержимое" и "Копировать, если новое" (документация по более поздним настройкам отсутствует, но вы установили их, чтобы они работали.
[TestMethod]
[DeploymentItem("mytestdata.xml")]
public void UploadTest()
{
}
Мне пришлось включить "Включить развертывание" под Test -> Edit Test Settings -> Local -> Deployment
для атрибута [DeploymentItem]
.
Все три ответа правильны, в зависимости от ваших потребностей.
Добавление файлов для развертывания в .testrunconfig(.testsettings в VS2010) скопирует все эти файлы в каждую тестовую выходную папку, даже если несвязанные тесты выполняются изолированно. Если вы запустите один тест, все файлы тестовых данных, перечисленные в разделе развертывания .testssettings, будут скопированы в тестовую выходную папку.
В моих тестах мне нужно скопировать ожидаемый файл XML в тестовую выходную папку для сравнения с фактическим тестовым выходным XML. Я использую атрибут DeploymentItem только для копирования файла XML, связанного с тестом (-ами), который выполняется. В VS2010 мне пришлось включить развертывание в файле .testsettings(но не добавлять никаких путей), а затем ссылаться на путь файла XML относительно TestProject в DeploymentItem.
Надеюсь, что это поможет.
У меня была аналогичная проблема, но мне приходилось указывать на файл TraceAndTestImpact.testsettings вместо файла Local.testsettings. Вы можете перейти от одного к другому в меню Test/Select Active Test Settings.
В 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")
.
Хотелось бы просто усилить принятый ответ, указав способ его специально развернуть для dll, а не обычный метод его использования для данных или конфигурации и т.д., в случае, когда CopyLocal не работает:
[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]
Попробуйте создать командную строку Post-Build из Visual Studio (если вы используете эту среду IDE).
В Visual Studio 2012 вам не нужен атрибут DeploymentItem для простого случая. См. Мой ответ здесь
[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";
}