Элементы развертывания MSTest работают только тогда, когда они присутствуют в файле настроек теста проекта?

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

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

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

Ответ 1

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

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

Прежде всего, нам нужно включить/включить атрибут DeploymentItem.

Перейти к TEST → ИЗМЕНИТЬ НАСТРОЙКИ ИСПЫТАНИЙ → Текущие активные настройки.. например:: Local (local.testsettings)

alt text

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

alt text

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

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

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

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

alt text

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

alt text

PRO TIP: Копировать Всегда будет работать, но всегда копируйте исходный файл по целевому файлу.. даже если они идентичны. Вот почему я предпочитаю Copy if Newer... но независимо от того, что плавает ваша лодка

Хорошо дамы и джентльмены - все еще со мной? 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 - если u не использует 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.

НТН.

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

alt text

Ответ 2

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

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

The Test Results Window

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

The Test View Window

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

Ответ 3

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

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

То же самое происходит при запуске vstest.console.exe из командной строки. Подробнее см. здесь.

Обновление

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

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

  • Вы щелкните правой кнопкой мыши тест в Visual Studio и выберите "запустить/отладить" или
  • Вы запускаете из командной строки с помощью vstest.console.exe.

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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