Podejście TDD w Javie. Testowanie, SOLID i architektura heksagonalna jako fundamenty wysokiej jakości - Alan Mellor

Kup książkę

79.00 zł
48.18 zł (47,40 zł najniższa cena z 30 dni)

-
Proszę czekać

O autorze

Alan Mellor jest liderem w Akademii BJSS, gdzie szkoli następne pokolenie inżynierów oprogramowania w branży doradczej, a także autorem książki Java OOP Done Right: Create object oriented code you can be proud of with modern Java. Alan zaczynał swoją przygodę z komputerami od modelu Sinclair ZX81 z 1 kB pamięci RAM i bardzo się cieszy, że teraz ma do dyspozycji lepsze urządzenia. Jego praca obejmuje sterowanie przemysłowe w języku C, aplikacje internetowe dla handlu elektronicznego, branży gier i bankowości w Javie i Go, a także magazynowanie dokumentów w C++. Do kodu jego współautorstwa, który cieszy się największą rozpoznawalnością, należy gra Bounce na telefon Nokia oraz symulator lotu dla Red Arrows, Zespołu Akrobacyjnego Królewskich Sił Powietrznych Wielkiej Brytanii - jeżeli sięgniemy pamięcią wystarczająco daleko.

Chcę podziękować mojej żonie, Stephanie. Bez Twojego wsparcia ta książka by nie powstała. Jestem wdzięczny każdemu, kto uczył mnie inżynierii oprogramowania - czy to osobiście, czy za pośrednictwem książek. Z wyrazami miłości dla Jake'a i Katy. Jesteście wspaniali.

O recenzentach

