Średni · lekcja 4
Testy jednostkowe w aplikacji mobilnej .NET MAUI
Częste pytanie uczniów: "czy telefon w ogóle da się testować automatycznie, skoro to co innego niż komputer?" Odpowiedź jest zaskakująco prosta: TAK, i to dokładnie w ten sam sposób co w WPF — bo testy jednostkowe nigdy nie testują "telefonu" ani "ekranu", tyl...
Zacznij tutaj
Po co się tego uczymy?
Wprowadzenie
Teoria
Krok po kroku — ta sama biblioteka Logika, dwa projekty UI. Struktura jest identyczna jak w WPF (lekcja 3), z JEDNĄ ważną różnicą: biblioteka Logika musi być ZWYKŁĄ "Biblioteką klas (.NET)", NIE specjalną biblioteką klas .NET MAUI — dzięki temu projekt testowy MSTest może się do niej odwołać bez instalowania całego środowiska MAUI.
- W rozwiązaniu z projektem .NET MAUI dodaj (jeśli jeszcze nie istnieje) bibliotekę
KalkulatorApp.Logikajak w lekcji 3: prawym przyciskiem na ROZWIĄZANIE → Dodaj → Nowy projekt → "Biblioteka klas (.NET)" → Utwórz. - Podepnij ją do projektu MAUI: prawym przyciskiem na projekt MAUI → Dodaj → Odwołanie do projektu… → zaznacz bibliotekę Logika → OK.
- Dodaj projekt testowy MSTest (Dodaj → Nowy projekt → "MSTest Test Project") z odwołaniem TYLKO do biblioteki Logika (nie do projektu MAUI).
- Uruchom testy przez Test → Uruchom wszystkie testy — zauważ, że w ogóle NIE musisz uruchamiać emulatora Androida ani podłączać telefonu, żeby zobaczyć wynik testów.
Kluczowa teza tej lekcji: JEDEN zestaw testów działa zarówno dla WPF, jak i dla MAUI — pod warunkiem, że w obu projektach logika biznesowa została wydzielona do osobnej biblioteki klas (jak w lekcji 3), niezależnej od konkretnego frameworka UI. Testy MSTest "patrzą" wyłącznie na kod w tej bibliotece — nie wiedzą i nie muszą wiedzieć, czy nad nią stoi WPF (Windows), MAUI (Android/iOS) czy jakikolwiek inny interfejs.
Dlaczego to działa technicznie? Biblioteka klas z czystą logiką C# (bez odwołań do Microsoft.Maui ani do WPF) kompiluje się do zwykłej biblioteki .NET, uruchamialnej WSZĘDZIE, gdzie działa .NET — łącznie z projektem testowym uruchamianym na Twoim komputerze, BEZ potrzeby emulatora Androida czy prawdziwego telefonu. To ogromna oszczędność czasu: testy logiki wykonują się w ułamku sekundy, podczas gdy uruchomienie emulatora mobilnego trwa dziesiątki sekund.
Struktura projektu MAUI z warstwą testowalną — analogicznie do WPF: NazwaAplikacji (projekt .NET MAUI z widokami XAML, uruchamiany na urządzeniu/emulatorze), NazwaAplikacji.Logika (biblioteka klas, WSPÓLNA i identyczna niezależnie od platformy), NazwaAplikacji.Tests (projekt MSTest z odwołaniem do biblioteki Logika).
Co jest SPECYFICZNE dla MAUI, a co NIE podlega testom jednostkowym — funkcje takie jak GPS, powiadomienia lokalne czy dostęp do plików urządzenia (poznane w dziale Aplikacje mobilne) korzystają z API SPECYFICZNYCH dla platformy (Android/iOS) — tych NIE testuje się jednostkowo (wymagałoby to prawdziwego urządzenia lub emulatora — to już domena testów integracyjnych/manualnych). Natomiast logika, która PRZETWARZA dane z tych źródeł (np. "czy podana lokalizacja mieści się w promieniu 5 km od celu", "czy termin w terminarzu koliduje z innym") — TO JUŻ zwykła logika biznesowa, w pełni testowalna jednostkowo, tak jak każda inna metoda.
Walidacja wejścia w UI a czysta logika — jeśli pole formularza w MAUI (Entry) jest puste albo zawiera tekst zamiast liczby, walidację najlepiej wykonać w oddzielnym helperze (klasie pomocniczej), a nie bezpośrednio w code-behind strony — dzięki temu również walidacja staje się testowalna, mimo że jej WYNIK wyświetlany jest w interfejsie mobilnym.
Zobacz zależności
Schemat
Rozwiązanie z DWOMA platformami UI, JEDNĄ wspólną logiką:
KalkulatorApp.WPF/ KalkulatorApp.Maui/
(Windows, XAML WPF) (Android/iOS, XAML MAUI)
│ │
└──────────┬─────────────────┘
▼
KalkulatorApp.Logika/ ← WSPÓLNA biblioteka klas
LogikaKalkulatora.cs (bez odwołań do WPF ani MAUI)
▲
│
KalkulatorApp.Tests/ ← TEN SAM zestaw testów MSTest
LogikaKalkulatoraTests.cs działa dla OBU platform UI
Połącz z praktyką
Przykład z życia
Wyobraź sobie aplikację bankową dostępną zarówno jako program na komputer (WPF), jak i aplikacja mobilna (MAUI) — reguła "opłata za przelew zagraniczny wynosi 1,5% kwoty, minimum 10 zł" MUSI działać IDENTYCZNIE na obu platformach. Firmy piszące taką logikę RAZ w wspólnej bibliotece i testując ją RAZ zestawem testów jednostkowych, mają pewność, że reguła jest spójna wszędzie — zamiast pisać (i osobno testować) tę samą logikę dwa razy, z ryzykiem rozjazdu między wersją desktopową a mobilną.