Test jednostkowy, NUnit czy Visual Studio?

114

Używam programu Visual Studio (czasami resharper) do uruchomienia mojego testu jednostkowego.

Słyszałem o NUnit, ale nie wiem o nim zbyt wiele ...

Powinienem się tym przejmować? Czy może zaoferować coś lepszego niż studio wizualne?

Czy powinienem używać NUnit i dlaczego?

Tim
źródło
12
rozważ także xunit, ale cokolwiek byś nie obejrzał, sprawdź TestDriven.net
Ian Ringrose
Zobacz także stackoverflow.com/questions/707444/…
David Schmitt,
wypróbuj xunit.net. Jest to przyjemny framework do testów jednostkowych typu open source dla aplikacji .net.
Mukesh Arora

Odpowiedzi:

100

NUnit ma kilka zalet w porównaniu z testem MS

  1. Atrybut pakietu - może agregować testy i wykonywać je osobno (przydatne w przypadku dużych projektów, na przykład z szybkimi i wolnymi testami)
  2. Czytelny sposób Stwierdzenie, np Assert.AreEqual(expected, actual)vs.Assert.That(actual, Is.EqualTo(expected))
  3. NUnit ma częste aktualizacje wersji - MS-Test ma tylko jedną na wersję VS.
  4. Wiele zintegrowanych runnerów, w tym Resharper i TestDriven.NET
  5. Oczekiwane potwierdzenie komunikatu o wyjątku - można to zrobić za pomocą atrybutu w NUnit, ale należy to zrobić za pomocą Try-Catch w MS-Test
  6. [TestCase]! NUnit pozwala na sparametryzowane testy.
Elizeusz
źródło
32
Wyjątek można również potwierdzić za pomocą atrybutu w MS-Test: ExpectedExceptionAttribute.
Stefan Steinegger
9
Użyłbym NUnit z Assert.Throws <> (), ponieważ jest to zgodne z zasadą AAA, która nie jest zakończona dla sposobu atrybutu.
Oliver Hanappi
25
Numer 3 nie jest funkcją, jest problemem, a numer 5 jest w 100% fałszywy; MS Test ma atrybut ExpectedException i zawsze ma .
Randolpho,
4
@Elisha Jak sobie przypominam, celowo nie obsługiwali sprawdzania tekstu wiadomości, ponieważ tekst nie jest postrzegany jako znaczący i może być dowolny. Oznacza to, że nie wpływa na przepływ programu.
Rob Kent,
7
„# 3 to nie funkcja, to problem” - nie brzmi jak bardzo zwinny sposób myślenia ...
SamuelKDavis,
72

Z mojej obecnej perspektywy (po 8 miesiącach pracy z około 10 deweloperów średnio) Radziłbym przed użyciem MSTest z następujących powodów

  • Struktura sama w sobie jest dość powolna. Nie mam na myśli kodu testowego, który piszesz - jest pod twoją kontrolą. Mam na myśli to, że framework, na którym te testy są uruchamiane, jest powolny, niezależnie od tego, czy działa zestaw testów, pojedyncze testy itp.
  • Konieczność przechowywania pliku Test-Metadata, co zawsze prowadzi do komplikacji, gdy pracuje nad nim kilku programistów (odtwarzanie np. Metadanych itp.). Każdy inny zestaw testów nie potrzebuje pliku metadanych. Miło jest organizować testy, ale to samo można osiągnąć poprzez przestrzenie nazw, klasy i nazwy metod.
  • Wykonując ciągłą integrację, jeśli chcesz uruchamiać testy jednostkowe na maszynie kompilacji, musisz zainstalować program Visual Studio na tej maszynie.

Innymi słowy, gdybym musiał podjąć decyzję ponownie 8 miesięcy temu, prawdopodobnie wziąłbym NUnit. Mogę nie mieć zintegrowanego raportu z wynikami testów, ale programiści mieliby bardziej płynne testy.

flq
źródło
6
+1, unikaj MSTest, chyba że nie masz wyboru. Różne frameworki open source są lepsze (xUnit, NUnit, MbUnit itp.).
Brannon,
49

