NUnit vs. MbUnit vs. MSTest vs. xUnit.net [закрито]


390

Для .NET існує досить багато фреймворків для тестування. Я знайшов це невелике порівняння функцій: http://xunit.github.io/docs/comparisons.html

Тепер я повинен вибрати найкращий для нас. Але як? Це важливо? Яке з них є найбільш перспективним доказом і має пристойний імпульс за цим? Чи варто дбати про функції? Незважаючи на те, що xUnit здається найсучаснішим і спеціально розробленим для .NET, NUnit знову схоже на те, що широко прийнято. MSTest знову інтегрований у Visual Studio ...


11
Ця таблиця порівняння застаріла за роками. Наприклад, NUnit також має Assert.Throws тощо, і все в таблиці тверджень - це старий API. Новий Assert.That (..., Is ....) вільний синтаксис є набагато приємнішим, і він існує довгий час.
Джим Купер

11
Чи знаєте ви про будь-яку більш актуальну таблицю?
бітбонк

1
Кінець 2013 року, переміщено з xUnit.net => NUnit. Також зауважте, що xUnit.NET (проект)! = XUnit (категорія, учасником якої є NUnit)
DeepSpace101

3
@Sid чому ти перейшов з xUnity.net => NUnit?
Олександр Логгер

2
Аналогічне запитання було задано у 2014 році Visual Studio 2013 MSTest проти NUnit
Майкл Фрейджім

Відповіді:


197

Я знаю, що це стара тема, але я думав, що опублікую голосування за xUnit.NET . Хоча більшість інших згаданих рамок тестування майже однакові, xUnit.NET взяв досить унікальний, сучасний та гнучкий підхід до тестування одиниць. Це змінює термінологію, тому ви більше не визначаєте TestFixtures і Tests ... Ви вказуєте Факти та Теорії свого коду, що краще інтегрується з концепцією того, що таке тест з точки зору TDD / BDD.

xUnit.NET також надзвичайно розширюється. Класи атрибутів FactAttribute та TraitAttribute не запечатані, і вони забезпечують можливість перезапису базових методів, які дають вам великий контроль над тим, як повинні бути виконані методи, які ці атрибути прикрашають. Хоча xUnit.NET за своєю формою за замовчуванням дозволяє писати тестові класи, схожі на тестові прилади NUnit, за допомогою їх методів тестування, ви взагалі не обмежуєтесь цією формою тестування одиниць. Ви можете розширити рамки для підтримки специфікацій концерну / контексту / спостереження у стилі BDD, як зображено тут .

xUnit.NET також підтримує тестування на стилі прямо з поля з атрибутом «Теорія» та відповідними атрибутами даних. Ці вхідні дані можуть завантажуватися із excel, бази даних або навіть спеціального джерела даних, такого як документ Word (шляхом розширення атрибута базових даних.) Це дозволяє використовувати велику користь на одній платформі тестування як для одиничних тестів, так і для інтеграційних тестів, які може бути величезним у зменшенні продуктових залежностей та необхідній підготовці.

Інші підходи до тестування також можуть бути реалізовані за допомогою xUnit.NET ... можливості досить необмежені. У поєднанні з іншою дуже перспективною глузливою рамкою, Moq , вони створюють дуже гнучку, розширювану і потужну платформу для автоматизованого тестування.


35
Хоча це було правдою рік тому, NUnit з тих пір додав більшість атрибутів, про які йдеться. У NUnit можна писати тести будь-яким способом.
Марк Левісон

8
Справа не стільки в тому, які атрибути доступні, скільки в тому, як їх можна використовувати. xUnit.NET був розроблений з самого початку, щоб бути надзвичайно гнучким та розширюваним фреймворком, який не замикав вас на якомусь конкретному методі тестування і не вимагає регулярного оновлення основної системи, щоб отримати новітні можливості.
jrista

9
1. Приблизно різні назви атрибутів не означатимуть суттєвого значення. 2. NUnit був розширюваним, і він продовжує бути розширюваним: 3. Параметри рядків даних для тестів підтримуються в nunit. Час тому їх підтримували в розширенні :) 4. Nunit у поєднанні з Moq створює те саме. 5. Для BDD я б сказав specflow, який легко інтегрується з багатьма рамками тестування одиниць.
graffic

8
Мені подобається звук xUnit, однак він має документацію зілчу :(
Полковник Паніка

10
xUnit не має жодної документації! наприклад: Спробуйте знайти, що Traitнасправді робить, або якщо ви можете згрупувати різні тести в рамках одного батьківського тесту (наприклад, все testsв межах a testfixture). nUnit створює чудовий ієрархічний вигляд замість плоского перегляду тестів xUnit. Плюс номенклатура не має сенсу - факти та теорія? Будь реалістичним! Це краще називати тестами та даними.
DeepSpace101

134

NUnit, мабуть, найбільше підтримується сторонніми інструментами. Це також довше, ніж інші три.

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


3
який твій топ-макет бібліотеки?
dplante

31
Мені подобається Moq, RhinoMocks теж хороший.
Олександр Ковєніков

5
Можливо, варто також перевірити Pex і Moles, частина кротів особливо корисна для глузування.
Чарльз Пракаш Дасарі

4
MSPec з FakeItEasy ... зробить тестові справи легшими для читання
Робі

5
MSpec з NSubstitute та AutoFixture - це мій вибір.
Даніель Гільгарт

108

Я б не пішов з MSTest. Хоча це, мабуть, самий майбутній доказ каркасів із Microsoft, що лежить позаду, це не найскладніше рішення. Він не буде працювати самостійно без деяких хаків. Тому важко запустити його на інший сервер побудови, крім TFS, без встановлення Visual Studio. Тестувальний візуальний студій візуальної студії насправді повільніше, ніж Testdriven.Net + будь-який інший фреймворк. Оскільки випуски цієї рамки прив’язані до випусків Visual Studio, оновлень менше, і якщо вам доведеться працювати зі старшою VS, ви прив’язані до старшого MSTest.

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

Я особисто використовую XUnit.Net або NUnit залежно від уподобань своїх колег. NUnit - найстандартніший. XUnit.Net - це найпростіший фреймворк.


36
Мене притягували ногами і кричали до цього самого висновку. Мені дуже хотілося використовувати MSTest через його інтеграцію з Visual Studio, але це теж його слабкість. Мені потрібно запустити тести на сервері збірки, що не належить Microsoft, і там я ніяк не можу встановити Visual Studio на ньому, щоб це отримати. Прикро, що Microsoft виробляє чудові інструменти, а потім робить їх майже недосяжними.
Тім Лонг

11
+1 для виклику жахливості, яка є MSTest. Зрештою, не важливо, який блок тестування блоків ви використовуєте, доки він не буде MSTest
Майк Муні

21

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

Наприклад, я використовую xUnit з MSTest. Додайте посилання на збірку xUnit.dll і просто зробіть щось подібне. Дивно, але це просто працює!

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Assert = Xunit.Assert;  // <-- Aliasing the Xunit namespace is key

namespace TestSample
{
    [TestClass]
    public class XunitTestIntegrationSample
    {
        [TestMethod]
        public void TrueTest()
        {
            Assert.True(true);  // <-- this is the Xunit.Assert class
        }

        [TestMethod]
        public void FalseTest()
        {
            Assert.False(true);
        }
    }
}

Ця методика може також працювати для NUnit, MBUnit або інших тестових рамок, згаданих в інших відповідях, але я їх не пробував.
Метт Крауч

1
ви думаєте, я міг отримати параметризовані тести для роботи з MSTest при такому підході, Метт?
DevDave

@DevDave Ні. У своєму прикладі він просто використав клас з іншої збірки. Якщо ви хочете параметризованих тестів, вам знадобиться інша рамка тестування, спеціально побудована для розширення MSTest.
zoran404

3
Suprisingly, it just works!Ви щойно викликали статичну функцію з іншої збірки. Чому ви здивовані, що це працює? Крім того, якщо вам просто потрібні твердження, чому б не використати спеціально зроблену для цього збірку?
zoran404

9

Nunit не працює добре зі змішаними проектами в C ++, тому мені довелося відмовитися


3
Я не пишаюся цією відповіддю, але я відмовився від тестування для цього проекту. Я вдався написати багато процедур перевірки для виявлення помилок під час виконання
Ерік

2
Я сподівався використати NUnit в змішаному режимі, але також вважав його неадекватним, врешті-решт я пішов на googletest, який є відмінною тестовою базою тестів C ++ та v простотою налаштування.
chillitom

8

Це не велика справа в малому / особистому масштабі, але це може стати більшою угодою швидко в більшому масштабі. Мій роботодавець є великим магазином Microsoft, але не може / не може купувати в Team System / TFS з кількох причин. В даний час ми використовуємо Subversion + Orcas + MBUnit + TestDriven.NET, і це працює добре, але отримати TD.NET було величезним клопотом. Чутливість версії MBUnit + TestDriven.NET також є великим клопотом, і наявність однієї додаткової комерційної речі (TD.NET) для правового перегляду та закупівель для обробки та управління не є тривіальною. Моя компанія, як і багато компаній, товста і задоволена моделлю підписки MSDN, і вона просто не звикла обробляти разові закупівлі для сотень розробників. Іншими словами, цілком інтегрована пропозиція країн-членів МС, хоча, безумовно, не завжди є найкращим хлібом, але, на мою думку, є значною добавкою.

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


2
ReSharper має переконливу пропозицію в цьому просторі!
Білка

7
Ваша відповідь цікава і здається суперечливою. Ви кажете, що ви великий Microsoft-магазин, але не будете використовувати TFS (у чому вся суть - ви не отримаєте переваги вертикальної інтеграції без нього) і використовуєте модель підписки MSDN, але використовуєте не -MS підхід. Я загублений, якщо чесно. На жаль, застаріла відповідь.
nicodemus13

6

Це не велика справа, перемикатися між ними досить просто. Інтеграція MSTest теж не є великою справою, просто захоплюйте testdriven.net.

Як і попередня людина, яка сказала, вибирайте насмішкуватий каркас, мій улюблений на даний момент - Moq.

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