Тестові проекти NUnit vs Visual Studio 2008 для тестування одиниць? [зачинено]


254

Я буду запускати новий проект на роботі і хочу взяти участь у тестуванні. Ми будемо використовувати VS 2008, C # та речі ASP.NET MVC. Я дивлюсь на використання або NUnit, або вбудовані тестові проекти, які має VS2008, але я відкритий для дослідження інших пропозицій. Чи одна система краща за іншу чи, можливо, простіша у використанні / розумінні, ніж інша? Я хочу, щоб цей проект було створено як "найкращу практику" для наших зусиль з розвитку.

Дякуємо за будь-яку допомогу та пропозиції !!

Відповіді:


99

Даок назвав усіх професіоналів тестових проектів VS2008, ось професіонали NUnit.

  • NUnit має глузливі рамки.
  • NUnit можна запускати за межами IDE, це може бути корисно, якщо ви хочете запускати тести на сервері, що не створює MS, наприклад CC.Net
  • У NUnit виходить більше версій, ніж візуальна студія. Вам не доведеться чекати років на нову версію І вам не доведеться встановлювати нову версію IDE, щоб отримати нові функції.
  • Існують розширення, що розробляються для NUnit, як тести рядків тощо.
  • Тести Visual Studio з певних причин потребують тривалого часу. Це краще в 2008 році, але все ще занадто повільно на мій смак. Швидкий запуск тесту, щоб побачити, якщо ви щось не зламали, може зайняти занадто довго. NUnit з чимось на кшталт Testdriven.Net запускати тести з IDE насправді набагато швидше. особливо при виконанні одиничних тестів.
    Згідно з Kjetil Klaussen, це спричинене інструктором Visual Studio, який виконує тести MSTest у TestDriven.Net, робить MSTest продуктивністю порівнянною з NUnit.

19
Ви не можете просто використовувати mstest.exe для запуску тестів MSTest поза IDE?
Філіп Уеллс

13
Нуніт, що має глузуючий каркас, не є великою перевагою. Я використовував тестові проекти VS 2008 одиниці з мовою Moq, яка використовує новий підхід, використовуючи дерева виразів LINQ: code.google.com/p/moq
DSO

5
Ще один плюс для Nunit, для мене в будь-якому випадку, полягає в тому, що Resharper має дуже хороший інтерфейс користувача, який обертається навколо нього, що набагато швидше, ніж компоненти для тестування VS. Він навіть гіперпосилає стек стеження провальних тестів до вашого коду.
Джефф Путц

7
Тестування блоку включено в професійну версію VS 2008.
user179700

3
@Jeff Putz: Resharper також може запускати тести Visual Studio, навіть поза тестовим проектом.
Пол Руан

64

Рамка для тестування одиниць насправді не має великого значення, оскільки ви можете конвертувати тестові класи за допомогою окремих файлів проекту та умовної компіляції (наприклад, VS-> NUnit):

 #if! NUNIT
  використання Microsoft.VisualStudio.TestTools.UnitTesting;
 #else
  використання NUnit.Framework;
  використовуючи TestClass = NUnit.Framework.TestFixtureAttribute;
  використовуючи TestMethod = NUnit.Framework.TestAttribute;
  використовуючи TestInitialize = NUnit.Framework.SetUpAttribute;
  використовуючи TestCleanup = NUnit.Framework.TearDownAttribute;
  використовуючи TestContext = System.String;
  використовуючи DeploymentItem = NUnit.Framework.DescriptionAttribute;
 #endif

Плагін TestDriven.Net приємний і не дуже дорогий ... Маючи лише звичайний VS2008, ви повинні знайти тест зі свого тестового класу чи списку тестів. З TestDriven.Net ви можете запустити свій тест безпосередньо з класу, який ви тестуєте. Зрештою, тестовий пристрій повинен бути простим у обслуговуванні та поблизу розробника.


12
Я проголосував за це, оскільки NUnit має багатший синтаксис, ніж MSTest, це означає, що ви можете перейти від MSTest -> NUnit, але не навпаки, якщо ви ДУЖЕ обережні. Історія показує, що принаймні один з нас - це не той.
Thomas Eyde

2
Я згоден з Томасом. Це спрацює, якщо ви використовуєте найосновніші заяви твердження, але модель обмеження NUnit є дуже потужною і достатньою підставою для вибору NUnit над MSTest.
Марк