Oto moje doświadczenie z testem MS

  • Przeprowadzamy MS Test z około 3800 testami.
  • Wykonywanie testów trwa bardzo długo, co jest bolesne w przypadku wykonywania pojedynczych testów.
  • Wykonanie testów zajmuje około 1 GB pamięci. Nie, nie jest to spowodowane wyciekami pamięci w naszych testach. Często napotykamy OutOfMemoryExceptions.
  • Ponieważ zużywa tak dużo zasobów, zaczynamy wykonywać testy z plików wsadowych. Więc po co ta integracja?
  • Jest wadliwy i niestabilny:
    • Na przykład, jeśli usuniesz atrybut [Ignore] z testu, nie rozpozna go, ponieważ gdzieś przechowuje informacje o testach. Musisz odświeżyć listę testową, co czasami rozwiązuje problem, lub ponownie uruchomić VS.
    • Losowo nie kopiuje zestawów referencyjnych do katalogu out.
    • Elementy wdrażania (dodatkowe pliki do wykorzystania) po prostu nie działają poprawnie. Są losowo ignorowane.
  • W plikach vsmdi i testrunconfig znajdują się ukryte (niewidoczne w kodzie testu) informacje. Jeśli cię to nie obchodzi, może to nie działać.
  • Funkcjonalnie może być porównywalny do NUnit, ale jest bardzo drogi, jeśli weźmiesz pod uwagę użycie wersji VS tester.

Dodatek: Mamy teraz więcej testów, nie możemy nawet powiedzieć, ile. Nie można ich już uruchamiać w programie Visual Studio z powodu wyjątków OutOfMemoryExceptions i innych problemów z niestabilnością. Testy wykonujemy ze skryptów. Łatwo byłoby wyświetlić wyniki testów w programie Visual Studio, ale gdy rozwiązanie jest otwarte, VS ulega awarii (za każdym razem). Musimy więc przeszukać testy zakończone niepowodzeniem za pomocą wyszukiwania tekstowego. Nie ma już zalet zintegrowanego narzędzia.


Kolejna aktualizacja : używamy teraz VS 2013. Wiele się zmieniło. Po raz trzeci, odkąd zaczęliśmy, przepisali test runner MS Test. Spowodowało to wiele istotnych zmian, ale żadna nowa wersja nie robiła nic lepszego. Cieszymy się, że nie korzystaliśmy z wymyślnych funkcji MS Test, ponieważ nie wszystkie są już obsługiwane. To naprawdę wstyd. Nadal używamy skryptów do budowania i uruchamiania wszystkich testów jednostkowych, ponieważ jest to wygodniejsze. Program Visual Studio wymagał kilku minut, aby rozpocząć uruchamianie testów (czas jest mierzony po kompilacji do rozpoczęcia pierwszego testu). Prawdopodobnie naprawiają to aktualizacją i może to być specyficzny problem naszego projektu. Jednak Resharper jest znacznie szybszy podczas wykonywania tych samych testów.

Wniosek : Przynajmniej w połączeniu z Resharper, test MS jest przydatny. Mam nadzieję, że w końcu dowiedzą się, jak należy napisać program uruchamiający testy, i nie zrobią tego rodzaju przełomowych zmian, gdy następnym razem zaktualizujemy Visual Studio.

Stefana Steineggera
źródło
Niedawno zacząłem je uruchamiać bez debugowania, dzięki czemu jest znacznie szybszy i znacznie bardziej przypomina sposób, w jaki można używać NUnit, ale nadal jest fajny. Wygląda na to, że słaba wydajność jest związana z tym, że Visual Studio robi funky podczas debugowania. (To znaczy, użyj "ctrl + F5" zamiast tylko "F5" - nadal otrzymujesz przyjemną "integrację" z VS)
Arafangion,
Dobra odpowiedź, zaoszczędziłem czas
FindOutIslamNow
18

