Czy jest coś, co mogę zrobić w NUnit, czego nie mogę zrobić w MSTest?

To pytanie było zadawane w różnych formach na wielu różnych forach, ale, IMHO, nie udało mi się znaleźć miejsca, w którym naprawdę wyraźnie na nie odpowiedziałbym, więc przeformułuję je i zapytam jeszcze raz.

Pracuję w Sklepie Microsoft. Korzystamy z TFS, a wszyscy nasi programiści mają subskrypcje MSDN, w tym wersję Team Suite VS., więc mamy dostęp do MSTest.

Czytałem różne porównania NUnit vs. MSTest, a deweloper społeczność wydaje się w przeważającej większości wybierać NUnit. Ale podane powody nigdy nie wydają się przytłaczające lub przekonujące, przynajmniej dla naszej sytuacji. (NUnit jest aktualizowany częściej, NUnit jest szybszy, NUnit nie wymaga TFS, itp.)

Mogę używać NUnit, jeśli zechcę, ale korzystanie z oprogramowania open source bez formalnego wsparcia za nim musi być bronione. Potrzebuję dość przekonującego powodu, aby to zrobić.

Na co w zasadzie muszę odpowiedzieć, aby uzasadnić użycie NUnit zamiast MSTest jest taki: czy jest coś, co mogę zrobić w NUnit, czego nie mogę zrobić z porównywalnym wysiłkiem w MSTest?

Author: Dave Hanna, 2009-09-28

12 answers

  • NUnit zawiera atrybut [TestCase], który umożliwia implementację sparametryzowanych testów. To nie istnieje po wyjęciu z pudełka w MSTest - można to zrobić za pomocą rozszerzalności.
  • atrybut ExpectedException MsTest ma błąd, w którym oczekiwana wiadomość nigdy nie jest tak naprawdę potwierdzona , nawet jeśli jest nieprawidłowa-test przejdzie.
  • NUnit statki z twierdzeniem.Rzuca API, aby umożliwić testowanie wyjątku na określonej linii kodu zamiast całej metody. Podobna funkcja istnieje dla MSTest (zaimplementowany przez tę samą osobę, która zrobiła to dla NUnit), ale nie jest wysyłany z MSTest.
  • NUnit zawiera płynną wersję Assert API po wyjęciu z pudełka. MSTest ma rozszerzenia innych firm, które to robią, ale żadne nie są dostarczane z MSTest.
  • NUnit pozwala klasom abstrakcyjnym być urządzeniami testowymi (dzięki czemu można dziedziczyć urządzenia testowe). MsTest pozwala na to, ale ogranicza klasy abstrakcyjne do pojedynczego zestawu.
  • NUnit pozwala na testowanie klas niepublicznych (od najnowszych Wersja)
  • NUnit został stworzony wyłącznie z myślą o testach jednostkowych. MSTest został stworzony do testowania - a także trochę testów jednostkowych.
  • NUnit zawiera PNunit (uruchamianie równoległych testów z NUnit). MSTest dodał tę możliwość w Visual Studio 2010, który jest konfigurowalny za pomocą XML
 41
Author: RoyOsherove,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-29 12:27:47

Roy, kilka Twoich informacji jest nieaktualnych zwłaszcza, że dotyczy to 2010;

Nunit zawiera atrybut [TestCase], który umożliwia implementację sparametryzowanych testów. to nie istnieje w MSTest

Można to zaimplementować przy użyciu rozszerzalności testów jednostkowych w 2010 roku.

Atrybut ExpectedException MSTest ma błąd, w którym oczekiwana wiadomość nigdy nie jest tak naprawdę potwierdzona , nawet jeśli jest nieprawidłowa-test przejdzie.

Popraw to jeszcze jest

NUnit ma Assert.Rzuca API, aby umożliwić testowanie wyjątku na określonej linii kodu zamiast całej metody (możesz łatwo zaimplementować tę metodę samodzielnie)

Jim zaimplementował wersję Assert.Rzuca dla MSTest w tym samym czasie, co zrobił oryginalną implementację dla NUnit, NUnit włączył w kolejnych wydaniach, MSTest nie ma, jego nadal możliwe do wykorzystania choć.

NUnit zawiera płynną wersję Assert API (jak już wspomniano - Assert.To..)

Istnieje kilka z nich zaimplementowanych przez 3rd parties dla MSTest

NUnit jest znacznie szybszy

Zobacz komentarz Jamiego udało mu się szybciej uruchomić MSTest: -)

NUnit może uruchamiać testy w 32 i 64 bitach (MSTest uruchamia je tylko w 32 bitach IIRC)

Nie w 2010 roku budowana jest obsługa 64 bitów do środka.

NUnit pozwala klasom abstrakcyjnym być urządzeniami testowymi (dzięki czemu można dziedziczyć urządzenia testowe). MsTest nie.

