Элементы развертывания MSTest работают только в том случае, если они присутствуют в файле настроек теста проекта? - PullRequest
75 голосов
/ 18 сентября 2010

Я не могу понять, как должны быть настроены элементы развертывания MSTest.Я смог заставить их работать должным образом, изменив файл настроек теста проекта, но это не идеально, так как конфигурация элемента развертывания отделена от отдельных тестов, а пути к файлам сохраняются как абсолютные пути, если только файлы нев папке решения.

Не могу ли я добавить элемент развертывания с помощью атрибута [DeploymentItem] в [TestClass] или [TestMethod] без необходимости создания / изменения файла настроек теста проекта?Как мне это сделать?

(Честно говоря, я не понимаю необходимости отдельной настройки элемента развертывания - почему бы просто не использовать существующие параметры «Копировать в выходной каталог» для файлов проекта, которые должны быть развернуты?элементы?)

Ответы [ 7 ]

221 голосов
/ 05 января 2011

Хорошо - этот пост здесь помог мне понять, что мне нужно сделать, БЕЗ необходимости вручную добавлять элементы в файл .testsettings.

Шаг 1 - Включить тест MS DeploymentItem атрибут.

Сначала нам нужно включить / включить атрибут DeploymentItem.

Перейти ТЕСТ -> РЕДАКТИРОВАТЬ НАСТРОЙКИ ТЕСТА -> Текущие активные настройки .. например:: Local (local.testsettings)

alt text

Теперь перейдите к DEPLOYMENT и убедитесь, что Enable Deployment отмечен галочкой.(По умолчанию он выключен).

alt text

Шаг 2. Проверьте свойства файла

Теперь нам нужно убедиться, что файл, который вы хотите использовать вмодульный тест, это настройка для копирования в каталог BIN при компиляции.В модульном тесте MS Test могут использоваться только файлы, которые находятся в каталоге BIN.Зачем?Поскольку каждый раз при запуске MS Test, он должен делать копию источников ... и это означает, что он делает копию файлов текущего каталога BIN (для текущей конфигурации).

Например... Текущая конфигурация Отладка (в отличие от выпуска).alt text

Затем я добавляю свой файл ... (обратите внимание на структуру папок в проекте) ...

alt text

, а затем убедитесь, чтоэтот файл ВСЕГДА копируется в каталог bin при компиляции проекта.

alt text

СОВЕТ ПРОФ: копирование всегда будет работать, но всегда копировать исходный файл поверхфайл назначения .. даже если они идентичны.Вот почему я предпочитаю Копировать, если новее ... но все, что плавает на вашей лодке

Хорошо, дамы и господа, - все еще со мной?Wikid.

Когда мы скомпилируем, файл теперь должен существовать в каталоге Bin ....

alt text

Шаг 3 - Теперь используйте атрибут DeploymentItem

Хорошо, теперь мы можем наконец использовать атрибут DeploymentItem в нашем коде.Когда мы делаем это, это говорит MSTest скопировать файл (из расположения относительно каталога bin) в новый каталог MS Test ...

[TestMethod]
[DeploymentItem(@"Test Data\100LogEntries.txt", "Test Data")]
public void Parsing100LogFileEntriesReturnsANewParsedLogEntriesWith100Items()
{
    // Arrange.
    const string fileName = @"Test Data\100LogEntries.txt";
    ILogEntryService logEntryService = new PunkBusterLogEntryService();

    // Act.
    var parsedLogEntries = logEntryService.ParseLogFile(fileName, 0);

    // Assert.
    Assert.IsNotNull(parsedLogEntries);
    Assert.AreEqual(100, parsedLogEntries.LogEntries.Count);
    // Snipped the remaining asserts to cut back on wasting your time.
}

Итак, давайте разберемся с этим ..

[TestMethod]

Мы все знаем, что это такое.

[DeploymentItem(@"Test Data\100LogEntries.txt", "Test Data")]

Начиная с каталога bin, перейдите в папку Test Data и скопируйте файл 100LogEntries.txt в папку назначения Test Dataв корневом каталоге вывода MS Test, который MS Test создает при запуске каждого теста.

