NUnit vs. MbUnit vs. MSTest vs. xUnit.net [zamknięte]


390

Istnieje wiele niezajmujących frameworków dla platformy .NET. Znalazłem to małe porównanie funkcji: http://xunit.github.io/docs/comparisons.html

Teraz mam wybrać najlepszy dla nas. Ale jak? Czy to ma znaczenie? Który z nich jest najbardziej przyszłościowy i ma przyzwoity impet? Czy powinienem dbać o funkcje? Chociaż xUnit wydaje się być najbardziej nowoczesny i specjalnie zaprojektowany dla platformy .NET, NUnit znów wydaje się być tym, który jest powszechnie akceptowany. MSTest ponownie jest już zintegrowany z Visual Studio ...


11
Ta tabela porównawcza jest przestarzała. Na przykład NUnit ma również Assert.Throws itp., A wszystko w tabeli Asercje to stary interfejs API. Nowa, płynna składnia Assert.That (..., Is ....) jest znacznie ładniejsza i istnieje już od dłuższego czasu.
Jim Cooper

11
Czy znasz jakieś bardziej aktualne tabele?
bitbonk

1
Pod koniec 2013 r. Przeniesiono z xUnit.net => NUnit. Zauważ też, że xUnit.NET (projekt)! = XUnit (kategoria, której członkiem jest NUnit)
DeepSpace101

3
@Sid dlaczego przeprowadziłeś się z xUnity.net => NUnit?
Alexander Logger,

2
Podobne pytanie zadane w 2014 Visual Studio 2013 MSTest vs NUnit
Michael Freidgeim

Odpowiedzi:


197

Wiem, że to stary wątek, ale pomyślałem, że oddam głos na xUnit.NET . Podczas gdy większość innych wymienionych ram testowych jest prawie taka sama, xUnit.NET zastosował dość unikalne, nowoczesne i elastyczne podejście do testowania jednostkowego. Zmienia terminologię, więc nie definiujesz już TestFixtures i Testów ... określasz Fakty i Teorie dotyczące twojego kodu, który lepiej integruje się z koncepcją testu z perspektywy TDD / BDD.

xUnit.NET jest również WYJĄTKOWO rozszerzalny. Klasy atrybutów FactAttribute i TraitAttribute nie są zapieczętowane i zapewniają nadające się do zastąpienia podstawowe metody, które dają dużą kontrolę nad tym, w jaki sposób metody te atrybuty powinny być wykonywane. Podczas gdy xUnit.NET w swojej domyślnej formie umożliwia pisanie klas testowych, które są podobne do urządzeń testowych NUnit z ich metodami testowymi, nie jesteś ograniczony do tej formy testowania jednostkowego. Możesz dowolnie rozszerzać ramy, aby obsługiwały specyfikacje Concern / Context / Observation w stylu BDD, jak pokazano tutaj .

xUnit.NET obsługuje również testowanie w stylu dopasowania bezpośrednio po wyjęciu z pudełka dzięki swojemu atrybutowi Teoria i odpowiednim atrybutom danych. Dopasowane dane wejściowe mogą być ładowane z programu Excel, bazy danych, a nawet niestandardowego źródła danych, takiego jak dokument programu Word (poprzez rozszerzenie podstawowego atrybutu danych). Pozwala to na wykorzystanie jednej platformy testowej do testów jednostkowych i testów integracyjnych, które może być ogromny w zmniejszaniu zależności od produktu i wymaganego szkolenia.

Inne podejścia do testowania można również wdrożyć za pomocą xUnit.NET ... możliwości są dość nieograniczone. W połączeniu z inną, bardzo perspektywiczną frakcją, Moq , oba tworzą bardzo elastyczną, rozszerzalną i potężną platformę do wdrażania automatycznych testów.


35
Chociaż było to prawdą ponad rok temu, od tego czasu NUnit dodał większość omawianych atrybutów. W NUnit możesz pisać testy w obie strony.
Mark Levison,

8
Nie chodzi o to, które atrybuty są dostępne, ale o to, jak można ich używać. xUnit.NET został zaprojektowany od podstaw jako wysoce elastyczna i rozszerzalna platforma, która nie blokowała cię w żadnej konkretnej metodzie testowania i nie wymaga regularnej aktualizacji podstawowej struktury w celu uzyskania najnowszych możliwości.
jrista

