Testowanie - Wstęp   Udostępnij na: Facebook

Autor: Tomasz Kopacz

Opublikowano: 2010-09-17
Ostatnia aktualizacja: 2011-06-21

Żaden programista nie pisze bezbłędnego kodu. Cała sztuka polega na tym, żeby dostatecznie wcześnie wykryć problem i go poprawić wtedy, kiedy taka modyfikacja jest najtańsza. Duża część błędów pojawia się dopiero na etapie testów funkcjonalnych albo wręcz akceptacyjnych robionych przez klienta (odbiorcę danego systemu). W tym momencie powstaje dodatkowy problem powiązania błędu z developerem (czy developerami, którzy napisali daną funkcjonalność), jego weryfikacja oraz przekazanie programiście, co tak naprawdę nie działa – tak by był on w stanie powtórzyć problem i go naprawić.

W Visual Studio dostępnych jest wiele mechanizmów wspierających testowanie. Z poziomu IDE dostępne są następujące główne typy testów:

  • testy jednostkowe – sprawdzające funkcjonalność i poprawność kodu, który napisał programista;
  • testy bazy danych – odmiana testów jednostkowych, przeznaczona do testowania procedur składowanych i innych artefaktów bazodanowych;
  • testy web – w których nagrywany jest ruch pomiędzy przeglądarką a serwerem WWW;
  • testy UI – gdzie rejestrowane są operacje wykonywane przez użytkownika (kliknięcia, wprowadzenia określonych tekstów z klawiatury itp.). Można je potem użyć np. do automatyzacji testów funkcjonalnych;
  • testy obciążeniowe – symulujące olbrzymią liczbę użytkowników, którzy wykonują określone czynności. Test rejestruje także wybrane liczniki wydajności na serwerach, które obsługują daną masę żądań.

Częścią pakietu jest także specjalne narzędzie – Test Manager, który planuje i realizuje testy funkcjonalne. Test Runner przeznaczony jest do uruchamiania testów funkcjonalnych (to znaczy takich, gdzie sprawdzane jest działanie aplikacji – czy da się wykonać operacje zgodnie z założonymi scenariuszami), potrafi on gromadzić informacje automatycznie rejestrujące przebieg działania aplikacji (np. log Intellitrace pozwalający „śledzić” aplikację post factum czy zawartość logów systemowych). Można nawet nagrać plik wideo pokazujący wykonywane operacje.

Rysunek 1. Dane, jakie mogą być rejestrowane podczas realizowania testu funkcjonalnego.

Najważniejsze jest jednak to, że Test Manager automatycznie dołącza zarejestrowane informacje do zgłoszenia o błędzie. To znaczy – programista nie traci czasu na ponowne odtwarzanie błędu, a po prostu wczytuje log Intellitrace i „cofa” się w debuggerze, znajdując miejsce, które spowodowało dany problem.

Warto dodać, że Test Manager jest dostępny także jako oddzielny pakiet – bo duża część mechanizmu nagrywania czy zarządzania procesem testowania może być użyta do analizy dowolnych aplikacji – także tych napisanych w PHP, Javie, a nawet w starszych technologiach – jak Delphi. W ogóle nie jest potrzebny kod źródłowy!