Так выглядит моя структура выходных папок.(Извините за весь беспорядок ...)

alt text

и вуаля!у нас есть файлы развертывания, программно.

PRO TIP # 2 - если вы не используете 2-й строковый аргумент в атрибуте DeploymentItem, то файл будет скопирован в корневую папку OUT,текущего теста MS.

const string fileName = @"Test Data\100LogEntries.txt";

Теперь путь к файлу указывается относительно папки OUT для текущего теста MS.Таким образом, я явно сказал развернуть файл в каталог с именем Test Data ... поэтому мне нужно убедиться, что я правильно ссылаюсь на это в своем коде, когда хочу прочитать в файле.

Просто чтобы подтвердить -> полный путь к этому имени файла переводится в что-то вроде C:\lots of blah blah blah\My Solution\TestResults\PureKrome_PUREKROME-PC 2011-01-05 23_41_23\Out\Test Data .. для текущего теста MS.

HTH.

Теперь есть изображениеЕдинорог, за то, что так много читал:)

alt text

15 голосов
/ 04 апреля 2012

Я думал, что поделюсь тем, как столкнулся с проблемами с MSTest и элементами развертывания. Если вы отлаживаете / запускаете тест 2 раза или более из окна «Результаты теста», он использует настройки предыдущего запуска. Однако, если вы отлаживаете / запускаете тот же тест из окна «Просмотр теста», он использует последние настройки. Я потерял час, пытаясь выяснить, почему не использовались изменения в Local.testsettings, когда я продолжал запуск Debug для того же теста из окна «Результаты теста».

Это окно Результаты теста (не запускайте тесты отсюда после внесения изменений в Local.testsettings):

The Test Results Window

И это окно Test View (НЕОБХОДИМО начинать тесты отсюда после внесения изменений в Local.testsettings):

The Test View Window

Надеюсь, это спасет кого-то от головной боли в будущем.

7 голосов
/ 08 августа 2013

В Visual Studio 2012 выходной каталог является рабочим каталогом, что означает, что атрибут DeploymentItem не требуется для общего случая (когда у вас нет конкретных элементов развертывания для теста или для класса).Это означает, что если вам не нужно использовать атрибут DeploymentItem, если существует набор файлов, которые вы хотите использовать во всех своих тестах, или вы не слишком придирчивы к каждому TestClass / TestMethod, имеющему отдельные зависимости развертывания.

Вы можете просто нажать Project |Показать все файлы и включить подпапки и файлы в Visual Studio с атрибутом «Копировать всегда» или «Копировать, если новее» в ваш проект, и файлы будут скопированы в ваш выходной каталог с неповрежденной иерархией.

То же самое относится и к запуску vstest.console.exe из командной строки.Смотрите здесь для деталей.

Обновление

В некоторых случаях каталог по умолчанию не будет выходным каталогом.В частности, когда вы выбираете Run All Tests, путь по умолчанию будет находиться под TestResults\Deploy_... То же самое применяется при использовании runsettings файла или при тестировании с использованием DeploymentItems

Выходной каталог будет каталогом по умолчанию, если вы неиспользуя DeploymentItems и: -

  • Щелкните правой кнопкой мыши тест (ы) в Visual Studio и выберите запуск / отладку, или
  • Запустите из командной строки, используя vstest.console.Отлично.
1 голос
/ 19 сентября 2010

Если вам нужен отдельный элемент развертывания в отдельных тестовых случаях, тогда, пожалуйста, используйте атрибут [DeploymentItem("string file path")] в каждом тестовом случае.

0 голосов
/ 15 сентября 2016

В VS 2012 все, что вам нужно, это сделать файл log4net.properties (или любой другой файл конфигурации для log4net) копировать, если он новее. (щелкните правой кнопкой мыши файл log4net.properties, чтобы открыть свойства и настроить его)

0 голосов
/ 11 сентября 2013

Похоже, это работает по умолчанию в VS.NET 2012

0 голосов
/ 30 октября 2012

В моем случае я добавляю атрибут DeploymentItem, он не может вступить в силу немедленно. Я должен закрыть и заново открыть решение, после чего настроенные атрибуты DeploymentItem вступят в силу.

...