9
1. Zupełnie inne nazwy atrybutów nie mają większego sensu. 2. NUnit był rozszerzalny i nadal jest rozszerzalny:? 3. Parametry wiersza danych dla testów są obsługiwane w nunit. Dawno temu były obsługiwane w rozszerzeniu :) 4. Nunit w połączeniu z Moq tworzy to samo. 5. W przypadku BDD powiedziałbym, że specflow, który łatwo integruje się z wieloma platformami testów jednostkowych.
graffic

8
Podoba mi się dźwięk xUnit, jednak ma on dokumentację Zilch :(
Pułkownik Panic

10
xUnit nie ma żadnej dokumentacji! np .: Spróbuj dowiedzieć się, co Traitnaprawdę działa lub czy możesz pogrupować różne testy w ramach testu samotnego rodzica (np. wszystkie testsw ramach a testfixture). nUnit tworzy świetny widok hierarchiczny zamiast płaskiego widoku testów xUnit. Poza tym nomenklatura nie ma sensu - fakty i teoria? Bądź realistą! Są to lepiej nazywane testami i danymi.
DeepSpace101

134

NUnit jest prawdopodobnie najbardziej obsługiwany przez narzędzia innych firm. To także trwało dłużej niż pozostałe trzy.

Osobiście nie dbam zbytnio o ramy testów jednostkowych, kpiny z bibliotek są o wiele ważniejsze (i blokują cię znacznie więcej). Wybierz jeden i trzymaj się go.


3
jaka jest twoja najlepsza fałszywa biblioteka?
dplante

31
Lubię Moq, RhinoMocks jest również dobry.
Alexander Kojevnikov

5
Warto również sprawdzić Pex i Mole, szczególnie część moli jest przydatna do kpienia.
Charles Prakash Dasari

4
MSPec z FakeItEasy ... czyniąc przypadki testowe bardziej czytelnymi
Robie

5
MSpec z NSubstitute i AutoFixture to mój wybór.
Daniel Hilgarth

108

Nie poszedłbym z MSTest. Chociaż jest to prawdopodobnie najbardziej przyszły dowód na to, że frameworki oparte są na Microsoft, nie jest to najbardziej elastyczne rozwiązanie. Nie będzie działać samodzielnie bez kilku hacków. Dlatego uruchomienie go na serwerze kompilacji innym niż TFS bez instalowania programu Visual Studio jest trudne. Tester-runner działający w studiu wizualnym jest w rzeczywistości wolniejszy niż Testdriven.Net + jakikolwiek inny framework. A ponieważ wydania tego frameworka są powiązane z wydaniami Visual Studio, jest mniej aktualizacji, a jeśli musisz pracować ze starszym VS, jesteś przywiązany do starszego MSTest.

Nie sądzę, żeby miało to duże znaczenie, z których innych frameworków korzystasz. Przełączanie się między nimi jest naprawdę łatwe.

Osobiście korzystam z XUnit.Net lub NUnit w zależności od preferencji moich współpracowników. NUnit jest najbardziej standardowym. XUnit.Net to najcieńsza platforma.


36
Ciągnęło mnie kopanie i krzyczenie do tego samego wniosku. Naprawdę chciałem użyć MSTest ze względu na jego integrację z Visual Studio, ale to także jego słabość. Muszę uruchomić testy na serwerze kompilacji innym niż Microsoft i nie ma mowy, żebym instalował na nim Visual Studio tylko po to, aby to uzyskać. Szkoda, że ​​Microsoft produkuje świetne narzędzia, a następnie czyni je prawie nieosiągalnymi.
Tim Long

11
+1 za wywołanie okropności, która jest MSTest. Ostatecznie nie ma znaczenia, z jakiego szkieletu testów jednostkowych korzystasz, tak długo, jak nie jest to MSTest
Mike Mooney

21

Rozważ uzupełnienie, a nie zastąpienie MSTest inną strukturą testową. Możesz zachować integrację Visual Studio MSTest, korzystając jednocześnie z bardziej kompleksowych ram testowych.

Na przykład używam xUnit z MSTest. Dodaj odwołanie do zestawu xUnit.dll i po prostu zrób coś takiego. O dziwo, to po prostu działa!

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);
        }
    }
}

Ta technika może również działać dla NUnit, MBUnit lub innych platform testowych wymienionych w innych odpowiedziach, ale ich nie wypróbowałem.
Matt Crouch,

1
myślisz, że przy takim podejściu mógłbym uzyskać sparametryzowane testy do pracy z MSTest, Matt?
DevDave

@DevDave Nie. W swoim przykładzie użył po prostu klasy z innego zgromadzenia. Jeśli chcesz sparametryzowanych testów, potrzebujesz innej struktury testowej, która jest specjalnie zbudowana w celu rozszerzenia MSTest.
zoran404

3
Suprisingly, it just works!Właśnie wywołałeś funkcję statyczną z innego zestawu. Dlaczego jesteś zaskoczony, że to działa? A jeśli potrzebujesz tylko stwierdzeń, dlaczego nie użyć specjalnie do tego stworzonego zestawu?
zoran404

9

Nunit nie działa dobrze z projektami w trybie mieszanym w C ++, więc musiałem go upuścić


3
Nie jestem dumny z tej odpowiedzi, ale zrezygnowałem z testów jednostkowych dla tego projektu. Postanowiłem napisać wiele procedur sprawdzania poprawności wykrywania błędów w czasie wykonywania
Eric

2
Miałem nadzieję, że użyję NUnit w trybie mieszanym, ale również uznałem, że jest on nieodpowiedni, ostatecznie zdecydowałem się na googletest, który jest doskonałą platformą do testowania jednostek C ++ i v jest łatwy do skonfigurowania.
chillitom

8

Nie jest to wielka sprawa na małą skalę / osobista, ale może szybko stać się większą transakcją na większą skalę. Mój pracodawca jest dużym sklepem Microsoft, ale z wielu powodów nie chce / nie może dokonać zakupu w Team System / TFS. Obecnie używamy Subversion + Orcas + MBUnit + TestDriven.NET i działa dobrze, ale uzyskanie TD.NET było ogromnym problemem. Wrażliwość wersji MBUnit + TestDriven.NET jest również dużym problemem, a posiadanie jednej dodatkowej komercyjnej rzeczy (TD.NET) do legalnego przeglądu i zamówień w celu obsługi i zarządzania, nie jest banalne. Moja firma, podobnie jak wiele innych firm, jest gruba i zadowolona z modelu subskrypcji MSDN i po prostu nie jest przyzwyczajona do obsługi jednorazowych zamówień dla setek programistów. Innymi słowy, w pełni zintegrowana oferta MS, choć zdecydowanie nie zawsze najlepsza z możliwych, jest moim zdaniem znaczącą wartością dodaną.

Myślę, że pozostaniemy przy obecnym kroku, ponieważ to działa i już przebrnęliśmy organizacyjnie garb, ale na pewno żałuję, że stwardnienie rozsiane nie miało atrakcyjnej oferty w tej przestrzeni, abyśmy mogli skonsolidować i nieco uprościć nasz zestaw deweloperów.


2
ReSharper ma atrakcyjną ofertę w tej przestrzeni!
Wiewiórka

7
Twoja odpowiedź jest ciekawa i wydaje się wewnętrznie sprzeczna. Mówisz, że jesteś dużym sklepem Microsoft, ale nie będziesz korzystać z TFS (o to w tym wszystkim chodzi - nie uzyskasz korzyści z integracji pionowej bez niego) i korzystasz z modelu subskrypcji MSDN, ale korzystasz -MS podejście. Szczerze mówiąc, zgubiłem się. Niestety nieaktualna odpowiedź.
nicodemus13

6

To nie jest wielka sprawa, dość łatwo się między nimi przełączać. Zintegrowanie MSTest też nie jest wielkim problemem, wystarczy pobrać testdriven.net.

Tak jak poprzednia osoba powiedziała, że ​​wybrał kpinę, moim ulubionym w tej chwili jest Moq.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.