Poznaliśmy już trochę teorii. Więc przyszedł czas na napisanie pierwszego testu. Napiszemy go w trzech najbardziej popularnych frameworkach służących do tego celu:

  • MSTest
  • xUnit
  • NUnit

Stwórzmy solucję o nazwie „TestingPatterns”. Będziemy ją rozbudowywać wraz z nowymi artykułami. Pierwszym projektem, służącym do naszych celów zapoznawczych z pisaniem testów będzie SimpleCalculator.

Do projektu dodamy bardzo prostą klasę Calculator:

 


namespace SimpleCalculator
{
    public class Calculator
    {
        public int Add(int a, int b) => a + b;
    }
}

Znajdować się będzie w pliku o takiej samej nazwie.

 

Rys. 1.  Struktura solucji TestingPatterns

Dla każdego z frameworków utworzymy osobny projekt z testami. Nie jest to oczywiście konieczne, w swojej aplikacji możesz korzystać z wyżej wymienionych frameworków zainstalowanych w jednym projekcie. Postąpimy w ten sposób w kolejnych artykułach związanych z narzędziami testującymi. Przez co zobaczymy oba te przypadki.

 

MSTest

Zapoznawanie z frameworkiami rozpoczniemy od MSTest. Jego zaletą jest domyślna integracja z Visual Studio. Aby dodać test dla interesującej nas metody. Wystarczy kliknąć prawym przyciskiem myszy na metodę i wybrać z menu kontekstowego opcję „Create Unit Tests”

 

Rys. 2. Opcja tworzenia testu jednostkowego w menu kontekstowym Visual Studio

Po wybraniu tej opcji z menu kontekstowego pojawi się nam następujące okno:

 

Rys. 3. Okno opcji tworzenia testu jednostkowego

W oknie Create Unit Tests mamy następujące opcje:

  • Test Framework – wybieramy wersję frameworka do testów. Domyślnie mamy dwie opcje MSTest oraz MSTestv2. Polecam wybór v2. Wersja ta ma więcej funkcjonalności.
  • Test Projekt – wybieramy projekt do którego nowy test zostanie dodany. Możemy polecić Visual Studio utworzenie nowego projektu wybierając opcję „”.
  • Name Format for Test Project – wpisujemy nazwę nowego projektu w którym będą znajdować się testy.
  • Namespace -określamy jak ma wyglądać przestrzeń nazw w nowym projekcie
  • Output File -wybieramy plik, do którego zostanie dodany test. Możemy polecić Visual Studio utworzenie nowego pliku wybierając opcję „”.
  • Name Format for Test Class – wpisujemy nazwę nowego pliku
  • Name Format for Test Method – wpisujemy nazwę testu
  • Code for Test Method – wybieramy asercję z jaką ma być utworzony

Po uzupełnieniu danych w oknie klikamy przycisk Ok. Visual Studio utworzył nowy projekt. A w nim klasę wraz z metodą testującą.

 

Rys. 4. Nowy projekt w solucji

Kod klasy CalculatorTests wygląda w następujący sposób:

 

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace SimpleCalculator.Tests
{
    [TestClass()]
    public class CalculatorTests
    {
        [TestMethod()]
        public void AddTest()
        {
            Assert.Fail();
        }
    }
}

 

Uruchommy nasz pierwszy test. Wybieramy z menu Visual Studio opcję Test -> Run->All Tests.

 

Rys. 5. Uruchamianie testów za pomocą opcji z menu Visual Studio.

W ten sposób uruchomimy wszystkie testy wykryte przez Visual Studio. Do tego celu, możemy także użyć skrótu klawiszowego Ctrl+R,A.

 

Rys. 6. Rezultat uruchomienia testów

Wygenerowany automatycznie test nie został zaliczony. Napiszmy więc nasz pierwszy prosty test:

 

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace SimpleCalculator.Tests
{
    [TestClass()]
    public class CalculatorTests
    {
        [TestMethod()]
        public void AddTest()
        {
            var sut = new Calculator();

            var result = sut.Add(1, 2);

            Assert.AreEqual(result,4,"Ehh adding method fail");
        }
    }
}

 

W tym teście popełniłem błąd w asercji, jego celem jest pokazanie komunikatu, pojawiającego się w przypadku niezaliczenia testu

 

Rys. 7. Rezultat uruchomienia testu z oczywistym błędem

Test oczywiście nie został zaliczony . W jego opisie możemy sprawdzić przyczynę problemu.
Poprawmy zatem nasz test:

 

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace SimpleCalculator.Tests
{
    [TestClass()]
    public class CalculatorTests
    {
        [TestMethod()]
        public void AddTest()
        {
            var sut = new Calculator();

            var result = sut.Add(1, 2);

            Assert.AreEqual(result, 3, "Ehh adding method fail");
        }
    }
}

 

Uruchommy ponownie test:

 

Rys. 8. Rezultat uruchomienia poprawnego testu.

Jak widzimy test został zaliczony.

 

xUnit

Zobaczymy jak analogiczny test będzie wyglądał w frameworku xUnit. Przed dodaniem nowego projektu zmieńmy strukturę solucji:

 

Rys. 9. Nowa struktura solucji

Powstał nowy katalog o nazwie FirstTests w nim znajdzie się folder Tests, w którym będą znajdować się projekty z testami napisane w różnych frameworkach.
Dodamy nowy projekt o nazwie SimpleCalculatorXunitTests.

 

Rys. 10. Okno tworzenia nowego projektu

Kolejnym krokiem jest zainstalowanie paczek z xUnit. Będziemy do tego potrzebować okna o nazwie Package Manager Console. Włączamy je wybierając z menu Visual Studio opcję View-> Other Windows-> Package Manager Console

 