Я вважаю, що такий підхід застосовується в рамках тестів EntLib за схемою ms та практикою.
robi-y

1
@Dan Neely, якщо ви тестуєте приватних осіб, ви робите це неправильно :(
JDPeckham

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

34

Переваги / зміни рамки тестування вбудованого модуля VS2008

  1. Версія 2008 року тепер доступна в професійних виданнях (раніше вона вимагала дорогих версій VS, це лише для тестування одиниць розробників.), Що залишило багато розробників з єдиним вибором відкритих / зовнішніх рамок тестування.
  2. Вбудований API, підтримуваний однією компанією.
  3. Використовуйте ті самі інструменти для запуску та створення тестів (ви можете запускати їх, використовуючи також командний рядок MSTest)
  4. Простий дизайн (не має рамки Mock, але це відмінна відправна точка для багатьох програмістів)
  5. Довгострокова підтримка (я все ще пам’ятаю, що сталося з nDoc, я не хочу брати участь у тестуванні рамки, яка може не підтримуватися через 5 років, але я все ще вважаю nUnit чудовою основою.)
  6. Якщо ви використовуєте сервер фундації команди як бекенд, ви можете просто створювати робочі елементи або помилки з невдалим тестовим даним

4
Я думаю, що це все ще говорить про те, як Microsoft тестує те, що це НЕ в стандартній версії, лише Професійні та вище.
J Wynia

Погодьтеся, я хотів би бачити це в стандартному та вище. У експрес-версіях це буде зайвим для початківця.
Сімара

1
@J Wynia: Читання їхнього рішення включити його лише у Професійне та вище, як сказати щось про їхню думку про тестування - це занадто багато читає. Це скоріше ділове рішення, ніж філософське.
Язон

@Simara Тестування повинно бути притаманне життєвому циклу розвитку. Це повинно бути надано у експрес-виданнях.
східник

33

Я використовую NUnit вже 2 роки. Все нормально, але я мушу сказати, що система Unit у VS є досить приємною, оскільки вона знаходиться всередині Gui і може легше зробити тест на приватну функцію, не маючи возитися. Крім того, Unit Testing VS дозволяє вам покривати та інші речі, які NUnit самостійно не може зробити.


44
Ви не повинні чіпати своїх приватних осіб. Усі жартують убік, одна думка - це те, що все, що вам потрібно, - це публічні методи. Виклик усіх ваших публічних методів повинен викликати всі ваші приватні методи. Якщо приватний метод не викликається через публічний, приватний метод є зайвим.
Лівен Кірсмейкер

7
@Lieven: якщо ви протестуєте приватних осіб, хоча громадськість, ви дійсно робите тест на інтеграцію, а не одиничний тест. (Звичайно, я не речник TDD, і, мабуть, просто перевіряю публіку ... але мені здається, що я допомагаю розпочати бій)
Matthew Whited

11
@Matthew, інтеграційне тестування - це тестування двох або більше одиниць разом. Тестування приватних методів є лише величезним порушенням інкапсуляції і може призвести до крихких одиничних тестів, які потрібно змінювати щоразу, коли зміни впровадження змінюються.
Омер Раухергер

3
Ви також можете використовувати [Assembly: InternalsVisibleTo (...)] з директивою компілятора, щоб вийняти його під час створення RTM-збірки.
Ієн Галлоуей

1
Я весь час торкаюся своїх приватних осіб :) Я думаю, що є цінність у спеціальному тестуванні приватних членів, щоб уникнути накладних витрат на тестування абонентів, які вимагають багато складних налаштувань.
Crackerjack

14

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

Крім того, якщо вам не вистачає плагіна, такого як TestDriven.NET, ви не можете налагоджувати тести NUnit (або MbUnit, xUnit тощо) у середовищі Visual Studio, як це можна зробити з тестовою рамкою Microsoft VS, в яку вбудовано.


3
Ви можете налагодити тестування NUnit в Visual Studio 2005.
Jason Short

Ви також можете налагодити xunit, але не очевидно, як це налаштувати (сторінка властивостей)
annakata

1
Ви можете легко налагодити NUnit, приєднавши налагоджувач до запущеного процесу NUnit, як сказав grimus. Тут немає ніякого реального недоліку.
Енн Шусслер

1: Кількість тестів, які можна налаштувати в налаштуваннях VS - я встановив його на один. 2: Погодьтеся з вищезазначеними коментарями - можливо, але незручно, 3: Загалом, я віддаю перевагу вбудованому середовищу тестування VS.
RaoulRubin