Jeff Langr zawodowo tworzy oprogramowanie od ponad 40 lat. Jest uznanym autorem pięciu książek na temat programowania, włączając w to Modern C++ Programming with Test-Driven Development: Code Better, Sleep Better, Agile in a Flash: Speed-learning Agile Software Development (z Timem Ottingerem) oraz Agile Java. Jeff wniósł również swój wkład do bestsellerowej książki Czysty kod. Podręcznik dobrego programisty Roberta C. Martina. Napisał ponad setkę opublikowanych artykułów i jeszcze więcej postów na swoim blogu (https://langrsoft.com).

Nikolai Avteniev rozpoczął karierę w JPMorgan Chase, uczestniczył w projekcie Extreme Programming Pilot i nauczył się, w jaki sposób stosować programowanie sterowane testami oraz ciągłą integrację. Po ukończeniu informatyki na Uniwersytecie Nowojorskim stworzył zwinny zespół programistyczny i kierował nim w firmie Real Time Risk Systems jako jeden z jej inżynierów-założycieli. Później Nikolai dołączył do Intent Media, nowojorskiego start-upu z branży technologii reklamowych, a następnie zaczął budować zespoły programistyczne i systemy na portalu LinkedIn (https://engineering.linkedin.com/blog/2017/08/getting-to-know-nikolai-avteniev).

Ponadto Nikolai prowadzi zajęcia z inżynierii oprogramowania na uczelni City University of New York. Aktualnie pracuje w firmie Stripe, pomagając jej bezpiecznie zwiększyć udział gospodarki cyfrowej w światowym PKB.

Wprowadzenie

Rozwój nowoczesnego oprogramowania jest napędzany przez to, że użytkownicy oczekują, iż nowe funkcjonalności będą wprowadzane szybko i pozbawione defektów. To ogromne wyzwanie. Pojedynczy programiści ustąpili miejsca zespołom deweloperskim, które wspólnie rozwijają jeden produkt. Funkcjonalności są dodawane w krótkich iteracjach, a wdrażanie nowych wersji na produkcję następuje często - czasem wręcz codziennie.

Osiągnięcie tego poziomu wymaga mistrzostwa w dziedzinie tworzenia oprogramowania. Trzeba zagwarantować, że system jest zawsze gotowy do wdrożenia i że nie zawiera defektów w momencie wypuszczenia na produkcję. Innym członkom zespołu musi się łatwo pracować ze zrozumiałym i bezpiecznym do zmieniania kodem. Gdy zespół dokonuje zmian, musi mieć pewność, że nowe funkcjonalności działają poprawnie i nie psują istniejących.

Ta książka przedstawia sprawdzone techniki, które pomagają osiągnąć ten cel.

Programowanie sterowane testami (ang. Test-Driven Development, TDD), zasady SOLID i architektura heksagonalna umożliwiają programistom projektować kod, o którym wiadomo, że działa oraz że łatwo się z nim pracuje. Programowanie skupia się na fundamentalnych zasadach inżynierii oprogramowania. Te praktyki stanowią podstawę kodu, który można bezpiecznie zmieniać i który jest zawsze gotowy do wdrożenia.

Ta książka pokaże Ci, jak pisać dobrze zaprojektowany i przetestowany kod. Uzyskasz pewność, że kod działa dokładnie tak, jak myślisz, iż powinien. Będziesz dysponować nieustannie rosnącym zestawem szybkich testów czuwających nad całą bazą kodu w trakcie jej modyfikowania przez zespół. Nauczysz się, jak uporządkować kod, aby uniknąć trudności spowodowanych systemami zewnętrznymi, takimi jak systemy obsługi płatności i bazy danych. Ograniczysz zależność od wolniejszych form testowania. Będziesz pisać wyższej jakości kod, umożliwiający ciągłe dostarczanie.

Nowoczesne oprogramowanie wymaga nowoczesnego podejścia do jego rozwoju. Dzięki tej książce opanujesz techniki, które do takiego podejścia należą.

Dla kogo jest ta książka?

Ta książka jest przeznaczona głównie dla programistów zaznajomionych z podstawami Javy, którzy pragną skutecznie pracować w ramach wysoko wydajnych zespołów zwinnych. Opisane tutaj techniki umożliwiają dostarczanie na produkcję kodu z niewielką liczbą błędów oraz zapewniają strukturę, którą można łatwo i bezpiecznie zmieniać. To techniczna podstawa zwinności.

Początkowe rozdziały są użyteczne również dla liderów biznesowych, którzy chcą zrozumieć koszty i korzyści powiązane z prezentowanym podejściem przed jego wyborem.

Co obejmuje ta książka?

Rozdział 1. "Dlaczego potrzebujemy TDD?" wyjaśnia korzyści płynące z TDD i tłumaczy, jak doszło do powstania tej metodyki.

Rozdział 2. "TDD w służbie dobrego kodu" omawia niektóre ogólne praktyki pomocne w tworzeniu dobrze zaprojektowanego kodu w połączeniu z TDD.

Rozdział 3. "Obalamy mity na temat TDD" zawiera przegląd częstych zastrzeżeń wysuwanych przeciwko TDD oraz sugestie odpowiedzi na nie. Ten rozdział jest odpowiedni dla liderów biznesowych, którzy mają opory przed wprowadzeniem nowej techniki do procesu tworzenia oprogramowania.

Rozdział 4. "Tworzymy aplikację z użyciem TDD" pokazuje konfigurację środowiska programistycznego do budowy aplikacji Wordz z użyciem TDD. Prezentuje, jak pracować w krótkich iteracjach w oparciu o historyjki użytkownika.

Rozdział 5. "Piszemy pierwszy test" wprowadza podstawy TDD w postaci wzorca przygotowania, działania i asercji. Pisząc pierwszy test i kod produkcyjny do gry Wordz, przyjrzymy się dokładnie, w jaki sposób TDD wspomaga projektowanie przed tworzeniem kodu. Rozważymy różne opcje oraz ich zalety i wady, a następnie uchwycimy te decyzje w teście.

Rozdział 6. "Rytm pracy w TDD" demonstruje użycie cyklu czerwone, zielone i refaktoryzacja w praktyce. Wybieramy następny test do napisania, patrzymy, jak kończy się niepowodzeniem, sprawiamy, że przechodzi, a następnie poprawiamy kod, aby zespół mógł z nim bezpiecznie i łatwo pracować w przyszłości.

Rozdział 7. "TDD i SOLID wspierają projektowanie" bazuje na poprzednich rozdziałach i pokazuje, jak TDD zapewnia szybkie informacje zwrotne na temat decyzji projektowych. Wprowadza też zasady SOLID, które stanowią użyteczny zestaw wytycznych pomagających projektować kod obiektowy. Ten rozdział stanowi przegląd tych zasad, dzięki czemu będziemy je mogli zastosować w pozostałej części książki.

Rozdział 8. "Zamienniki testowe - zaślepki i atrapy" wyjaśnia dwie istotne techniki, które pozwalają podmieniać komponenty trudne do testowania. Dzięki temu więcej kodu możemy przetestować testami jednostkowymi w ramach TDD, co ogranicza potrzebę stosowania wolniejszych testów integracyjnych.

Rozdział 9. "Architektura heksagonalna - oddzielenie systemów zewnętrznych" przedstawia potężną technikę projektowania, która umożliwia pełne odseparowanie systemów zewnętrznych, takich jak bazy danych i serwery WWW od kodu logiki. Poznasz pojęcia portu i adaptera. Uproszczą one użycie TDD i zapewnią odporność na zmiany wymuszane przez czynniki zewnętrzne.

Rozdział 10. "Testy FIRST i piramida testów" przedstawia piramidę testów jako sposób myślenia o różnych rodzajach testów potrzebnych do pełnego przetestowania oprogramowania. Omawiamy testy jednostkowe, integracyjne i przekrojowe, a także zalety i wady każdego z tych rodzajów.

Rozdział 11. "TDD jako część zapewnienia jakości" analizuje, jak użycie zaawansowanej automatyzacji testów opisanej w tej książce zwalnia inżynierów zapewnienia jakości z niektórych żmudnych zajęć testowych. W tym rozdziale zrozumiesz, że testowanie w tworzeniu oprogramowania jest zadaniem całego zespołu, oraz dowiesz się, jak najlepiej połączyć różne umiejętności.

Rozdział 12. "Testy na początku, później czy nigdy?" stanowi przegląd różnych podejść do wyboru momentu i miejsca rozpoczęcia testowania. Dokonane spostrzeżenia pomogą zwiększyć jakość testów tworzonych w ramach TDD.

Rozdział 13. "Tworzenie warstwy domeny" pokazuje, jak zastosować TDD, zasady SOLID, piramidę testów i architekturę heksagonalną do tworzenia warstwy domeny gry Wordz. W połączeniu te techniki umożliwiają włączenie większości logiki aplikacji w zakres testów jednostkowych.

Rozdział 14. "Tworzenie warstwy bazodanowej" zapewnia wskazówki dotyczące pisania kodu adaptera, który umożliwia połączenie się z bazą danych PostgreSQL wykorzystywaną w aplikacji. Istnienie adaptera umożliwia oddzielenie kodu domeny od kodu związanego z bazą danych. Ponownie zaczynamy pracę od utworzenia testów, tym razem integracyjnych, napisanych z użyciem frameworku testowego DBRider. Dostęp do danych implementujemy dzięki bibliotece JDBI.

Rozdział 15. "Tworzenie warstwy sieciowej" jako ostatni rozdział stanowi podsumowanie, ale również wyjaśnia, w jaki sposób pisać punkty dostępowe REST API do komunikacji po protokole HTTP. Dzięki temu uczynimy z gry Wordz usługę sieciową. Ten etap również przeprowadzimy metodą zaczynania pracy od testów, ale tym razem będą to testy integracyjne wykorzystujące bibliotekę Molecule. Po ukończeniu tego etapu nareszcie połączymy wszystkie komponenty w mikrousługę gotową do uruchomienia jako całość.

Jak wynieść z tej książki możliwie najwięcej?

Książka zakłada znajomość podstaw nowoczesnej Javy oraz umiejętność pisania krótkich programów z użyciem klas, a także wyrażeń lambda z Javy 8 i słowa kluczowego var z Javy 11. Oczekuje również umiejętności instalowania oprogramowania pobieranego ze stron internetowych oraz korzystania z programu IntelliJ IDEA. W końcowych rozdziałach pomoże również znajomość języka SQL, protokołu HTTP i stylu REST.

Oprogramowanie użyte w tej książce

Wymagania dotyczące systemu operacyjnego

Corretto JDK dla Javy 17 firmy Amazon

Windows, macOs lub Linux

IntelliJ IDEA (Community Edition) w wersji z 2022.1.3

Windows, macOs lub Linux

JUnit 5

Windows, macOs lub Linux

AssertJ

Windows, macOs lub Linux

Mockito

Windows, macOs lub Linux

DBRider

Windows, macOs lub Linux

PostgreSQL

Windows, macOs lub Linux

psql

Windows, macOs lub Linux

Molecule

Windows, macOs lub Linux

Jeżeli używasz wersji cyfrowej tej książki, doradzam samodzielne pisanie kodu lub uzyskanie do niego dostępu pod adresem wskazanym w następnym podrozdziale. Dzięki temu unikniesz ewentualnych problemów z kopiowaniem i przeklejaniem kodu.

Pobierz pliki z przykładowym kodem

Pliki z przykładowym kodem dla tej książki możesz pobrać pod adresem https://ftp.helion.pl/przyklady/podtdd.zip.

Użyte konwencje

W książce zastosowano kilka konwencji typograficznych.

Kod w tekście wskazuje na fragmenty kodu oraz przypadki użycia poleceń w tekście głównym. Użycie tej konwencji ilustruje następujące zdanie: "W pokazanym przykładzie krok działania reprezentuje linia String actual = username.asLowerCase();".

Z kolei blok kodu będzie oznaczony w taki sposób:

public class DiceRoll {
private final int NUMBER_OF_SIDES = 6;
private final RandomGenerator rnd =
RandomGenerator.getDefault();

W celu zwrócenia uwagi na konkretną część bloku kodu użyto pogrubionej czcionki:

public class DiceRoll {
private final int NUMBER_OF_SIDES = 6;
private final RandomGenerator rnd =
RandomGenerator.getDefault();

Dane wejściowe i wyjściowe oznaczono podobnie:

create user ciuser with password 'cipassword';

W tekście głównym pogrubienie oznacza nowy termin, ważne słowo lub wyrażenie, które pojawia się po raz pierwszy. Oto przykład: "Jeżeli mamy w Javie kilka klas, zależność (ang. coupling) opisuje stopień powiązania między tymi klasami, natomiast spójność (ang. cohesion) odnosi się do relacji między metodami w obrębie każdej z tych klas".

Elementy pojawiające się na ekranie, takie jak opcje menu, przyciski i ikony, będą wyróżnione w następujący sposób: "Kliknij przycisk Open (otwórz), a potem przejdź do katalogu r04 z rozpakowanego przed chwilą pliku ZIP i go zaznacz". Kursywą oznaczamy również nazwy folderów, plików, rozszerzeń, klas, metod, zmiennych, tabel i kolumn, a także ścieżki oraz adresy URL.

Wskazówki lub ważne uwagi

Te będą wyglądały w ten sposób.