#unit-testing #tfs #mstest #tfsbuild
#модульное тестирование #tfs #mstest #tfsbuild
Вопрос:
Итак, я сталкиваюсь с проблемой, когда я приступаю к сборке своих проектов с использованием контроллера сборки tfs, используя местоположение вывода «asconfigured», он не обнаружит мои модульные тесты. Позвольте мне дать немного информации о моей настройке.
Обновление TFS 2013 2, шаблон процесса по умолчанию
Вот несколько скриншотов, которые, надеюсь, помогут заполнить то, что я не могу набрать. Я копирую свою сборку в общий файловый ресурс в нашей сети, чтобы мы могли использовать другие утилиты, использующие выходные данные. Я не хочу использовать «PerProject» или «SingleFolder», потому что они портят файловую структуру, которую мы настроили (они оба будут запускать тесты). Итак, у меня есть файлы, копируемые в имена папок «SingleOutputFolder», которые являются дочерними элементами DropLocation. Я хотел бы иметь возможность запускать из папки drop или запускать из папки bin для каждого из моих тестов (мне все равно, какой). Однако, похоже, он не обнаруживает / не запускает НИ ОДИН из тестов. Любая помощь будет принята с благодарностью. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Я пробовал использовать *** test * .dll, InstallSingleFolderOutput ** .test.dll , и $(TF_BUILD_DROPLOCATION)InstallSingleFolderOutput*тест*.dll
Но я не уверен, какие переменные доступны, и понимаю, где область его выполнения.
Ответ №1:
Учитывая, что вы используете местоположение вывода сборки, установленное на AsConfigured, вам необходимо изменить значения по умолчанию для настройки спецификации Test sources, чтобы разрешить сборке находить тестовые библиотеки в папках bin. Вот пример.
Если полный путь к библиотекам модульного тестирования:
E:Builds7<TFS Team Project><Build Definition>src<Unit Test Project>binRelease*test*.dll
используйте
..src*UnitTest*bin**test*.dll;
Комментарии:
1. У меня были тесты интеграции, которые я хотел игнорировать, поэтому я использовал
..src*.testbin**.test.dll
2. Я также хочу искать в поддирах, а не только непосредственно в src.
..src***test*.dll
делает это, но находит каждый тест дважды, предположительно потому, что он находит обаbinDebugtest.dll
иobjDebugtest.dll
. Я пробовал..src**bin**test*.dll
, но ничего не нашел. Не нашли полного решения, кроме взлома XAML
Ответ №2:
Этот вопрос был задан на форумах MSDN здесь.
Форумы MSDN предложили обходной путь
Предлагаемый обходной путь в принятом ответе (по состоянию на 8 часов утра 20 июня) заключается в указании полного пути к двоичным папкам тестовых проектов: например:
C:Builds{agentId}{teamProjectName}{buildDefinitionName}src{solutionName}{testProjectName}bin*Debug*test*.dll*
что действительно должно было быть показано как
{agentWorkingFolder}src{relativePathToTestProjectBinariesFolder}*test*.dll
Однако этот подход очень хрупкий по следующим причинам:
- Любые новые тестовые проекты, которые вы добавляете в решение, не будут выполняться, пока вы не добавите их в список тестовых источников определения сборки:
- Он сломается при любом из следующих обстоятельств:
- определение сборки переименовано
- рабочая папка в свойствах агента сборки изменена
- у вас есть несколько агентов сборки, и сборку выполняет агент, отличный от того, который вы указали в {id}
Улучшено обходное решение
Мой обходной путь устраняет проблемы, перечисленные в # 2 (ничего не могу поделать с # 1).
В указанном выше пути замените начальную часть:
{agentWorkingFolder}
с
..
итак, у вас есть
..src{relativePathToTestProjectBinariesFolder}*test*.dll
Это работает, потому что внутренним рабочим каталогом, по-видимому, является binaries folder, который является родственным src folder . Переход к родительской папке (как бы она ни называлась, нам все равно) и обратно в src перед указанием пути к двоичным файлам тестовых проектов делает свое дело.
Примечание: Если у вас несколько тестовых проектов, вы добавляете дополнительные записи, разделенные точками с запятой:
..src{relativePathToTestProjectONEBinariesFolder}*test*.dll;..src{relativePathToTestProjectTWOBinariesFolder}*test*.dll;..src{relativePathToTestProjectTHREEBinariesFolder}*test*.dll;
Комментарии:
1. Это не работает, если у вас несколько конфигураций сборки, например, сборка и отладка. Поскольку вам нужно указать точный путь, он будет запускать отладочные тесты для обеих сборок.
2. @Deli, не могли бы вы настроить два разных определения сборки, одно для вашей сборки выпуска, а другое для сборки отладки? Затем в каждом определении сборки должен быть указан свой собственный набор тестовых двоичных файлов. Это звучит раздражающе, но большинство обходных путей таковы.
3. Да, это должно сработать, только это займет немного больше времени, поскольку код нужно проверять дважды.
4. Это
..src***test.dll
работает для меня, без необходимости указывать проекты (если это соответствует вашим потребностям).5. У меня есть настройка «AsConfigured» для платформы X64, которая помещает двоичные файлы в
srcx64Release` (and it used to place them into
bin x64 Release ` без этого переключателя). Итак, я закончил тем, что использовал......src***test*.dll
в качестве своей «спецификации тестовых источников».
Ответ №3:
В итоге я добавил событие post build для копирования всего теста.dll в папку промежуточного расположения в конкретной сборке, которая в основном эквивалентна тому, куда она будет отправляться при сборке с одной папкой, и делать это в каждом тестовом проекте.
if "$(TeamBuildOutDir)" == "" (
echo "Building Interactively not in TFS"
) else (
echo "Building in TFS"
xcopy "$(TargetDir)*.*" "$(TeamBuildBinaries)" /Y /E /S
)
Параметр MSBUILD в build def, который сообщил ему, что он в основном попадает в папку, в которой их ищет TFS.
/p:TeamBuildBinaries="$(TF_BUILD_BINARIESDIRECTORY)"
Сохранена спецификация файла тестовой сборки по умолчанию:
***test*.dll
Просмотрите эту ссылку для получения информации о переменной, которую я использовал, и о том, какой относительный путь она существует.
Ответ №4:
Другое решение — сделать обратное.
Оставьте все файлы в корневом каталоге, чтобы все встроенные функции работали. Там больше, чем просто выполнение теста. Как насчет статического анализа кода, анализа воздействия .. среди прочего. Вам нужно будет сделать что-то пользовательское для них всех.
Вместо этого используйте сценарий предварительного удаления powershell для создания вашей схемы установки из корневых файлов.
Если это приложение, вы можете использовать пакет Nuget _ApplicationFolder для создания папки _PublishApplications, такой же, как для веб-приложений.