To działa, ale nie w przypadku zespołów, które ograniczają jego użyteczność.

NUnit pozwala na testowanie klas niepublicznych (od najnowszej wersji)

Still there

NUnit został stworzony wyłącznie z myślą o testach jednostkowych. MSTest został stworzony do testowania - i również trochę testów jednostkowych.

Zgadza się, istnieje wiele błędnych przekonań, że MSTest jest tym samym co Nunit, ale MSTest jest uogólnionym frameworkiem.

NUnit zawiera PNunit (uruchamianie równoległych testów z NUnit). MSTest dodaje tę zdolność tylko w vs 2010

Poprawne istnieje konfiguracja XML, która pozwala kontrolować stopień równoległości.

 24
Author: Euan Garden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-27 07:57:46

NUnit ma API bogatsze . Api jest szczególnie eleganckie (płynne, nawet), na przykład

Assert.That(Is.Unique, myResults);  // assert: myResults is a collection of unique items

Jeśli widziałeśHamcrest rozszerzenia JUnit rozpoznasz ten styl.

Posiada również rosnący zestaw rozszerzeń, takich jak testowanie wydajności i excellent VS plugin .

 8
Author: serg10,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-28 16:08:36

Mogę wam wskazać kilka blogów o frustracji z MSTest:

Aby być uczciwym, ci ludzie próbują skonfigurować MSTest na serwerach zbudowanych bez TFS. Niektóre z ich problemów nie będą miały zastosowania do twojej sytuacji.

Jesteśmy przede wszystkim sklepem Microsoft i używamy TFS do kontroli źródeł. Używamy jednak TeamCity do ciągłego Integracja; nam się podoba i dość dobrze integruje się z TFS. Nigdy nie używałem MSTest; używamy NUnit od lat i nie widziałem powodu, aby zmienić.

MSTest ma mieć ścisłą integrację z pakietem Team Suite, który (skoro Twoja firma już za to zapłaciła) jest punktem na jego korzyść.

NUnit jest wyposażony w mniej blokowania dostawców i posiada bogate API. Jak zauważył serg10, twierdzenie.Ta składnia jest szczególnie potężna i elegancka.

In koniec, można pisać dobre testy jednostkowe bez wszystkich fantazyjnych funkcji. Niektóre z nich mogą nawet wejść w drogę (co jest teorią xUnit.net ). polecam, aby twój zespół ustandaryzował jeden Framework testowy; unikaj posiadania jakiegoś kodu w MSTest i innego kodu w NUnit.

Myślę, że pisanie dobrych testów jest ważniejsze niż wybór frameworków. Rozważ przeczytanie Sztuki testowania jednostkowego: z przykładami w. Net , napisanie kilku testów, a następnie sprawdzenie, czy MSTest jest adekwatne do potrzeb Twojego zespołu.

EDIT: Dodatek B Do The Art of Unit Testing zawiera kilka dobrych komentarzy na temat platformy Microsoft do testów jednostkowych. Jako przykład podaje YUnit , jak uciążliwe jest wydłużanie MSTest. Jednak autor sugeruje MSTest dla użytkowników systemu zespołowego ze względu na ścisłą integrację.

 7
Author: TrueWill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 00:56:18

Mam ładną drogę pomiędzy MsTest a NUnit. Możesz użyć frameworka MSTest do uruchomienia testu (atrybut TestClass i atrybut TestMethod dla każdego testu), ale użyj API NUnit Assert.

Po prostu zrób to:

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using Assert = NUnit.Framework.Assert;  

Teraz możesz użyć Assert.To(..) i nadal mają zautomatyzowany raport kompilacji i testów TFS. twój test może być uruchomiony w VS, TestDriven.net lub Resharper, to nie ma znaczenia, test się nie powiedzie lub przejdzie poprawnie, a wyjście awaryjne będzie zgodne z NUnit ramy.

Zobacz tutaj : http://alsagile.com/archive/2010/03/09/stop-the-war-between-nunit-and-mstest-make-them.aspx

 5
Author: Stéphane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-09 18:53:03
  1. biegacz testowy MSTest jest niedeterministyczny , co powinno wystarczyć, aby odstraszyć Cię od korzystania z niego. Nie mogę konsekwentnie uruchamiać MSTest z TFS 2010 za pomocą zintegrowanego biegacza testowego; łamie się on kilkoma różnymi komunikatami o błędach (i niekonsekwentnie) między kompilacjami projektów i między agentami kompilacji.
  2. MSTest czasami (nie konsekwentnie) pęka, ponieważ wycieka pamięć-wyjątki z pamięci nadal zdarzają się u nas, nawet w najnowszej wersji Visual Studio. Na obejście tego problemu jest straszne.
  3. mam inne drobne wątpliwości z MSTest i umieściłem na blogu kilka obejść dotyczących korzystania z MSTest w ogóle: http://www.pseale.com/blog/TFSAsYourBuildCIServerOnlyPositiveTakeaways1Of2.aspx

