Проблеми з атрибутом DeploymentItem


94

В даний час я підтримую "стару" систему, написану на C # .net, видаляючи деякі застарілі функції та виконуючи певний рефакторинг. Слава Богу, попередній хлопець написав кілька модульних тестів (MSTests). Мені було цілком комфортно з тестами JUnit, але з MSTests я ще нічого не робив.

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

[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
   ...
}

Тести працювали раніше, але тепер мені довелося змінити імена файлів TIF, що містяться в каталозі \ files \ tif. Згідно з правилом, імена файлів TIF повинні відповідати певному шаблону, який також перевіряється ExistsTifTest()методом. Тепер мені довелося змінити імена файлів, щоб адаптувати їх до нових вимог, і раптом файли TIF ​​більше не розгортаються, як раніше.

Хтось може дати мені підказку, чому це трапляється, або що може бути причиною? Те саме відбувається, також якщо я додаю новий текстовий файл, скажіть "my2ndTest.txt" поруч із "valid_entries.txt" у каталозі \ files \ valid \ з відповідним атрибутом DeploymentItem для методу тестування. Файл не розгортається?

Я отримав зображення, які зараз розгорнуті, визначивши шлях до розгортання безпосередньо у testrunconfig, але я хотів би зрозуміти, чому це відбувається, або чому, наприклад, мій новий файл "my2ndTest.txt" не розгортається, поки інші роблять.


2
Великою проблемою тут є усвідомлення того, що всі елементи, зазначені в DeploymentItemAttribute, будуть скопійовані до місця, звідки запускаються ваші тестові збірки. Іншими словами, якщо ви сподівались, що це збереже вашу структуру каталогів, вам не пощастить. Якщо вам потрібно скопіювати його до певного каталогу, використовуйте версію із двома параметрами DeploymentItem (source, outputDir). FYI - ви можете піти в стару школу, щоб дізнатися, де запускаються файли для MsTest, запустивши System.Console.WriteLine (System.Environment.CurrentDirectory) в один із ваших тестів. У NCrunch не було цієї проблеми!
CodeMonkeyKing

Відповіді:


111

DeploymentItem це трохи безлад.

Кожен файл у вашому рішенні матиме параметр "Копіювати у вихідну папку" у VS.NET. Вам потрібно, щоб це було "Копіювати завжди" (або подібне), щоб отримати файли у вихідній папці.

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

Особисто, якщо у мене є файли, які мені потрібні для моїх модульних тестів, я виявив, що вбудовування цих файлів як ресурсів у збірку, а також те, що ця асамблея «розпаковується» під час тестів, є більш передбачуваним способом зробити щось. YMMV.

примітка: Ці коментарі базуються на моєму досвіді роботи з VS2010. Коментарі до моєї відповіді свідчать про те, що це не проблема VS2012. Я все ще залишаюся на стороні коментарів про те, що використання вбудованих ресурсів передбачає менше "магії", і для мене стадія "упорядкування" моїх модульних тестів стає набагато чіткішою.


3
Копіювати у вихідний каталог ніколи не впливає на те, як MSTest розгортає файли. Ця відповідь неправильна.
kzu

19
На VS2010 Premium внесення цієї зміни (та жодних інших змін) спричинило розгортання файлу. Таким чином, я роблю висновок, спираючись на фактичні докази того, що це ВПЛИВАЄ на розгортання MsTest.
JonStonecash

1
Домовились. Я бачив, як ця одна зміна перевертає DeploymentItem хмуриться догори дном.
Мартін Пек,

2
Здається, це більше не потрібно на VS2012. Мої елементи розгортання розгортаються з "Копіювати у вихідну папку", встановленою на "Не копіювати".
Майк

29
Чудово, як DeploymentItem не повідомляє вас, коли не вдається скопіювати один файл, який ви йому надали.

74

У VS2010 у моїх налаштуваннях Local.test було встановлено прапорець "Увімкнути розгортання", а атрибут DeploymentItem не працював. Я перевірив це, і все працювало нормально. Я сподіваюся, що це допомагає!


2
Я віками бився головою об цегляну стіну, намагаючись змусити її працювати .... дякую!
mat-mcloughlin

12
Я думаю, було б непогано, якби фреймворк видав попередження про те, що атрибути DeploymentItem ігноруються, якщо це налаштування вимкнено. Я також справляю приємне увігнуте враження на своєму столі.
Алан Макбі - MSFT

2
Зверніть увагу, що Local.testsettings є в елементах рішення
Matthew Lock

Мені також довелося додати каталог, що містить елементи, які я хотів розгорнути, також у Local.testsettings: i.imgur.com/p1z3m9R.png
Matthew Lock

Використання VS2017 у 2018 році перевірка `` Увімкнути розгортання '' все ще залишається рішенням цієї проблеми. І, на жаль, все ще попередження від Visual Studio взагалі. Тож дякую за це рішення.
Дон Х

19

Я також стикався з подібними проблемами, але я знайшов просте 3-х крокове рішення для цього:

Якщо припустити, що структура папок виглядає так: SolutionFolder\ TestProjectFolder\ SubFolder\

  1. Перейдіть до "Елементи рішень / Local.testsettings"> "Розгортання"> Позначте "Увімкнути розгортання"
  2. Якщо ви використовуєте VS2010, переконайтесь, що для всіх файлів, які ви хочете розгорнути, властивість "Копіювати у вихідну папку" має значення "Копіювати завжди" або "Копіювати, якщо новіше"
  3. Атрибутуйте свій TestMethod одним із:
    • [DeploymentItem(@"TestProjectFolder\SubFolder")]для розгортання всього вмісту <SubFolder>в тестовому запуску
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")] щоб розгорнути весь вміст <SubFolder>to <TargetFolder>в каталозі Test Run

Останнє примітка про MSTest (принаймні для VS2010):

Якщо ви хочете, <TargetFolder>щоб назва мала те саме ім'я <SubFolder>, використання [DeploymentItem(@"SubFolder", @"SubFolder")]не вдасться мовчки, оскільки бігун MSTest потрапляє в безглуздий край. Ось чому ви повинні префікс <SubFolder>з <TestProjectFolder>таким чином:[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]


Примітка про помилку іменування підпапки - це самоцвіт.
RJ Lohan,

1
VS 2015, здається, трохи інший. Мені потрібно було видалити частину "TestPojectFolder" в атрибуті DeploymentItem.
uli78

15

Для надії на допомогу комусь іншому: я спробував тут усі пропозиції, і все-таки мій елемент розгортання не копіювався.

Що мені потрібно було зробити ( як пропонується тут ), це додати другий параметр до атрибута DeploymentItem:

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]

10

Якщо ви зайдете у свій файл .testrunconfig і при розгортанні знімете прапорець біля пункту «Увімкнути розгортання», тести працюватимуть у своєму звичайному розташуванні, і все працюватиме так, як і при запуску програми поза модульним тестом.


Були деякі проблеми і з цим. Як прем'єр-міністр, я не маю доступу до всіх інструментів, які використовує dev. У цьому випадку ReSharper скопіював файл правильно, тоді як MSTest не зміг цього зробити. -> У мене виникли помилки, коли розробник був у порядку. Змініть "Тест-> Редагувати налаштування тесту -> Локальні налаштування -> Розгортання", включаючи файл, про який йдеться, це виправлено для мого використання в MSTest.
sonstabo

9

Можливо, це не стосується вашої точної проблеми, але ось кілька порад, які я знайшов з атрибутом [DeploymentItem].

  1. Копіювати у вихідний каталог слід встановити на Копіювати завжди.

Він НЕ працює при використанні з атрибутом [TestInitialize]