W dalszych częściach tej serii poruszane będą różne zagadnienia związane z testowaniem:

  • Przegląd testów jednostkowych i jak je pisać w sposób efektywny – API do budowy testów jednostkowych w Visual Studio jest bardzo bogate. Pozwala automatycznie pobierać dane przykładowe z zewnętrznych źródeł danych. Do dyspozycji jest specjalny kontekst, gdzie można zapisać pewne dodatkowe informacje. W tym artykule omówione będą testy jednostkowe oraz inne elementy ułatwiające budowę bardziej skomplikowanych testów.
  • Testowanie baz danych - jedną z ciekawszych, a mniej znanych funkcjonalności Visual Studio są testy bazodanowe. W tym artykule omówiona będzie specjalna odmiana testu - „jednostkowy test bazodanowy” - która, analogicznie jak w przypadku tzw. Unit testów, pozwala sprawdzić funkcjonowanie logiki zapisanej w procedurach czy widokach.
  • Pex i Moles – narzędzia do automatycznego generowania testów jednostkowych – w tym artykule omówione zostaną narzędzia, które automatycznie generują testy, analizując ścieżki wykonań kodu .NET. Przetwarzają one wszystkie elementy, drzewo wywołań i inne elementy generowane przez kompilator .NET.
  • Testowanie aplikacji ASP.NET Web Forms – artykuł omawia zasady nagrywania i dostosowywania testów Web. Pokazane będzie, jak takie testy parametryzować, na co zwracać uwagę, kiedy warto na podstawie nagrania wygenerować kod w .NET (i potem go zmieniać).
  • Testowanie aplikacji ASP.NET MVC – aplikację MVC można traktować jak „normalną” stronę WWW i testować, używając testów Web. Jednak, dzięki architekturze, do części zadań można wykorzystać też testy jednostkowe. W tym artykule pokazane będzie, w jaki sposób można połączyć różne metody testowania, aby sprawdzić, czy cały portal funkcjonuje prawidłowo.
  • Wykorzystanie build serwera i testów jednostkowych do realizacji tzw. Continuous Integration i Gatedcheck-in – w artykule pokazano, jak można skonfigurować TFS i agentów, aby kod źródłowy był automatycznie kompilowany, a testy jednostkowe – uruchamiane. Dzięki temu można być pewnym, że np. kod, który znajduje się w repozytorium, spełnia podstawowe kryteria jakości.
  • Testy funkcjonalne wspierane przy użyciu Test Manager – tu omówiony zostanie przykładowy plan testów funkcjonalnych oraz sposób pracy z narzędziem Test Manager.
  • Testy interfejsu użytkownika (Coded UI Test) – w tym artykule czytelnik krok po kroku będzie prowadzony przez zarejestrowanie testu UI oraz powiązania nagranego skryptu z testem funkcjonalnym. Przedstawiony zostanie także krótko sposób automatycznego uruchamiania testu jednostkowego na testowej maszynie.
  • Rozszerzanie testów interfejsu użytkownika (Coded UI Test) – to  krótkie omówienie sposobu rozbudowy testów interfejsu użytkownika. Co prawda wbudowane mechanizmy nagrywające działają w wielu przypadkach, jednak czasami warto dodać własny „plugin”, który spowoduje, że np. pewne czynności, które wykonuje użytkownik, zostaną automatycznie sprowadzone do kilku innych, szybszych operacji. Tekst pokaże, w jaki sposób można takie dodatki budować.
  • Testy wydajnościowe – po tym artykule czytelnik będzie wiedział, w jaki sposób planować testy obciążeniowe, jakie liczniki wydajności warto uwzględniać w analizach, jak szacować potrzebny sprzęt do przeprowadzenia takich testów itp.
  • Testy obciążenia w Visual Studio - testy obciążenia pozwalają na zweryfikowanie wydajności kodu, ze względu na równoległe wywoływanie metod testy również umożliwiają sprawdzenie, czy zaimplementowana funkcjonalność działa prawidłowo w środowisku współbieżnym
  • Instalacja i wykorzystanie Lab Management do automatyzacji testów – po lekturze tego artykułu czytelnik się dowie, jak może zainstalować pełne środowisko Lab Management. Jest to specjalna konfiguracja TFS, System Center VMM, agentów „wgrywających” aplikacje czy system operacyjny, które razem pozwalają mieć do dyspozycji dynamicznie zmieniające się środowisko testowe, gdzie można zasymulować np. rozbudowaną infrastrukturę serwerową niezbędną do uruchomienia testów.
  • Test Driven Development - Test Driven Development, czyli TDD, to technika tworzenia oprogramowania sterowana przez testy.
  • Jak wykorzystać TDD w codziennym życiu - Praktyczne wykorzystanie TDD
  • Wykorzystanie TDD wraz ze wzorcem MVVM - z tego artykułu dowiesz się, jaka moc drzemie w połączeniu TDDoraz wzorca MVVM.
  • Jak testować kod z pozoru nietestowalny - artykuł opisuje sposób na przetestowanie kodu który na pierwszy rzut oka nie nadaje się do testów.