w Praktyce
7 godz. 1 min · Angular · Full-stack i Programowanie
Mateusz KuleszaSenior Software Developer, Konsultant, TrenerPodstawą produktywnej pracy z angularem jest możliwość zagwarantowania że wszystko działa bez potrzeby wielokrotnego “przeklikiwania” poszczególnych ekranów. W pierwszej części kursu omawiam więc temat testów automatycznych.Już po obejrzeniu pierwszych lekcji zobaczysz dlaczego warto testować kod i jak dzięki narzędziom dostarczonym z angularem jest to proste. Zobaczysz jak testowanie automatyczne pozwoli zaoszczędzić Ci wiele godzin spędzonych na szukaniu błędów.
Za jakość aplikacji odpowiada nie tylko to czy działa ona poprawnie, ale w dużej mierze decyduje o tym dobry interfejs użytkownika oraz UX, czyli user experience. Dwie kolejne sekcje kursu poświęcone są właśnie dobremu UI oraz UX. Omawiam typowe problemy w oparciu o zasady i wskazówki specyfikacji Google Material Design - jednej z najbardziej szczegółowych specyfikacji UX. Wszystkie przykłady UI zarówno w wariantach desktopowych jak i mobilnych omówione są na przykładzie Angulara oraz obszernej biblioteki komponentów Angular Material. Zobaczysz nie tylko jak korzystając z gotowych komponentów błyskawicznie budować nowe funkcjonalności, ale przy okazji omówimy wiele praktycznych wskazówek oraz dobrych praktyk UX które warto wykorzystać w Twoich aplikacjach.
W ramach budowania interfejsów skupimy się na najmniejszych szczegółach takich jak prawidłowe zachowanie linków, przycisków oraz wskaźników przechodząc stopniowo do coraz większych elementów aplikacji takich jak nawigacja, układ strony, paski nawigacyjne czy okna dialogowe. Przy każdym etapie czeka Cię masa wskazówek, przykładów i rozwiązań typowych problemów user experience.
Jednak UX to nie tylko wygląd i zachowanie pojedynczych elementów. W ostatnich sekcjach kursu dowiesz się jak projektować bardziej złożone interakcje z użytkownikiem. Zobaczysz wieloetapowe formularze kreatora oraz dowiesz się jak zarządzać stanem aplikacji oraz różnymi źródłami danych. Pokaże Ci jak zbudować samodzielnie sortowane, filtrowane i stronicowane źródła danych oraz połączyć je z różnymi komponentami UI takimi jak listy czy datagrid.
Na koniec kursu zobaczysz jak możemy różne gotowe elementy UI połączyć w przepływ ekranów budując ścieżkę użytkownika. Zobaczysz jak prawidłowo zaprojektowane komponenty wraz z dobrze zaplanowanym UX pozwalają być niesamowicie produktywnym jednocześnie nie poświęcając jakości czy dobrej architektury aplikacji.
Jest to kurs dla osób które już pracowały z angularem i chciałyby wyjść poza pojedyncze techniki oraz poznać proces projektowania aplikacji w praktyce z uwzględnieniem najlepszych praktyk programistycznych oraz user experience. Zarówno w wariancie webowym jak i projektując pod urządzenia mobilne.
Angular 6, 7, 8+
Jak w poprzednich lekcjach zajmowaliśmy się konfiguracją uruchomieniem
testów i wygenerowaniem raportów z istniejących już testów tak
tej lekcji zajmiemy się uruchomieniem stworzeniem struktury testów
tworzenie pierwszego testu i uruchomiłem pierwszego naszego testu na
razie będzie to test które będzie testował javascriptu
bez angulara chciałbym po prostu pokazać tobie jak wygląda struktura
testów jasmine jeśli takich testów jeszcze nie widziałeś i w kolejnych
lekcjach przejdziemy już do testowania poszczególnych elementów już z uwzględnieniem
angulara czyli teraz mam uruchomiony ng test mam te nasze
trzy wygenerowane przez angulara testy i nim przejdziemy do testu chciałbym pokazać jeden
bardzo ważny plik tutaj w karma conf jest
tu skonfigurowany ja nie widzę tego pliku ale nasze testy
tak naprawdę uruchamiają plik test kropka ts
ja tutaj na chwilkę zamknę tą konsolę i co się w takim pliku znajduje
tu są zaimportowane wszystkie narzędzia w których będziemy
z którym korzystać już w angularze czyli mamy zone testing jest to mechanizm
wykrywania zmian w angularze i tutaj mamy narzędzia właśnie do wykorzystywania
tego wykrywania zmian w naszych testach mamy tak zwaną uprząż testową
czyli obiekt który jakby symuluje środowisko obsługuje
system w którym będziemy to uruchamiać no i jak wiesz angular jest
z frankiem uniwersalny mówiłaś na przeglądarce na serwerze na urządzeniach mobilnych i
tak dalej i tak dalej tak więc mamy tutaj także import z class
modułów dla środowiska na którym będziemy testować czyli jak widzisz
browser dynamic testing module bo będziemy testować aplikację przeglądarkową
czyli potrzebujemy także zaimportować wszystkie narzędzia do testowania przeglądarek i
tam się znajdują między innymi takie informacje jak obsługa zdarzeń przeglądarki obsługa dom
czy dokument object module co potrzebujemy do testowania w przeglądarce
tutaj zmienna require pochodzi z webpack'a webpack
zajmuje się właśnie zbieraniem wszystkich plików stąd kompilowanie
ich poprzez type script czy babel także inne wtyczki pluginy
pozwalające nam te setki plików które się znajdują jak widziałeś mamy właśnie
building modules on to wszystko ładnie buduje w jedną paczkę więc
require tutaj zadeklarowany tutaj w skrypcie żeby nie był to błąd i webpack
pozwala na bardzo fajną rzecz możemy pliki załączyć pojedynczo tak jak tutaj import
eksport import poszczególne jednak jak tutaj będziemy dodawać testy będziemy
ich bardzo dużo i pamiętanie o tym żeby każdy taki plik dołączyć dopisywać
do listy było bardzo męczące dlatego tutaj widzisz mam opcję znajdź
wszystkie testy i require context taka funkcja gdzie podaję jej
katalog mówię że ma rekurencyjnie wchodzić w głąb w podkatalogi
podkatalogi i wszystkie pliki które kończą się na spec kropka ts
tak jest przyjęta definicja że to jest nazwa modułu kropka spec
czyli specyfikacja opis co robi ten
moduł czyli testy jego jak widzisz to app nazywa się tutaj
zobaczmy appcomponent i ma swój plik spec
czyli komponent i spec czyli plik który opisuje go i
udowadnia testami że opis jest prawdziwy czyli że
wszystkie wyspecyfikowane funkcjonalności faktycznie działają poprawnie no i ten kontekst
pozwala załadować definicję do tych plików do po prostu obiektu kontekst i
tutaj zobacz pobieramy z tego kontekstu listę kluczy
które będą praktycznie ścieżkami do plików i
ta funkcja map wykonuje funkcje
zawartą w każdym jakby funkcję ładującą każdy plik czyli
kontekst zawiera nazwę pliku i funkcję ładującą i
to polecenie po prostu ładuje wszystkie znalezione pliki jest to bardzo wygodny
mechanizm bo jeśli utworzę jakikolwiek plik z końcówką conspect ts angular
natychmiastowo wykryje właściwie sobie karma i webpack natomiast wykryją
taki plik i jeszcze raz uruchamiam testy ale tym razem już kompilując się razem
z tym plikiem uwzględniając każde testy jest to bardzo wygodne bo możesz prostu dopisywać pisać
testy i nie musisz się zastanawiać się żeby dopisać dodać uruchomić ponownie po
prostu jeśli pojawi się taki plik będzie uwzględniony w testach i jeszcze
jedna rzecz tutaj to łoże testowe ta uprząż testowa w
której będziemy testować komponenty myśl o tym jak takie właśnie szkiełko
laboratoryjne gdzie ja mogę przyczepić zamontować przywiązać coś
co na czym będę eksperymentował i pozwala mi to bardzo precyzyjnie używać
różnych wygodnych pozwala symulować środowisko tak żeby te testy były
jak najbardziej dokładne i tu właśnie to robię zobacz uruchamiam tą uprząż testową
tak zwaną inicjalizuje testowe środowisko mówię
jaki to jest rodzaj środowiska czy to jest przeglądarka czy nie no i uruchamiam
tutaj platformę o właśnie środowiska jeśli to było przed platformą browser
platformą server platform native typu na przykład ios czy android
to właśnie tutaj konfiguruje środowisko symulowane i
tutaj po kolei ładuje testy czyli mamy tutaj plik appcomponent spec
tu jest troszkę rozbudowany o tym sobie powiemy za chwilę my zaczniemy
prościej i stworzymy własny test który powinien być załadowany
przez ten skrypt webpacka czyli tak otworzę sobie nową kartę i
wygenerujemy ng generate najprostrzą możliwą rzecz czyli klasę
po prostu klasę która będzie zwykłą klasą ecma script 6 nie będzie
miała żadnych funkcji ale do tej klasy chciałbym testy czyli zobaczymy testing
powiedzmy class tak sobie nazwę tą klasę i dopiszę spec true
żeby nam angular wygenerował po prostu pustą klasę z jednym
przykładowym pustym testem czyli tak aby w appie powstał nam plik testing
class tak jak obiecałam jest to pusta klasa która nic nie robi nie ma żadnych danych ale
spójrzmy na specyfikację na testy i teraz testy
składają się przynajmniej z describe id
i expect i teraz te funkcje describe id i
expect jak widzisz one nie są importowane one są wstrzykiwane po prostu przez jasmine
do środowiska i te testy właśnie tworzą specyfikację
tworzą asercje testowe czyli działa to
w ten sposób describe tutaj opisuje co będziemy
testować czyli opisuje w tej specyfikacji element
systemu który nazywa się testing class i w ramach tej
specyfikacji mam ileś różnych twierdzeń czyli twierdzę że testing
class tu jest jako id czyli to co testujemy testing
class powinien utworzyć instancję czyli powinna być możliwość
stworzenia takiego testing class próba utworzonia tutaj testing class nie powinna
skończyć się błędem i wewnątrz tego
twierdzenia mówię że coś powinno się stać i w środku muszę
to udowodnić czyli oczekuję że jeśli stworzę new
testing class to właśnie co i tutaj mamy funkcję
expekt pozwala nam na asercje czyli jak widzisz już tu postawię kropkę możemy
sprawdzić czy na przykład to equal czy równa się to
be czyli jest dokładnie tą wartością jest podobna
jest bliska tej wartości tu możemy zakres błędu ustawić sprawdzić czy zdefiniowana
czy może z wartością fałszywą lub rzutowalną
do fałszywej możemy napisać czy jest większy mniejszy czy jest liczbą
czy nie jest liczbą jak widzisz mamy tutaj bardzo dużo różnych opcji porównywania
oczywiście jasmine jest bardzo prostą biblioteką jeśli te funkcje okażą się do ciebie za mało
możemy stworzyć własne takie tutaj asercje
a także możesz pobrać bibliotekę typu na przykład mocha chai sinon
i tak dalej czyli możesz pobrać jeszcze dodatkowe inne biblioteki
które definiują zupełnie tutaj inny rodzaj czy więcej po prostu dostępnych porównań
asercji i specyfikacji tak jasmine jest bardzo popularny i jasmine tak się akurat składa
że jest jakby domyślną jasmine czyli describe testing class
testing class powinien to i w funkcji musimy udowodnić że
to jest czyli jeśli zrobimy to be truthy
czyli było prawdziwe no to oczywiście klasa przyrównana do wartości
true i false stworzony obiekt będzie w javascripcie prawdą i teraz
zobaczcie zapisuję plik wrócę do naszych testów i nie mamy już
3 of 3 tylko mamy 4 of 4 czyli automatycznie
wykrył nasz plik dołączył to do testów i jak widzisz
mamy teraz 4 testy jeśli otworzę sobie tutaj ten raport nasz w htmlu to
zobacz co się dzieje z tym raportem każda metoda
describe deklaruje jak widzisz nową sekcję w testach
czyli mamy testing class i każda sekcja id deklaruje
kolejny test czyli jeśli dopiszę tutaj powiedzmy id should
test
that true is truthy
czyli test jest totalnie bzdurny bo sprawdzimy czy true jest true
czyli expect true to be
truthy czy prawdę jest prawdą zapiszę
i tutaj powinno być 5 testów i nasz kolejny test dodał się tutaj
zwróć uwagę że taki zapis tworzy nam faktycznie specyfikację
jeśli dobrze nazwiesz te testy to można wydruk
po prostu z takiej specyfikacji pokazać komuś z biznesu
klientowi i zapytać czy to są funkcje których oczekiwałeś czy czegoś
tu brakuje czy aplikacja zachowuje się w poprawny sposób jest to format o którym
można na przykład rozmawiać na spotkaniu nie trzeba wchodzić w kod nie trzeba wchodzić w szczegóły tylko
mamy listę co zostało dodane do aplikacji co doszło co działa a na
przykład gdy coś się popsuje powiedzmy zrobię sprawdzę że false nie jest prawdziwe
tu mamy błąd i w naszej specyfikacji jak zobaczę spec list
to mogę zobaczyć też co się udało co się nie udało wiem że testing class
should test i to jest ostatnie nieprawdziwe
są też różne inne raporty i muszę to dużo lepszy ładniejszy sposób zaprezentować
tutaj na przykład na czerwono na zielono generalnie jeśli
rozumiesz o co mi chodzi chodzi o to żeby specyfikacja była faktycznie listą
twierdzeń o naszej aplikacji żeby ona potrafi zrobić to to to i tamto natomiast
ta specyfikacja nie jest tak na papierze dokumentem który może mówić
sobie wszystko ta specyfikacja faktycznie zawiera tutaj dowody czyli
testy kod który udowadnia że to co jest podane u góry jest prawdą
okej to jakby podstawa testów
w jasmine jeśli pisałeś już testy w jakimś innym tak pewnie widzisz podobieństwo że
mamy tą deklaracje jakiegoś modułu i piszemy asercje czyli piszemy o
to co nasza funkcja co nasz moduł potrafi i w każdej z tych asercji
udowadniamy że to jest prawda czyli podstawiamy jakąś wartość
na przykład wynik działania aplikacji i sprawdzamy
czy wartość którą zwróci aplikacja jest taka jak oczekiwana i w ten
sposób będziemy pisać testy ale będziemy je uwzględniać w tych testach poszczególne
metody poszczególne elementy funkcje angulara tak jak komponenty klasy
dyrektywy abyśmy mogli pracować w formacie tdd
test driven development ale o tym wszystkim już w kolejnych lekcjach tak więc do zobaczenia