[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{

Це має бути на вашому [TestMethod], наприклад

    [TestInitialize]
    public void Setup()
    {
        string spreadsheet = Path.GetFullPath("test.xlsx");
        Assert.IsTrue(File.Exists(spreadsheet));
        ...
    }

    [TestMethod]
    [DeploymentItem("test.xlsx")]
    public void ExcelQuestionParser_Reads_XmlElements()
    {
        ...
    }

1
Це шалено прикрі обмеження. Я вважаю, що для багатьох випадків час для розгортання повинен бути в Initialize. Що робити, якщо всі мої тести використовують однакові допоміжні артефакти? Я думаю, я повинен копіювати та вставляти декоратори через десятки методів тестування? Смішно.
Райанман,

5

Спробувавши всі інші перелічені тут пропозиції, я все ще не міг зрозуміти, що відбувається. Нарешті я виявив, що в меню Тест / Параметри тесту не було вибрано жодного файлу налаштувань, що означало, що розгортання не було ввімкнено. Я клацнув пункт меню Тест / Параметри тесту / Вибрати файл налаштувань тесту, вибрав файл Local.TestSettings, після чого все запрацювало.


4

Не впевнений, що це точно відповідає на питання, але деяким це може допомогти. По-перше, я виявив, що прапорець "Увімкнути розгортання" повинен бути перевіреним, щоб розгортання працювало. По-друге, у документі сказано, що вихідний шлях "відносно шляху проекту", який спочатку я розумів як папку проекту. Насправді, схоже, це стосується вихідної папки складання. Отже, якщо у мене є папка проекту під назвою 'TestFiles' і файл у ній, який називається Testdata.xml, використання атрибута таким чином не працює:

[DeploymentItem(@"TestFiles\Testdata.xml")] 

Я можу позначити Testdata.xmlфайл Copy Always, щоб збірка помістила копію під вихідну папку (наприклад, Debug\TestFiles\TestData.xml). Потім механізм розгортання знайде копію файлу, розташованого за цим шляхом ( TestFiles\Testdata.xml), відносно виводу збірки. Або я можу встановити атрибут таким чином:

[DeploymentItem(@"..\\..\TestFiles\Testdata.xml")] 

і механізм розгортання знайде вихідний файл. Отож, це працює, але я помітив, що за допомогою Copy AlwaysI я часом стикаюся з тією ж проблемою, яка виникає у мене під час редагування файлу app.config у проекті - якщо я не зміню код або не змушую до відновлення, ніщо не запускає копіювання файлів, позначених на скопіювати при побудові.


Проблема для мене була відносним шляхом, і це вирішило. Я додав 2 набори операторів DeploymentItem, залежно від того, як запускались тести.
Ед Байятес,

3

У мене спочатку було вимкнено прапор розгортання. Але навіть після того, як я його ввімкнув, з якихось невідомих причин нічого, навіть цільові бібліотеки DLL, все одно не копіюватиметься. Випадково я відкрив вікно пробного запуску і вбив усі попередні прогони, і магічним чином знайшов усі потрібні мені бібліотеки DLL і файли в тестовій папці вже наступного запуску ... Дуже заплутано.


2

У мене були величезні проблеми при спробі отримати файли для розгортання - спробувавши всі наведені вище пропозиції.

Потім я закрив VS2010; перезапустив, завантажив рішення і все запрацювало. (!)

Я зробив певну перевірку; Після встановлення прапора «Увімкнути розгортання» на local.TestSetting не слід просто повторно запускати тест із вікна «Результати тесту». Потрібно видалити попередній тестовий запуск з інтерфейсу користувача, наприклад, виконавши інший тест або повторно відкривши рішення.


2

Не використовуйте DeploymentItem.

Дуже важко налаштувати правильно, і він не працював ні з моїм тестовим бігуном ReSharper, ні з рідним для MSTEST у Visual Studio 2017.

Натомість клацніть правою кнопкою миші файл даних і виберіть властивості . Виберіть Копіювати у вихідний каталог: Завжди .

Тепер у своєму тесті зробіть це. Каталог - це просто каталог файлу щодо тестового проекту. Легко.

    [TestMethod()]
    public void ParseProductsTest()
    {
        // Arrange
        var file = @"Features\Products\Files\Workbook_2017.xlsx";
        var fileStream = File.Open(file, FileMode.Open);
        // etc.
    }

Здається, це добре працює з автоматизованими системами побудови та тестування.


1

Оскільки я завжди знаходив у атрибуті DeploymentItem безлад, я розгортаю такі файли за допомогою сценарію після збірки. - Переконайтесь, що у файлах, які ви хочете скопіювати, встановлено властивість Копіювати завжди. - Змініть сценарій після побудови тестового проекту, щоб скопіювати файли з цільової папки збірки (Bin \ Debug) до місця, де їх очікує ваш тест.


1

Спробуйте це для VS2010. Тому вам не потрібно додавати DeployItems для кожного tif
Видаліть

[DeploymentItem(@"files\valid\valid_entries.txt")]  
[DeploymentItem(@"files\tif\")]  

Додайте тестову конфігурацію.
- клацніть правою кнопкою миші на вузлі рішення в провіднику рішень
- Додати -> Новий елемент ...
- Виберіть вузол Параметри тесту зліва, виберіть елемент праворуч
- Клацніть Додати

Назвіть це, наприклад TDD

Виберіть TDDпід TestMenu> Edit Testsettings.

Клацніть на Розгортання. Увімкніть його, а потім додайте потрібні файли та каталоги. Там буде шлях відносно рішення. Файли будуть розміщені. Оригінальний файл, наприклад, тут:

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate\Authority.xml  

Коли я запускаю свій модульний тест, він копіюється в

D:\Users\Patrik\Documents\Visual Studio 2010\Projects\DCArrDate\WebMVCDCArrDate\Trunk\WebMVCDCArrDate.Tests\bin\Debug\TestResults\Patrik_HERKULES 2011-12-17 18_03_27\Authority.xml  

у тестовому коді я називаю це з:

[TestMethod()]
public void Read_AuthorityFiles_And_ParseXML_To_Make_Dictonary()  
{  
  string authorityFile = "Authority.xml";  
  var Xmldoc = XDocument.Load(authorityFile);  

Не потрібно вибирати Копіювати завжди; помістити файли в тестовий проект; додати жорстко закодовані шляхи в тестовий код. Для мене це рішення працювало найкраще. Я намагався з DeploymentItem, копіювати завжди, але це було мені не до вподоби.


1

Для тих, хто вважає за краще уникати безладу DeploymentItem і застосовувати підхід, запропонований @Martin Peck (прийнята відповідь), ви можете використовувати наступний код для доступу до вмісту вбудованого ресурсу:

public string GetEmbeddedResource(string fullyQulifiedResourceName)
{
    var assembly = Assembly.GetExecutingAssembly();
    // NOTE resourceName is of the format "Namespace.Class.File.extension";

    using (Stream stream = assembly.GetManifestResourceStream(fullyQulifiedResourceName))
    using (StreamReader reader = new StreamReader(stream))
    {
        string result = reader.ReadToEnd();
    }
}

Детальніше див. У цій SO Thread


1
У мене були проблеми з Assembly.GetExecutingAssembly () під час запуску на сервері збірки -> це поверне тестовий бігун замість фактичної тестової збірки. Отримання збірки шляхом відображення її за фіксованим типом у тестовій збірці (наприклад, ваш тест-клас) вирішило це для мене.
Арно Петерс

1

Для мене першопричиною було зовсім інше: виробничим кодом, який здійснювали мої тести, було перейменування та / або видалення тестового файлу .xml, який розгортався.

Тому, коли я запускав свої тести окремо, вони проходили, але при запуску всіх разом другий та наступні тести зазнавали невдачі з помилками "файл не знайдений" (які я спочатку неправильно діагностував як DeploymentItem атрибут, який не працює).

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


1

Ми витратили багато часу на проблему розгортання елементів, щоб вирішити її також у локальному пробігу unittest та teamcity unittest. Це не легко.

Дуже хорошим інструментом для налагодження цієї проблеми є ProcessExplorer . За допомогою провідника процесів ви можете перевірити, де Visual Studio шукає елементи розгортання та внести виправлення до проекту. Просто відфільтруйте всі операції з файлами, де шлях містить ваше ім'я файлу розгортання, і ви побачите його.


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

1

Окрім атрибута Deployment, який потрібно перевірити, я виявив ще щось про атрибут DeploymentItem.

[TestMethod()]
[DeploymentItem("folder\subfolder\deploymentFile.txt")]
public void TestMethod1()
{
   ...
}

Розгортання File.txt має бути відносно файлу рішення, а не testfile.cs.

введіть тут опис зображення


Нарешті я отримав цю роботу завдяки тому, що моє джерело DeploymentItem було відносно тестового проекту. Отже, у моєму рішенні є проект "Сервіс. Тести". Там у мене є папка "FilesForTests", в якій є файли, які я хочу скопіювати. Я використовував [DeploymentItem(@"FilesForTests\MyFile.txt", "FilesForTests")]. Я думаю , що ми говоримо те ж саме?
Девід

1

Я працював над цим у VS2013. Мої висновки, щоб це працювало:

  • Копіювати у вихідний каталог слід встановити на Копіювати, якщо Новіші / Копіювати завжди: ОБОВ’ЯЗКОВО.
  • "Увімкнути розгортання" у .TestSettings: НЕ ОБОВ'ЯЗКОВО. Я працював без файлу .TestSettings взагалі.
  • Вказівка ​​папки як другого параметра: НЕОБОВ’ЯЗКОВО. Формує макет вихідної папки, чудово працює без.
  • ПРОСТОРИ в назві файлу: це спричинило мені головний біль - файл ніколи не копіювався. Видалення пробілів це виправлено. Ще не розглядав героїв втечі.

Порада, яку я також навчився важким способом: не забудьте додати цей атрибут до кожного окремого тесту. Файл копіюється у першому атрибутивному тесті в теструні, але залишається відсутнім, коли порядок тестів змінюється, і неатрибутовані тести намагаються знайти файл першим.


Спробував тут усе, перш ніж дійти до вашої відповіді, яка була останньою. Винуватець: ПРОСТОРИ В ІМЕНІ! Хороша виноска.
joelmdev

1
Використання Visual Studio 2019. Виправлено "Скопіювати, якщо новіше". Я ненавиджу "Копіювати завжди", тому що це змушує проект перебудовуватися за багатьма сценаріями, такими як налагодження або поступова збірка.
Gerardo Grignoli

Домовились. Я оновив свою відповідь, включивши Copy if Newer.
Арно Петерс

0

Моєю великою "проблемою" було те, як DeploymentItem обробляє каталоги. Я використовував двопараметричну версію, обидві як шлях до каталогу, що містить підкаталоги, які я хотів розгорнути. Я спочатку не розумів, що він копіює лише матеріали в ROOT каталогу, а не всю структуру рекурсивних папок!

Я в основному мав [DeploymentItem (@ "Foo \", @ "Foo \")] і очікував, що він розгорне мій Foo \ Bar. Мені спеціально довелося змінити його на [DeploymentItem (@ "Foo \ Bar \", @ "Foo \ Bar \")], і тепер він працює як шарм.


0

Я також стикався з подібними проблемами. У мене є всі згадані вище кроки, але все ще не везе. Я використовую VS2010. Тоді я виявив, що було обрано $ Menu> Test> Select Active Test Setting> Trace and Test impact . Він почав працювати після того, як я змінив Trace і тестував вплив на Local . Ця сторінка містить дуже винахідливу інформацію про копіювання файлів у папку результатів тестування, я також хочу додати цей досвід.

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