Znalazłem to pytanie, ponieważ przełączam nas na NUnit z MSTest, ponieważ nie możemy już ufać rezultatowi naszej budowy CI z powodu MSTest. Przejście na NUnit pozwoli nam (w końcu) zaufać, że niepowodzenie budowy CI jest prawdziwe, nie kolejna usterka MSTest. To jest prawdziwa odpowiedź -- tylko z NUnit (lub innym biegaczem testowym non-MSTest) możemy zaufać naszej budowie CI .

 2
Author: Peter Seale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-04 19:55:04

Proszę uważnie przeczytać dokumentację ExpectedExceptionAttribute, nigdzie nie stwierdzono, że testuje komunikat o wyjątku, więc nie jest to błąd, który nie został potwierdzony.

Drugim parametrem jest komunikat assert, który jest wyświetlany, gdy nie zostanie wyrzucony oczekiwany typ wyjątku, a nie oczekiwana wiadomość wyjątku. Czyli jak drugi parametr w Assert.IsTrue(warunek, wiadomość).

 2
Author: user3285954,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-28 09:13:31

Pracowałem nad pierwszą klasą wsparcia dla MSTest w TestDriven.Net 3.0. W poprzednich wersjach obsługa MSTest była bardzo podstawowa (wydawało się, że z MSTest korzysta niewiele osób).

Od TestDriven.Net 3.0 Beta 2, Istnieje dość wszechstronne wsparcie dla wszystkich atrybutów związanych z testami jednostkowymi MSTest. Istnieje nawet wsparcie dla testów opartych na danych przy użyciu atrybutu DataSource. Twoje testy będą również wykonywane z prędkością zbliżoną do NUnit!

Jeśli używasz MSTest, byłbym interesuje, czy któryś z Twoich testów jednostkowych nie powiedzie się po wykonaniu za pomocą TestDriven.Net 3.0 Beta 2 (lub nowsza).

Wypróbuj go na swoich projektach MSTest i daj mi znać, jak sobie radzisz: http://www.testdriven.net/download.aspx

Uwaga, nie obsługuje atrybutów DeploymentItem ani HostType. Możesz użyć ustawienia "Kopiuj do katalogu wyjściowego" zamiast DeploymentItem.

 1
Author: jcansdale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-06 11:30:40

Możesz zmienić kod w NUnit, ponieważ jest open source. Nie możesz tego zrobić z MSTest.

 1
Author: Mike Two,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-06 11:49:10

Zobacz http://fluentassertions.codeplex.com . możesz robić takie rzeczy jak

"ABCDEFGHI".Should().StartWith("AB").And.EndWith("HI").And.Contain("EF").And.HaveLength(9);

new[] { 1, 2, 3 }.Should().HaveCount(4, "because we thought we put three items in the 
collection"))

dtoCollection.Should().Contain(dto => dto.Id != null);

collection.Should().HaveCount(c => c >= 3);

dto.ShouldHave().AllPropertiesBut(d => d.Id).EqualTo(customer);

dt1.Should().BeWithin(TimeSpan.FromHours(50)).Before(dt2); 

Action action = () => recipe.AddIngredient("Milk", 100, Unit.Spoon);
action
   .ShouldThrow<RuleViolationException>()
   .WithMessage("Cannot change the unit of an existing ingredient")
   .And.Violations.Should().Contain(BusinessRule.CannotChangeIngredientQuanity
 1
Author: Dennis Doomen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-08 14:18:09

@Dave Hanna MS Test jest dostępny po wyjęciu z pudełka, więc jeden komponent mniej, aby martwić się o wdrażanie i aktualizowanie. Jest również zintegrowany z Visual Studio i innymi produktami firmy Microsoft.

Składnia płynna jest fajna, ale nie jest to różnica funkcjonalna, więc zignorowałbym ją. Nie wspominając o tym, że możesz mieć to samo w MS Test używając biblioteki rozszerzeń.

Wydajność. 99% wydajności testu jest kontrolowane przez testowany system, więc nawet 100% wydajności różnica między dwiema bibliotekami spowodowałaby ignorowalną ogólną różnicę w wydajności.

Open source vs. not open source: szanse, że skorzystasz z korzystania z biblioteki open source są minimalne. Wyjątkami są sytuacje, gdy zmiany są często wciągane do trunka lub gdy jest wystarczająco dużo zasobów, aby uaktualnić zmodyfikowaną gałąź.

 1
Author: user3285954,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-28 08:57:50

Można bardzo łatwo uruchomić testy NUnit na Linuksie z Mono i nie sądzę, że można to zrobić z testami dla MSTest.

 0
Author: tymtam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-13 02:21:49