NUnit może być używany w połączeniu z Visual Studio. To ramy, a nie oddzielny program. Więc możesz się przejmować i zobaczyć, czy ci pasuje :).

tekst alternatywny http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

„Po zainstalowaniu wtyczki w menu narzędzi znajdziesz nowe podmenu”.

Więcej informacji na temat importowania można znaleźć pod adresem http://nunitit.codeplex.com/ .

Wiele można również znaleźć, używając wyszukiwania SO. W tym temacie wymieniono na przykład zalety NUnit w porównaniu ze standardowymi testami MS.

bastijn
źródło
3

NUnit współpracuje ze standardową wersją VS.

Per Erik Stendahl
źródło
1
Nie zapomnij o wersjach Visual Studios Express.
chobo2
Krok po kompilacji w projekcie zestawu testów jednostkowych - \ ścieżka \ do \ nUnit $ (TargetFileName)
Steve Gilham
1

Nie jestem pewien innych, ale NUnit zapewnia przyjemne GUI i konsolę do uruchamiania testów jednostkowych, a także możesz wygenerować raport z wyniku wykonania testu NUnit, który poda szczegóły, gdzie test się nie powiódł lub przeszedł, a także o której godzinie wziąć do testu jednostkowego

Vinay Pandey
źródło
1

NUnit to framework do testów jednostkowych, który jest również obsługiwany przez resharper. Myślę, że używasz frameworka testów jednostkowych Microsoftu, więc NUnit jest tylko alternatywą dla produktu Microsoftu;)

Oto link do strony głównej NUnit: http://nunit.org

Oliver Hanappi
źródło
więc masz na myśli, że nunit nie oferuje niczego innego niż framework do testów jednostkowych Microsoft?
Tim
Tak, zobacz mój link na przykład w moim poście (powyżej).
bastijn
Używam NUnit i tak naprawdę nie wiem o frameworku testów jednostkowych Microsoftu, więc nie mogę powiedzieć, co jest lepsze. Myślę, że jest duża szansa, że ​​na SO znajdziesz jakiś temat dotyczący różnic.
Oliver Hanappi
Zawiera kilka użytecznych konstrukcji, takich jak [TestCase] ​​do uruchamiania jednej metody testowej z różnymi argumentami, [Teoria] - do budowania bardziej rozbudowanych specyfikacji i innych. Obsługuje również bardzo ładną, płynną składnię asercji. I wreszcie, jest używany znacznie szerzej niż MSTest, więc masz większą szansę na uzyskanie wsparcia / informacji, jeśli wpadniesz w kłopoty.
Elder_george
0

W NUnit testy nie są wykonywane równolegle. Wydaje się raczej, że wszystkie testy są wykonywane w jednym wątku. W MSTest każdy test jest tworzony w osobnym wątku, co powoduje, że przebiegi są przeplatane. Dlatego jeśli test A zależy od sukcesu testu B, prawdopodobnie zakończy się niepowodzeniem, ponieważ test B prawdopodobnie zacznie działać, gdy test A jest uruchomiony.

Mourad Samy
źródło
-12

Jeśli używasz programu Visual Studio, musisz użyć NUnit do wykonywania testów jednostkowych, a jeśli używasz java (Netbeans), musisz użyć JUnit do testów jednostkowych.

Oto przykład prostego testu jednostkowego kalkulatora

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SimpleCalculator;
using NUnit.Framework;

namespace CalculatorTest
{
    [TestFixture]
    public class Class1
    {
        public Calculator _calculator;
        [TestFixtureSetUp]
        public void Initialize()
        {
            _calculator = new Calculator();
        }
        [Test]
        public void DivideTest()
        {
            int a = 10;
            int b = 2;
            int expectedValue = a / b;
            int actualvalue = _calculator.Divide(a, b);
            Assert.AreEqual(expectedValue, actualvalue,"Failure");

        }
    }
}
Nipuna Prashan
źródło
4
Oczywiście nie musisz korzystać z NUnit, to tylko framework, nikt Cię do tego nie zmusza. Możesz nawet napisać własny, jeśli się nudzisz.
HimBromBeere