Rys. 11. Uruchamiamy Package Manager Console

W konsoli służącej do instalacji paczek, należy zawsze zwracać uwagę na projekt, w którym zainstalowana będzie paczka.

 

Rys. 12. Wybór docelowego projektu dla paczki

Następnie wpisujemy w konsole następujące polecenia:

  • Install-Package xunit
  • Install-Package xunit.runner.visualstudio

Po zainstalowaniu xUnit, dodajmy referencję projektu zawierającego klasę z kodem kalkulatora. W projekcie SimpleCalculatorXunitTests klikamy prawym przyciskiem myszy na References. Następnie z menu kontekstowego wybieramy opcję Add Reference…

 

Rys. 13. Menu kontekstowe referencji projektu SimpleCalculatorXunitTests

Po wybraniu interesującej nas opcji zobaczymy okno o nazwie Pegerence Manager. Z jego lewej strony wybieramy opcję Projects. Zaznaczamy SimpleCalculator i potwierdzamy nasz wybór klikając przycisk Ok.

 

Rys. 14. Okno Reference Manager programu Visual Studio

Pozostało nam jedynie dodać plik z klasą o nazwie CalculatorTests. Oto jej kod:

 

using SimpleCalculator;
using Xunit;

namespace SimpleCalculatorXunitTests
{
    public class CalculatorTests
    {
        [Fact]
        public void ShouldAddTwoNumbers()
        {
            var sut = new Calculator();

            var result = sut.Add(1, 2);

            Assert.Equal(3, result
        }
    }
}

Assert w frameworku xUnit, ma inną strukturę metod potrzebnych do weryfikacji testów. Jednak nie przykładaj dużej wagi do nauki tych metod. Niedługo zaprezentuję narzędzia, ułatwiające budowanie asercji i zwiększające ich czytelność.

Uruchommy nasz test.

 

Rys. 15. Rezultat uruchomienia testów.

W Test Explorer nazwa testów napisanych w frameworku xUnit wygląda w następujący sposób: namespace.TestClassName.TestName
Przejdziemy teraz do ostatniego frameworka, nosi on nazwę NUnit.

 

NUnit

Analogicznie do poprzedniego przykładu, dodajmy projekt o nazwie SimpleCalculatorNUnitTests. W nim plik, zawierający klasę o nazwie CalculatorTests.

 

Rys. 16. Struktura solucji po dodaniu nowego projektu

Następnie wpisujemy w konsole Package Manager następujące polecenia:

  • Install-Package nunit
  • Install-Package NUnit3TestAdapter

Dodajemy teraz klasę CalculatorTests:

using NUnit.Framework;
using SimpleCalculator;

namespace SimpleCalculatorNUnitTests
{
    [TestFixture]
    public class CalculatorTests
    {
        [Test]
        public void ShouldAddTwoNumbers()
        {
            var sut = new Calculator();

            var result = sut.Add(1, 2);

            Assert.AreEqual(3, result);
        }
    }
}

Uruchamiamy Testy:

 

Rys. 17. Rezultat uruchomienia testów.

Jak widzimy Test Explorer wykrywa nazwy testów napisanych w Nunit w identyczny sposób jak MSTest.

 

Uruchamianie testów

Dodamy teraz do projektu SimpleCalculatorMSTests dodatkowy test:

   
        [TestMethod()]
        public void AddTwoNumbers()
        {
            var sut = new Calculator();

            var result = sut.Add(4, 5);

            Assert.AreEqual(result, 9, "Ehh adding method fail");
        }

Opcję uruchomienia wszystkich testów już poznaliśmy. Mając nawet kilka projektów z testami Visual Studio uruchomi je wszystkie:

 

Rys. 18. Uruchomienie wszystkich testów w solucji

Możemy uruchomić pojedynczy test klikając prawym przyciskiem myszy w obrębie jego „ciała” następnie z menu kontekstowego wybieramy opcję „Run Tests”

 

Rys. 19. Uruchomienie pojedynczego testu za pomocą opcji z menu kontekstowego

Gdy chcemy uruchomić wszystkie testy w klasie. Klikamy prawym przyciskiem myszy „ciało klasy” i wybieramy z menu kontekstowego „Run Tests”

 

Rys. 20. Uruchomienie testów znajdujących się w klasie za pomocą za pomocą opcji z menu kontekstowego

Mamy możliwość uruchamiania testów z poziomu Test Explorera. Klikamy prawym przyciskiem myszy na okno i wybieramy interesującą nas opcję z menu kontekstowego.

 

Rys. 21. Uruchamianie testów z poziomu Test Explorera.

Zachęcam do zapoznania się z wszystkimi opcjami Test Explorera. Chyba, że będziesz korzystał z innego narzędzia do uruchamiania testów .Osobiście przez większość czasu korzystam z ReSharper Test Runner.

 

Wybór frameworka

Każdy framework ma plusy i minusy. Możesz korzystać z jednego lub wszystkich naraz. Jednak w kolejnych wpisach będę skupiał się na xUnit, ponieważ korzystam z niego podczas codziennej pracy. Przedstawienie wszystkich frameworków zajęło by mi zbyt dużo czasu. Jeżeli chcesz korzystać z innego frameworka, to i tak polecam Ci przeczytać kolejne wpisy. Dzięki temu poznasz jakie funkcjonalności ma framework przeznaczony do pisania testów. Większość z nich jest dostępna w każdym frameworku, różnice są tylko w sposobie ich użycia. A tę wiedzę, można bardzo szybko znaleźć w internecie, jeżeli wiesz czego szukać.