Średni · lekcja 2

MSTest — pierwszy projekt testowy w Visual Studio

Teoria testowania (lekcja 1) staje się przydatna dopiero, gdy umiesz ją zastosować w praktyce. MSTest to wbudowane w Visual Studio narzędzie do pisania i uruchamiania testów jednostkowych dla C# — w tej lekcji napiszesz od zera aplikację konsolową (Sito Eratos...

Zacznij tutaj

Po co się tego uczymy?

Teoria testowania (lekcja 1) staje się przydatna dopiero, gdy umiesz ją zastosować w praktyce. MSTest to wbudowane w Visual Studio narzędzie do pisania i uruchamiania testów jednostkowych dla C# — w tej lekcji napiszesz od zera aplikację konsolową (Sito Eratostenesa) razem z KOMPLETNYM zestawem testów jednostkowych, dokładnie w takim stylu, jaki może pojawić się na egzaminie praktycznym.

Wprowadzenie

Teoria

Krok po kroku w Visual Studio — od zera do działających testów:

  1. Utwórz aplikację konsolową (jak w dziale Programowanie konsolowe, lekcja 1): Utwórz nowy projekt → wyszukaj Console App → nazwij ją np. SitoApp → Utwórz.
  2. Dodaj projekt testowy do TEGO SAMEGO rozwiązania: w Eksploratorze rozwiązań kliknij prawym przyciskiem na nazwę ROZWIĄZANIA (Solution, na samej górze drzewa) → Dodaj → Nowy projekt.
  3. Wyszukaj MSTest i wybierz szablon "MSTest Test Project" → Dalej → nazwij go SitoApp.Tests (konwencja: nazwa testowanego projektu + .Tests) → Utwórz.
  4. Dodaj odwołanie projektu testowego do projektu właściwego: kliknij prawym przyciskiem na SitoApp.Tests → Dodaj → Odwołanie do projektu… → zaznacz checkbox przy SitoApp → OK. Bez tego kroku klasy testowe nie "zobaczą" klas z aplikacji.
  5. Wklej kod klas Sito.cs/Program.cs do projektu SitoApp, a kod testów do SitoApp.Tests (zastępując domyślnie wygenerowany plik Test1.cs).
  6. Uruchom testy: menu Test → Uruchom wszystkie testy (albo skrót Ctrl+R, A) — otworzy się okno Eksplorator testów, gdzie każdy test pokazuje się z zielonym ✔ (przeszedł) albo czerwonym ✘ (nie przeszedł, z opisem błędu).

Zasada AAA (Arrange-Act-Assert) — każdy dobrze napisany test jednostkowy składa się z trzech kroków: Arrange (przygotuj dane wejściowe i obiekt do przetestowania), Act (wywołaj testowaną metodę), Assert (sprawdź, czy wynik jest zgodny z oczekiwaniem). Trzymanie się tej struktury sprawia, że testy są czytelne nawet miesiące po ich napisaniu.

Struktura projektu testowego w Visual Studio — testy trzyma się w OSOBNYM projekcie (np. SitoApp.Tests), który ma DODANE ODWOŁANIE do projektu z kodem właściwym (SitoApp). Dzięki temu klasy testowe "widzą" klasy produkcyjne i mogą je wywoływać.

Najważniejsze atrybuty MSTest:

  • [TestClass] — oznacza klasę zawierającą testy (rozpoznawana przez Eksplorator testów w VS).
  • [TestMethod] — oznacza POJEDYNCZY test (metoda void, bez parametrów).

Najważniejsze asercje (Assert) — "serce" każdego testu:

  • Assert.AreEqual(oczekiwany, wynik) — sprawdza, czy wartości są RÓWNE.
  • Assert.AreNotEqual(a, b) — sprawdza, czy wartości są RÓŻNE.
  • Assert.IsTrue(warunek) / Assert.IsFalse(warunek) — sprawdza wartość logiczną.
  • Assert.IsNull(wartość) / Assert.IsNotNull(wartość) — sprawdza, czy coś jest (albo nie jest) puste.
  • Assert.ThrowsException<WyjątekTyp>(() => metoda()) — sprawdza, czy wywołanie metody RZUCA oczekiwany wyjątek.
  • CollectionAssert.AreEqual(oczekiwanaLista, wynikowaLista) — porównuje CAŁE kolekcje element po elemencie.

Co warto testować: metody zwracające wartość (czy wynik jest poprawny), metody obliczeniowe, walidację danych (czy metoda poprawnie wykrywa błędne dane), funkcje rzucające wyjątki (czy rzucają go we właściwym momencie), logikę true/false. Czego NIE testujemy jednostkowo: elementów interfejsu użytkownika (przyciski, okna, kolory) — to nie jest logika, tylko wygląd (o testowaniu aplikacji z UI — patrz lekcje 3-4).

Przypadki brzegowe — dobry zestaw testów sprawdza nie tylko "typowy" przypadek, ale też granice: liczbę 0, liczby ujemne, pustą listę, największą możliwą wartość. To właśnie przypadki brzegowe najczęściej ujawniają błędy, które umykają przy zwykłym, pobieżnym sprawdzeniu.

Zobacz zależności

Schemat

Rozwiązanie (Solution)
 ├── SitoApp/                  (projekt właściwy)
 │     ├── Program.cs
 │     └── Sito.cs
 └── SitoApp.Tests/            (projekt testowy, z odwołaniem do SitoApp)
       └── SitoTests.cs

Jeden test = AAA:
  Arrange → przygotuj obiekt Sito i dane wejściowe
  Act     → wywołaj sito.WyznaczPierwsze(10)
  Assert  → CollectionAssert.AreEqual({2,3,5,7}, wynik)

Połącz z praktyką

Przykład z życia

Sito Eratostenesa to klasyczny, ponad 2000-letni algorytm znajdowania wszystkich liczb pierwszych do zadanej granicy — zamiast sprawdzać podzielność każdej liczby osobno, "przekreśla" wielokrotności kolejnych liczb pierwszych, co jest znacznie szybsze. To dobry przykład na naukę testowania, bo ma jasno określony, łatwy do zweryfikowania wynik (dla 10 zawsze powinno wyjść {2, 3, 5, 7}) i kilka naturalnych przypadków brzegowych (0, 1, liczby ujemne).