To TDD or not TDD!?

Tak, tak! Kto wie, czy już ot, choćby w XVI wieku nie zastanawiano się nad optymalnym procesem programowania maszyn liczących. I nie tworzono podwalin pod dzisiejsze wzorce TDD, byśmy teraz z tej spuścizny korzystali. Jednak początki nie są łatwe.

Teoria

 

Po przeczytaniu pewnej, skończonej liczby tutoriali i blogowych wpisów można mieć w głowie niemały mętlik. Parafrazując:

W wannie developerki prawdziwe TDD trudniej jest utrzymać niż mydło… I o wiele trudniej znaleźć…Thank You Mr Pratchett

Również moje poszukiwania dobrych wzorców ciągle trwają… Zarzuty pod adresem czystości TDD znajduję nawet w – wydawałoby się – referencyjnych artykułach na stronach MSDN (np. tutaj  – wiem, stare, lecz wciąż na pierwszym miejscu w wyszukiwarce dla frazy ‚asp.net mvc tdd’!). Naturalnie są przydatne źródła, z których korzystam: kurs Darka Woźniaka, posty dotyczące testów u Macieja Aniserowicza i wskazane przez niego materiały do nauki. Ze swej strony mogę dorzucić kilka repozytoriów kodu, które mi pomagają i stanowią drogowskazy w budowaniu aplikacji:

  • SocialGoal bazujący na EFMVC – mimo jednak, że powołują się na korzystanie z wzorca TDD – nie wygląda na to, że to testy powodują rozwój projektu, gdyż istnieją tam w formie szczątkowej; niemniej były przydatne w etapie: „jak to ugryźć?”:)
  • nopCommerce – tutaj natomiast widać duży nacisk na testy jednostkowe, przyglądam się i uczę.

Praktyka

 

Najlepiej jednak teorię przyswajać stosując ją praktycznie, więc poniżej kilka migawek z początków mojej znajomości z testami jednostkowymi:

Podczas tworzenia nowego solution zaznaczam opcję ‚Add unit test’ – Visual Studio utworzy dodatkowy projekt, a w nim pierwszą klasę z testami – jak znalazł do zepsucia ulepszenia:)

004a

Naturalnie domyślnym jest microsoftowy mechanizm obsługi testów jednostkowych, jednak chciałbym użyć polecanego w wielu miejscach xUnit. Możemy dodać do solution nowy projekt i wyszukać szablon xUnit spośród szablonów dostępnych online:

004b

Nowo utworzony projekt będzie posiadał już zainstalowane pakiety xUnit niezbędne do tworzenia i uruchamiania testów.

Możemy jednak również dodać brakujące pakiety do istniejącego projektu z testami (w moim przypadku jest to utworzony przy starcie solution VodSearcher.Tests) za pomocą managera pakietów NuGet. Wyszukujemy pakiety xUnit:

004c

i instalujemy dwa: xUnit.net i xUnit.net [Runner: Visual Studio]. Wystarczy, że zainstalujemy je dla projektu z testami – tylko tam będą wykorzystywane.

W projekcie z testami mamy jedną klasę: HomeControllerTest. Zanim przeniesiemy ją na silnik xUnit sprawdźmy, czy testy działają. Z menu Test wybieramy opcję Window -> Test explorer i uruchamiamy testy klikając ‚Run all’. Wszystkie testy powinny się powieść:

004d

Jak użyć w klasie z testami nowo zainstalowanego xUnit? Dodajemy przestrzeń nazw Xunit i modyfikujemy kod jak poniżej. W xUnit nie musimy oznaczać klasy jako zawierającej testy, wystarczy metody testów opatrzyć atrybutem [Fact]. Potrzebna jest też korekta nazw wywoływanych metod klasy Assert – różnią się od tych microsoftowych.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using VodSearcher;
using VodSearcher.Controllers;
//using Microsoft.VisualStudio.TestTools.UnitTesting;
using Xunit;

namespace VodSearcher.Tests.Controllers
{
    //[TestClass]
    public class HomeControllerTest
    {
        //[TestMethod]
        [Fact]
        public void Index()
        {
            // Arrange
            HomeController controller = new HomeController();

            // Act
            ViewResult result = controller.Index() as ViewResult;

            // Assert
            //Assert.IsNotNull(result);
            Assert.NotNull(result);
        }
    }
}</pre>
&nbsp;
<pre>

Po ponownym uruchomieniu testów okienko Test explorera powinno znów rozjaśnić się przyjemną zielenią.

Cóż, to początki początków – zobaczymy jak będzie szło dodawanie kolejnych funkcji zaczynając od pisania do nich testów. Niewątpliwie to najbardziej rewolucyjna zmiana w myśleniu dotycząca programowania w mojej karierze.

Marcin

Dodaj komentarz