14

Трохи поза темою, але якщо ви переходите на NUnit, я можу порекомендувати використовувати ReSharper - це додає деякі кнопки до інтерфейсу VS, які полегшують запуск та налагодження тестів всередині IDE.

Цей огляд трохи застарів, але пояснює це детальніше:

http://codebetter.com/blogs/paul.laudeman/archive/2006/08/15/Using-ReSharper-as-an-essential-part-of-your-TDD-toolkit.aspx


За допомогою додатка Gallio до R # ви також можете запустити MSTest.
Kjetil Klaussen

CodeRush ставить піктограми на тести прямо в коді, щоб ви могли запустити один тест або всі тести в класі або в просторі імен. Дивіться тут: community.devexpress.com/blogs/markmiller/archive/2009/11/16/…
Ryan Lundy

Resharper також запустить тести MSTest.
JDPeckham


11

Моя основна яловичина з тестами VS-модуля над NUnit - це тест VS, який прагне ввести купу згенерованого коду для доступу приватного члена.

Деякі можуть захотіти перевірити свої приватні методи, інші - ні, це вже інша тема.

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


11

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

У MS Test дуже багато атрибутів, скрізь - код, який робить справжні тести, - це крихітні рядки, які ви можете прочитати тут і там. Великий безлад. У nUnit код, який робить тест, просто домінує над атрибутами, як це слід робити.

Крім того, в nUnit вам просто потрібно натиснути на тести, які ви хочете запустити (лише один? Всі тести, що охоплюють клас? Збірка? Рішення?). Один клік. А вікно чисте і велике. Ви отримуєте чіткі зелені та червоні вогні. Ви справді знаєте, що відбувається за один погляд.

У VSTS список тестів застряг у нижній частині екрана, він невеликий і некрасивий. Ви повинні подивитися двічі, щоб знати, що сталося. І ви не можете запустити лише один тест (ну, я цього ще не дізнався!).

Але я можу помилятися, звичайно - я просто прочитав близько 21 публікації в блозі на тему "Як зробити простий TDD за допомогою VSTS". Я мав би прочитати більше, ви праві.

Для nUnit я прочитав один. І я TDDing того ж дня. З веселощами.

До речі, я зазвичай люблю продукти Microsoft. Visual Studio - це справді найкращий інструмент, який розробник може придбати - але управління TDD та робочими елементами в Visual Studio Team System - це насправді.

Всього найкращого. Сильвайн.


9

У мене з'явилися повідомлення про те, що "файлова структура NUnit багатша за VSTest" ... Звичайно, якщо ви віддаєте перевагу структурі файлів NUnit, ви можете використовувати це рішення іншим способом, як це (NUnit-> VS):

 #if !MSTEST
  using NUnit.Framework;
 #else
  using Microsoft.VisualStudio.TestTools.UnitTesting;
  using TestFixture = Microsoft.VisualStudio.TestTools.UnitTesting.TestClassAttribute;
  using Test = Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute;
  using SetUp = Microsoft.VisualStudio.TestTools.UnitTesting.TestInitializeAttribute;
  using TearDown = Microsoft.VisualStudio.TestTools.UnitTesting.TestCleanupAttribute;
 #endif

Або будь-яке інше перетворення ... :-) Це використання тут просто псевдонім для компілятора.


1
Я не розумію, що ви тут говорите.
PositiveGuy

