niedziela, 26 października 2008

Mocking, a co to jest? odcinek I.

W dzisiejszym programie chciałbym przybliżyć nieco bliżej technikę Mocking. Czym jest mocking, do czego służy i czy można na tym zarobić? :-)
Mock (czyt. Mok), to specjalny obiekt tworzony w celu symulowania działania wybranych obiektów Twojej aplikacji. Stosuje się go głównie w technikach wytwarzania oprogramowania sterowanego testami jednnostkowymi, czyli TDD. Taki obiekt nie posiada w swojej implementacji pełnego zachowania obiektu, który naśladuje. No bo przecież inaczej po co miałby być wogóle tworzony. Jego zadaniem jest jedynie odpowiednie, ustalone reagowanie na jego wywoałania celem szybkiego testowania zachowania szerszego fragmentu systemu.
Dla jakich obiektów mocking jest najbardziej przydatny?
  • Obiekty, których stan trudno odtworzyć
  • Obiekty, których metody trwają znaczący czas (połączenia z bazami danych, zewnętrzne źródła danych)
  • Obiekty klas, których zależności z innymi obiektami są wysokie (trudno stworzyć instancję testowanego obiektu, gdyż posiada on rozległe zależności z resztą systemu)
  • Trudno przewidzieć wynik testowanej metody w trakcie testu (np. zwróć aktualną sekundę, aktualnej minuty, aktualnej godziny...)
Najpopularniejszymi środowiskami są: RhinoMocks (http://ayende.com/projects/rhino-mocks.aspx), Moq (http://code.google.com/p/moq/) i parę innych.
Przykład. Wyobraź sobie system internetowej rezerwacji taksówek. Podstawową funkcjonalnością systemu niech będzie możliwość złożenia zamówienia na określoną godzinę, określony adres - taksówki. Ok, nadal nie widzisz związku z tym co napisałem wyżej, spokojnie :-)
Główna metoda klasy TaxiService : ITaxiService:

public class TaxiService : ITaxiService
{
public bool OrderTaxi(DateTime toDateTime, string toAddress, int clientID)
{
//logika biznesowa
}
}
zanim złoży odpowiednią dyspozycję w systemie musi sprawdzić: dostępność taksówki, czas: czy jest możliwe przybycie auta na wybraną godzinę, odnaleźć dane klienta na podstawie jego numeru ID oraz sto innych rzeczy. Proces złożenia dyspozycji w samym systemie trwa np. ok 40 sekund, a jego wynikiem wartość boolowska.
40 sekund (albo i dłużej) to zbyt długo aby przeprowadzać na takim obiekcie testy: dobry test jednostkowy powinien być wykonany możliwie szybko i niezależnie od zewnętrznych danych, tak aby jego powtarzalność była możliwie prosta.
Wykorzystanie mockingu w tym przypadku polegać będzie na stworzeniu obiektu implementującego interfejs ITaxiService. Metoda Order nie będzie w takim obiekcie przetwarzała danych, zwróci jedynie wartość true, po to abyśmy mogli dalej testować system.

Tak pokrótce można scharakteryzować całą filozofię tego podejścia. W następnym odcinku postaram się wytłumaczyć mocking w przykładzie.

0 komentarze: