Чи працюють елементи розгортання MSTest лише тоді, коли вони є у файлі налаштувань тесту проекту?


75

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

Чи не повинен я мати змогу додати елемент розгортання за допомогою [DeploymentItem]атрибута або на, [TestClass]або [TestMethod]без необхідності створювати / змінювати файл налаштувань тесту проекту? Як мені це досягти?

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

Відповіді:


223

Гаразд - ця публікація тут допомогла мені зрозуміти, що мені потрібно було робити БЕЗ необхідності додавати елементи у .testsettingsфайл вручну .

Крок 1 - Увімкніть DeploymentItemатрибут MS Test .

Спочатку нам потрібно увімкнути / увімкнути DeploymentItemатрибут.

Перейти до ТЕСТУ -> РЕДАКТУВАТИ НАЛАШТУВАННЯ ТЕСТУ -> Поточні активні налаштування .. напр. :: Локальний (local.testsettings)

текст заміщення

Тепер перейдіть до DEPLOYMENT та переконайтеся, що Enable Deployment встановлено галочку ON. (За замовчуванням це вимкнено).

текст заміщення

Крок 2 - Перевірте властивості файлу

Тепер нам потрібно переконатися, що файл, який ви хочете використовувати в модульному тесті, налаштовано для копіювання в каталог BIN під час компіляції. Тільки файли, що знаходяться в каталозі BIN, можуть бути використані для тестування модуля MS Test. Чому? Оскільки кожного разу, коли запускається тест MS, він повинен зробити копію джерел ... і це означає, що робить копію поточних файлів каталогів BIN (для поточної конфігурації).

Наприклад ... Поточна конфігурація налагоджена (на відміну від Release). текст заміщення

Потім я додаю свій файл ... (взяти до відома структуру папок у проекті) ...

текст заміщення

а потім переконайтесь, що цей файл ЗАВЖДИ копіюється в каталог bin під час компіляції проекту.

текст заміщення

ПІДКАЗКА: Копіювати Завжди також буде працювати, але завжди копіюйте вихідний файл над цільовим файлом .. навіть якщо вони ідентичні. Ось чому я віддаю перевагу копіюванню, якщо новіше ... але все, що плаває на вашому човні

Добре, пані та панове - все ще зі мною? Wikid.

Коли ми компілюємо, файл тепер повинен існувати в директорії Bin ....

текст заміщення

Крок 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 створює під час запуску кожного тесту.

Ось так виглядає моя структура вихідних папок. (Вибачте за все безлад ...)

текст заміщення

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

ПОРАДА No2 - якщо ви не використовуєте аргумент 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.

Тепер майте малюнок Єдинорога, щоб так багато читати :)

текст заміщення


81
Хоча це Пегас. ;-)
Damien Ryan

19
О БОЖЕ МІЙ! Як, біса, я не помітив, що відсутній ріг. Це занадто смішно! Вітаю Демієн :) (Мене засліпила Веселка ....)
Pure.Krome

Це було порятунком, справді допомогло мені зрозуміти це, оскільки VS 2010 не грав добре, але ReSharper був, коли справа доходила до файлів розгортання
Urda

1
Документи DeploymentItemговорять про те, що відносні шляхи знаходяться, починаючи відносно "RelativeRootPath" у testrunconfig або тестових налаштуваннях. За замовчуванням це папка Solution. Ваші файли не знаходяться в "$ (SolutionDir) \ Test Data". Вони знаходяться в "$ (SolutionDir) \ Tests \ Test Data". Ви змінили свій RelativeRootPath? чи документи неправильні? чи ваша відповідь працює якоюсь іншою магією?
Ентоні Мастреан,

3
@Random - він не працює в 2012 році, оскільки списки тестів були видалені та замінені атрибутами TestCategory.
Phill

15

Я думав поділитися тим, як зіткнувся з проблемами MSTest та елементами розгортання. Якщо ви налагоджуєте / запускаєте тест два рази або більше у вікні "Результати тесту", він використовує налаштування попереднього запуску. Однак, якщо ви налагоджуєте / запускаєте той самий тест у вікні "Перегляд тесту", він використовує найновіші налаштування. Я втратив годину, намагаючись зрозуміти, чому зміни у налаштуваннях Local.test не використовуються, коли я продовжував запускати Налагодження на тому самому тесті з вікна "Результати тесту".

Це вікно Результати тесту (не [повторно] запускати тести звідси після внесення змін до Local.testsettings):

Вікно результатів тесту

І це вікно Перегляду тесту (ЗАПУСКАТИ тести звідси після внесення змін до Local.testsettings):

Вікно тестового подання

Сподіваюся, це врятує когось від головного болю в майбутньому.


Дякую за це. Я витратив стільки часу на перезапуск Visual Studio, перш ніж прочитати це!
mattythomas2000

7

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

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

Те саме стосується запуску vstest.console.exe із командного рядка. Детальніше див. Тут .

Оновлення

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

Вихідний каталог буде каталогом за замовчуванням, коли ви не використовуєте DeploymentItems і: -

  • Клацніть правою кнопкою миші тест (и) у Visual Studio та виберіть запуск / налагодження або
  • Ви запускаєтеся з командного рядка за допомогою vstest.console.exe.

Неправда, в деяких випадках Агент встановлює робочий каталог так само, як і VS2010. Чи знаєте ви, як контролювати таку поведінку?
Випадковий

@Random. Чи допомогло посилання відповісти на ваше запитання? Він показує, як запускати тести різними способами та з різних папок. Я не впевнений у ваших особливостях, тому не можу відповісти за ваше оточення. У моїй автоматизованій збірці тести завжди запускаються з вихідного каталогу, тому це здається досить детермінованим у моєму середовищі.
acarlon

Я пройшов посилання, і те, що я помітив, - це те, що я можу запускати тести без вибраного файлу тестових налаштувань, і тести виконуються в папці налагодження, щоб я міг використовувати xcopy для розгортання, або я використовую тестові налаштування, і кожен запуск виконується у власній папці з позначкою часу, xcopy, ні робота DeploymentItem. Я спробував фіксований та відносний шляхи для DeploymentItem, але він все ще не вдається. Позначення "Увімкнути розгортання" в налаштуваннях тесту ні на що не впливає. Моє налаштування досить ванільне з однією відмінністю - я будую до x86 та .NET 3.5 (обидва виправлені у всіх налаштуваннях проекту)
Випадковий

1

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


2
Однак моя проблема полягає в тому, що атрибут DeploymentItem не працює.
араторн

Те саме тут :( Я коли-небудь працював, змінюючи файл налаштувань.
Pure.Krome

0

Для мого випадку я додаю атрибут DeploymentItem, він не може набути чинності негайно. Мені потрібно закрити та знову відкрити рішення, тоді налаштовані атрибути DeploymentItem набудуть чинності.


Насправді голосування проти не було справедливим. Я прочитав цілий підручник і спробував різні речі, але рішення було: очистити проект, відновити його, а потім запустити тести. Раптом все запрацювало :)
ecth,


-1

У VS 2012 все, що вам потрібно, це зробити файл log4net.properties (або будь-який інший конфігураційний файл для log4net) Копіювати, якщо новіший. (клацніть правою кнопкою миші файл log4net.properties, щоб викликати властивості та налаштувати його)


1
На запитання вже є прийнята відповідь, і ваша відповідь не надає жодної додаткової інформації. Питання навіть не в питанні про log4net.properties.
Гюнтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.