немає налаштування рівня / кріплення: (або вони припускають, що ми використовуємо ctor та dtor?
JDPeckham

9

Спершу я хочу виправити неправильне твердження: ви можете запустити msTest поза візуальною студією за допомогою командного рядка. Хоча кілька інструментів CI, такі як TeamCity, мають кращу підтримку NUnit (можливо, це зміниться, коли msTest стане більш популярним). У моєму теперішньому проекті ми використовуємо обидва, і єдина велика різниця, яку ми виявили, це те, що mstest завжди працює як 32-бітний, а NUnit працює як 32-бітний або 64-бітний тест, що має значення лише в тому випадку, якщо ваш код використовує нативний код, який залежить від 32/64.


8

Я почав з MSTest, але перейшов з однієї простої причини. MSTest не підтримує успадкування методів випробувань від інших збірок.

Я ненавидів ідею написати один і той же тест кілька разів. Особливо у великому проекті, де методи тестування можуть легко потрапити до 100-х тестів.

NUnit робить саме те, що мені потрібно. Єдине, чого не вистачає у NUnit - це Visual Studio Addin, який має відображати статус червоного / зеленого (як VSTS) кожного тесту.



7

Якщо ви розглядаєте або MSTest, або nUnit, я рекомендую вам переглянути mbUnit. Мої причини такі

  1. Сумісність TestDriven.Net Нічого б'є не TestDriven.Net.ReRunWithDebugger, пов'язане з комбінацією клавіатури.
  2. Рамка Gallio. Gallio - тестовий бігун, як nUnits. Різниця лише в тому, що ви писали свої тести в nUnit, msTest, xUnit або mbUnit. Всі вони біжать.
  3. Сумісність з nUnit. Усі функції в nUnit підтримуються mbUnit. Я думаю, вам навіть не потрібно міняти свої атрибути (доведеться перевірити це), а лише свою довідку та ваги.
  4. Колекційні твердження. mbUnit має більше випадків Assert, включаючи клас CollectionAssert. По суті, вам більше не потрібно писати власні тести, щоб побачити, чи 2 збірки однакові.
  5. Комбінаторні тести. Не було б здорово, якби ви могли надати два набори даних та отримати тест на всі комбінації даних. Це в mbUnit.

Я спочатку зібрав mbUnit через його [RowTest ....] функціонал, і не знайшов жодної причини повернутися назад. Я перемістив усі свої активні тестові набори з nUnit, і ніколи не оглядався. Відтоді я перетворив дві різні команди розвитку на користь.


6

Наскільки мені відомо, в наші дні є чотири рамки для тестування одиниць з .NET

  • NUnit
  • MbUnit
  • MSTest
  • xUnit

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

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


6

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


3
Ви можете насправді обдурити Visual Studio, вручну редагуючи файли проекту та додаючи в ProjectTypeGuids значення, які він використовує для ідентифікації тестових проектів: & lt; ProjectTypeGuids> {3AC096D0-A1C2-E12C-1390-A8335801FDAB}; {FAE04EC0-301F-11D3- BF4B-00C04F79EFBC} & lt; / ProjectTypeGuids & gt;
Пол Руан

5

По суті, MSTest по суті є NUnit злегка переробленим, маючи кілька нових функцій (таких як налаштування збірки та виїзд, а не лише кріплення та рівень тесту) та відсутні деякі кращі біти (наприклад, новий синтаксис обмеження 2,4). NUnit зріліший, і більше підтримка для нього з боку інших постачальників; і звичайно, оскільки він завжди був безкоштовним (тоді як MSTest лише перетворився на Професійну версію 2008 року, до цього він був набагато дорожчим SKU), більшість проектів ALT.NET використовують його.

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


Мені подобається синтаксис контракту NUnit, але я думаю, ви повинні прочитати це стосовно атрибутів SetUpі TearDownатрибутів: jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html
Ніхто

4

З випуском в .NET 4.0 системи Код контрактів і наявністю статичної перевірки вам теоретично потрібно буде записати менше тестових випадків, і інструмент на зразок Pex допоможе визначити ці випадки. Пов’язавши це з дискусією, якщо вам потрібно менше робити тести на підрозділах, оскільки у ваших контрактах покривається хвіст, то чому б просто не продовжувати та використовувати вбудовані шматки, оскільки це одна менша залежність для управління. У ці дні я все про простоту. :-)

Дивитися також:


3

Я вважаю за краще використовувати невелику тестову рамку MS, але поки що я дотримуюся NUnit. Проблеми з МС, як правило, (для мене)

  • Спільний файл "тестів" (безглуздо), який потрібно підтримувати
  • Списки тестів викликають конфлікти з декількома розробниками / ДКС
  • Поганий інтегрований інтерфейс користувача - заплутана установка, обтяжливий вибір тесту
  • Немає хорошого зовнішнього бігуна

Caveats - Якби я тестував сайт aspx, я б обов'язково використовував MS - Якщо я розробляв соло, то й MS буде добре - Якби я мав обмежену майстерність і не зміг налаштувати NUnit :)

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


Зараз я використовую Resharper для запуску MS-тестів, тому я їх не дуже заважаю. Я віддаю перевагу CodeRush + RefactorPro, хоча ми не використовуємо тут. Можливо, у них є гідний бігун для MS Test і зараз.
Ендрю Бекер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.