Test-Driven Development w Pythonie - Harry J. W. Percival Pyskowice

Testowanie ma niezwykle istotne znaczenie w pracy programisty. Harry spisał się doskonale przyciągnął naszą uwagę, wyjaśniając praktyki stosowane podczas testowania. Michael Foord, programista Pythona, autor modułu unittest Ta książka to znacznie więcej niż wprowadzenie do programowania sterowanego …

od 97,30 zł Najbliżej: 12 km

Liczba ofert: 1

Oferta sklepu

Opis

Testowanie ma niezwykle istotne znaczenie w pracy programisty. Harry spisał się doskonale przyciągnął naszą uwagę, wyjaśniając praktyki stosowane podczas testowania. Michael Foord, programista Pythona, autor modułu unittest Ta książka to znacznie więcej niż wprowadzenie do programowania sterowanego testami w Pythonie. To pełny kurs przedstawiający najlepsze praktyki od początku do końca. Kenneth Reitz, członek Python Software Foundation Programowanie sterowane testami (TDD) to jedna z najważniejszych kompetencji współczesnego programisty. W świecie, w którym jakość kodu, szybkość wdrożeń i niezawodność systemów decydują o sukcesie projektów, TDD przestało być niszową techniką stało się standardem w profesjonalnych zespołach deweloperskich. Python, jako jeden z najpopularniejszych języków programowania na świecie, zyskuje coraz więcej zastosowań w tworzeniu aplikacji webowych, a Django pozostaje wiodącym frameworkiem w tym ekosystemie. Połączenie TDD z nowoczesnymi narzędziami, takimi jak Docker, Ansible czy Selenium, odpowiada na realne potrzeby rynku IT, na którym DevOps i automatyzacja wdrożeń są dziś absolutną koniecznością. Trzecie wydanie tego uznanego przewodnika prowadzi czytelnika przez kompletny proces tworzenia aplikacji webowej w Pythonie 3.14 i Django 5 od pierwszego testu aż po wdrożenie produkcyjne. Autor krok po kroku pokazuje, jak definiować testy przed napisaniem kodu, konteneryzować aplikację za pomocą Dockera, automatyzować wdrożenia przy użyciu Ansible, a także testować interakcje przeglądarkowe za pomocą Selenium. Omawia również obsługę plików statycznych, konfigurację środowiska produkcyjnego, mechanizmy uwierzytelniania bez hasła i izolację testów za pomocą obiektów imitacji. Całość utrzymana jest w duchu małych, ale pewnych kroków zgodnie z filozofią TDD. W książce: Pełny przepływ pracy TDD: od pisania testów, przez implementację, po refaktoryzację Konteneryzacja aplikacji Django z użyciem Dockera i przygotowanie jej do wdrożenia produkcyjnego Automatyzacja wdrożeń na serwerze za pomocą narzędzia Ansible (infrastruktura jako kod) Testowanie interakcji przeglądarkowych przy użyciu Selenium i testy jednostkowe logiki biznesowej Izolacja zależności zewnętrznych i własnych modułów za pomocą obiektów imitacji (unittest.mock) Konfiguracja ciągłej integracji (CI) i automatyczne uruchamianie testów Tworzenie frontendu z kodem JavaScript pisanym zgodnie z podejściem TDD Najpierw pisz testy i wdrażaj pewnie. TDD w Pythonie od A do Z Spis treści: Wprowadzenie Wprowadzenie do wydania trzeciego, czyli TDD w erze AI Przygotowania i założenia Podziękowania Część I. Podstawy TDD i Django Rozdział 1. Konfiguracja Django za pomocą testu funkcjonalnego Słuchaj Testing Goat! Nie rób nic, dopóki nie przygotujesz testu Rozpoczęcie pracy z frameworkiem Django Utworzenie repozytorium Git Rozdział 2. Rozszerzenie testu funkcjonalnego za pomocą modułu unittest Użycie testu funkcjonalnego do przygotowania minimalnej aplikacji Moduł unittest ze standardowej biblioteki Pythona Przekazanie plików do repozytorium Rozdział 3. Testowanie prostej strony głównej za pomocą testów jednostkowych Nasza pierwsza aplikacja Django i test jednostkowy Testy jednostkowe i różnice dzielące je od testów funkcjonalnych Testy jednostkowe w Django MVC w Django, adresy URL i funkcje widoku Testy jednostkowe widoku Wreszcie zaczynamy tworzyć kod aplikacji Cykl test jednostkowy - tworzenie kodu Testy funkcjonalne podpowiadają, że to jeszcze nie koniec Odczyt stosu wywołań urls.py Rozdział 4. Do czego służą te wszystkie testy (i refaktoryzacja)? Programowanie przypomina wyciąganie wiadrem wody ze studni Użycie Selenium do testowania interakcji użytkownika Reguła "nie testuj stałych" i szablony na ratunek Refaktoryzacja w celu użycia szablonu Modyfikacja testów jednostkowych Testuj sposób działania, nie implementację Refaktoryzacja Nieco więcej o stronie głównej Przypomnienie - proces TDD Podwójna pętla TDD Rozdział 5. Zapis danych wejściowych użytkownika - testowanie bazy danych Od formularza internetowego do wykonania żądania POST Testowanie kontraktu między frontendem i backendem Debugowanie testów funkcjonalnych Debugowanie z użyciem time.sleep() Przetwarzanie żądania POST w serwerze Przekazanie zmiennych Pythona do wygenerowania w szablonie Oczekiwane niepowodzenie Usprawnianie komunikatów błędów w testach Do trzech razy sztuka, a później refaktoryzacja Django ORM i nasz pierwszy model Pierwsza migracja bazy danych Zdumiewająco duży postęp w teście Nowa kolumna oznacza nową migrację Zapis w bazie danych informacji z żądania POST Przekierowanie po wykonaniu żądania POST Każdy test powinien testować jedną rzecz Wygenerowanie elementów w szablonie Utworzenie produkcyjnej bazy danych za pomocą polecenia migrate Podsumowanie Rozdział 6. Usprawnienie testów funkcjonalnych - gwarancja izolacji i pozbycie się magicznie działających poleceń Gwarancja izolacji testu w testach funkcjonalnych Wykonanie tylko testów jednostkowych Oczekiwanie jawne i niejawne oraz magiczne wywołania time.sleep Rozdział 7. Praca małymi krokami Stawiaj na małe projekty Rozpocznij od niewielkiego projektu YAGNI! REST Implementacja nowego projektu za pomocą TDD Upewnienie się o istnieniu testu regresji Iteracja w kierunku nowego projektu Wykonanie pierwszego samodzielnego kroku: nowy adres URL Rozdzielenie funkcjonalności strony głównej i widoku listy Testy funkcjonalne wykrywają regresję Jak najszybszy powrót do działającej wersji aplikacji Zielony? Refaktoryzacja Kolejny mały krok: oddzielny szablon do wyświetlania list Trzeci mały krok: nowy adres URL pozwalający dodać elementy listy Klasa testowa dla operacji tworzenia nowej listy Adres URL i widok przeznaczony do tworzenia nowej listy Usunięcie zbędnego kodu i dalsze testy Regresja! Formularze korzystają z nowego adresu URL Debugowanie za pomocą narzędzi programistycznych w przeglądarce internetowej Chwytamy byka za rogi, czyli dostosowanie modeli Związek klucza zewnętrznego Dostosowanie reszty świata do naszych nowych modeli Każda lista powinna mieć własny adres URL Przechwytywanie parametrów z adresów URL Dostosowanie new_list do nowego świata Testy funkcjonalne wskazują na jeszcze inną regresję Jeszcze jeden adres URL pozwalający dodać element do istniejącej listy Ostatni nowy wpis w pliku urls.py Ostatni nowy widok Bezpośrednie testowanie kontekstu szablonu Ostatnia refaktoryzacja za pomocą polecenia include Czy możesz w to uwierzyć? Rozdział 8. Upiększanie - jak przetestować układ i style? Jaką funkcjonalność należy testować w przypadku układu i stylów? Upiększanie za pomocą frameworka CSS Dziedziczenie szablonu w Django Integracja z frameworkiem Bootstrap Wiersze i kolumny Pliki statyczne w Django Zaczynamy używać klasy StaticLiveServerTestCase Użycie komponentów Bootstrapa do poprawy wyglądu witryny Jumbotron Ogromne pola danych wejściowych Nadanie stylu tabeli Opcjonalny tryb ciemny Całkiem przyzwoita strona Analizowanie kodu w HTML-u w celu uzyskania bardziej niezawodnych testów kluczowej zawartości w HTML-u Co zostało zatuszowane: polecenie collectstatic i inne katalogi statyczne Kilka tematów, które nie zostały omówione Część II. Wdrożenie w środowisku produkcyjnym Rozdział 9. Konteneryzacja, czyli Docker Docker, kontenery i wirtualizacja Dlaczego po prostu nie używamy środowiska wirtualnego Pythona? Docker i Twoje CV Jak zwykle zaczynamy od testu Utworzenie katalogu src Instalowanie Dockera Tworzenie obrazu Dockera i uruchamianie kontenera Dockera Pierwsze zetknięcie z plikiem Dockerfile Polecenie docker build Polecenie docker run Instalowanie Django w środowisku wirtualnym obrazu kontenera Zakończone sukcesem uruchomienie kontenera Stosowanie testu funkcjonalnego do sprawdzenia, czy kontener działa Debugowanie problemów sieciowych związanych z kontenerem Debugowanie za pomocą narzędzia curl dostępności serwera WWW Stosowanie polecenia docker exec do uruchamiania kodu "wewnątrz" kontenera Mapowanie portów Dockera Wyszukiwanie w internecie informacji o komunikatach błędów Migracje bazy danych Dlaczego nie należy przeprowadzać migracji z poziomu pliku Dockerfile? Montowanie plików w kontenerze Rozdział 10. Przygotowanie aplikacji do wdrożenia Co musimy jeszcze zrobić? Użycie Gunicorna Testy funkcjonalne wychwytują problem z plikami statycznymi Udostępnianie plików statycznych za pomocą WhiteNoise Użycie pliku requirements.txt Użycie zmiennych środowiskowych w celu dostosowania ustawień środowiska produkcyjnego Ustawienia DEBUG=True i SECRET_KEY Definiowanie zmiennych środowiskowych w pliku Dockerfile Definiowanie zmiennych środowiskowych z poziomu powłoki Dockera Po wyłączeniu trybu debugowania wymagana jest opcja ALLOWED_HOSTS Polecenie collectstatic jest wymagane po wyłączeniu debugowania Zastosowanie użytkownika bez uprawnień administratora Możliwość konfiguracji ścieżki dostępu do pliku bazy danych Stosowanie identyfikatorów użytkowników dozdefiniowania uprawnień podczas montowania plików w kontenerze ikomputerze lokalnym Konfigurowanie mechanizmu rejestrowania danych Celowe wywołanie błędu Ćwiczenie do samodzielnego wykonania: użycie polecenia check w Django Podsumowanie Rozdział 11. Przygotowanie serwera do wdrożenia aplikacji Ręczne przygotowanie serwera do hostingu witryny Wybór hostingu dla witryny Uruchomienie serwera Pobranie nazwy domeny Konfiguracja DNS dla witryn testowej i rzeczywistej Ansible Ansible kontra SSH - komunikacja z serwerem Na początek upewniamy się, czy możemy uzyskać dostęp poprzez SSH Debugowanie problemów z SSH Instalowanie Ansible Sprawdzenie, czy Ansible może komunikować się z serwerem Rozdział 12. Infrastruktura jako kod - zautomatyzowane wdrożenia za pomocą Ansible Pierwsza wersja scenariusza Ansible dla wdrożenia Nawiązanie połączenia SSH z serwerem i wyświetlenie dzienników zdarzeń kontenera Umożliwienie Dockerowi dostępu bez uprawnień użytkownika root Przekazanie obrazu na serwer Ciąg dalszy rozglądania się Zdefiniowanie zmiennych środowiskowych i kluczy tajnych użytkownika Samodzielne sprawdzenie zmiennych środowiskowych w uruchomionym kontenerze Wykonanie testów funkcjonalnych w celu sprawdzenia wdrożenia Debugowanie serwera testowego za pomocą narzędzia curl Montowanie bazy danych na serwerze i przeprowadzanie migracji Działaaa! Wdrożenie do środowiska produkcyjnego Oznaczenie wydania tagiem Gita Powiedz wszystkim! Źródła dalszej nauki Część III. Formularze i weryfikacja Rozdział 13. Podział testów na wiele plików i praca z ogólnymi metodami pomocniczymi Testy funkcjonalne weryfikacji danych - ochrona przed pustymi elementami Pominięcie testu Podział testów funkcjonalnych na wiele plików Wykonanie pojedynczego pliku testu Nowe narzędzie testów funkcjonalnych - ogólna metoda pomocnicza oczekiwania Dokończenie pracy nad testem funkcjonalnym Refaktoryzacja testów jednostkowych na oddzielne pliki Rozdział 14. Weryfikacja na poziomie bazy danych Sprawdzenie warstwy modelu Menedżer kontekstu self.assertRaises() Ograniczenia modelu Django i ich interakcja z bazami danych Sprawdzanie ograniczeń na poziomie bazy danych Testowanie weryfikacji modelu Django Dziwactwo Django - zapis modelu nie wywołuje operacji sprawdzenia poprawności Wyświetlanie w widoku błędów z weryfikacji modelu Upewnienie się, że nieprawidłowe dane nie zostaną zapisane w bazie danych Dodanie wcześniejszego polecenia return do testu funkcjonalnego, aby umożliwić refaktoryzację w stosunku do wersji zielonej Wzorzec Django: przetwarzanie żądań POST w widoku generującym formularz Refaktoryzacja: przekształcenie funkcjonalności new_item na view_list Egzekwowanie w widoku view_list weryfikacji modelu Refaktoryzacja: usunięcie na stałe zdefiniowanych adresów URL Znacznik szablonu {% url %} Użycie get_absolute_url w przekierowaniach Rozdział 15. Prosty formularz Przeniesienie do formularza logiki odpowiedzialnej za sprawdzanie poprawności danych Użycie testu jednostkowego do analizy API formularzy Przejście do Django ModelForm Testowanie i dostosowanie do własnych potrzeb logiki weryfikacji formularza Próba użycia formularza w widokach Użycie formularza w widoku za pomocą żądania GET Kompromisy klasy ModelForms w Django - frontend jest połączony z bazą danych Duża operacja znajdź i zastąp Wycofanie zmian i przywrócenie aplikacji do stanu działającego Zmiana atrybutu name Zmiana atrybutu id Druga próba użycia formularza w widokach Użycie formularza w widoku obsługującym żądania POST Użycie formularza w celu wyświetlenia błędów w szablonie Przywrócenie aplikacji do stanu działającego Metoda pomocnicza dla wielu krótkich testów Użycie formularza w istniejącym widoku listy Użycie formularza do przekazywania błędów do szablonu Refaktoryzacja widoku w celu pełnego użycia formularza Nieoczekiwana korzyść: bezpłatna weryfikacja po stronie klienta za pomocą HTML5 Ulga Czy zmarnowaliśmy dużo czasu? Użycie metody save() formularza Rozdział 16. Bardziej skomplikowane formularze Kolejny test funkcjonalny dotyczący powielonych elementów Ochrona przed duplikatami w warstwie modelu Przepisanie testu starego modelu Pewne błędy spójności ujawniają się podczas zapisu Eksperymenty w warstwie widoku sprawdzające, czy są powielone elementy Bardziej skomplikowany formularz do obsługi unikalności elementów Użycie istniejącego formularza w widoku listy Dostosowanie metody save() do potrzeb nowego formularza Testy funkcjonalne wychwytują problem z klasami Bootstrapa Warunkowe dostosowywanie klas CSS dla nieprawidłowych formularzy Mała dygresja o kolejności API Querystring i przedstawianiu ciągu tekstowego O kompromisach związanych z klasą Django ModelForm i ogólnie frameworkami Przeniesienie logiki prezentacyjnej z powrotem do szablonu Porządkowanie formularzy Powrót do prostych formularzy Podsumowanie informacji o testowaniu Część IV. Bardziej zaawansowane zagadnienia związane z testowaniem Rozdział 17. Zagłębiamy się ostrożnie w JavaScript Rozpoczynamy od testów funkcjonalnych Krótka sesja z kodem eksperymentalnym Prosty skrypt osadzony w kodzie Użycie narzędzi programistycznych przeglądarki internetowej Wybór prostego silnika wykonywania testów w JavaScripcie Ogólne omówienie frameworka Jasmine Przygotowanie środowiska testowego dla JavaScriptu Pierwszy test dymny - bloki describe, it, expect Wykonywanie testów za pomocą przeglądarki internetowej Testowanie z zawartością modelu DOM Tworzenie testu jednostkowego JavaScriptu dla żądanej funkcjonalności Dane testowe, kolejność wykonywania i stan globalny - największe wyzwania podczas testowania JavaScriptu Wywołanie console.log() do wyświetlenia informacji debugowania Korzystanie z funkcji inicjalizującej dla większej kontroli nad czasem wykonania Celowe psucie kodu, żeby zmusić się do utworzenia większej liczby testów Czerwone - zielone - refaktoryzacja - usunięcie na stałe zdefiniowanych selektorów Czy to działa? Testowanie integracji z CSS i Bootstrapem Columbo mówi: poczekaj na zdarzenie onload Testowanie JavaScriptu w cyklu TDD Rozdział 18. Wdrożenie nowego kodu Lista kontrolna dla wdrożenia Lokalne wykonanie pełnego zestawu testów Krótki zestaw testów w Dockerze Wdrożenie w środowisku testowym i uruchomienie testów Wdrożenie w środowisku produkcyjnym A jeśli wystąpi błąd bazy danych? Jak usunąć bazę danych w środowisku testowym? Podsumowanie - git tag i nowe wydanie Rozdział 19. Uwierzytelnianie użytkownika oraz tworzenie i usuwanie kodu eksperymentalnego Uwierzytelnianie bez hasła, za pomocą "magicznych łączy" Nieco większy kod eksperymentalny Utworzenie nowej gałęzi dla spike Interfejs użytkownika logowania Wysyłanie wiadomości e-mail z Django Konfigurowanie serwera poczty w Django Kolejny klucz tajny użytkownika i kolejna zmienna środowiskowa Przechowywanie tokenów w bazie danych Niestandardowe modele uwierzytelniania Dokończenie pracy nad niestandardowym uwierzytelnieniem Django Zmiana rozwiązania eksperymentalnego na zwykłe Opracowanie planu Tworzenie testu funkcjonalnego dla kodu eksperymentalnego Wycofywanie kodu eksperymentalnego Minimalny niestandardowy model użytkownika Testy jako dokumentacja Model tokena do powiązania łącza z unikatowym identyfikatorem Rozdział 20. Stosowanie imitacji do testowania zależności zewnętrznych Zanim zaczniemy - przygotowanie podstawowej infrastruktury Imitacje ręczne - monkeypatching Biblioteka mock Pythona Użycie unittest.patch Niewielki postęp z testem funkcjonalnym Testowanie frameworka komunikatów Django Dodawanie komunikatów do kodu w HTML-u Rozpoczęcie pracy nad adresem URL do logowania się Sprawdzenie, czy wysyłamy użytkownikowi łącze z tokenem Zmiana eksperymentalnej wersji backendu uwierzytelniania na zwykłą Polecenie if oznacza więcej testów Metoda get_user() Rozdział 21. Izolacja testów za pomocą imitacji Używanie w widoku logowania backendu mechanizmu uwierzytelniania Prosty test widoku bez użycia imitacji Problem eksplozji kombinatorycznej Przykład fabryki samochodów Stosowanie imitacji do oddzielnego testowania elementów systemu Imitacje umożliwiają również testowanie implementacji, gdy ma to znaczenie Zaczynamy od nowa - testowanie implementacji za pomocą imitacji Stosowanie atrybutu mock.return_value Stosowanie atrybutu .return_value podczas przygotowywania testu Wycofanie operacji NIEowania testu Które testy powinny być zachowane? Chwila prawdy - czy test funkcjonalny zostanie zaliczony? Działa w teorii, ale czy w praktyce? Użycie nowej zmiennej środowiskowej i zapisanie jej w pliku .env Dokończenie testu funkcjonalnego - testowanie wylogowania Rozdział 22. Konfiguracja testu i dekorator wyraźnego oczekiwania Pominięcie procesu logowania przez wstępne utworzenie sesji Sprawdzamy rozwiązanie Ostateczna metoda pomocnicza wyraźnego oczekiwania - dekorator wait Rozdział 23. Debugowanie po stronie serwera testowego Dowód znajdziesz w praktyce - użycie Dockera do wychwycenia błędów Sprawdzanie dzienników zdarzeń kontenera Dockera Kolejna zmienna środowiskowa w Dockerze mail.outbox nie będzie działać poza środowiskiem testowym Django Jak testować "rzeczywiste" wysyłanie wiadomości e-mail? Alternatywna metoda definiowania na serwerze zmiennych środowiskowych z tajnymi wartościami Debugowanie z użyciem kodu w SQL-u Zarządzanie konfiguracją testów w rzeczywistych bazach danych Polecenie Django do tworzenia sesji Test funkcjonalny uruchamiający w serwerze narzędzie zarządzania Wykonywanie poleceń za pomocą docker exec i (opcjonalnie) SSH Podsumowanie tworzenia sesji w systemie lokalnym i testowym Testowanie narzędzi zarządzania Porządkowanie testowej bazy danych Podsumowanie Rozdział 24. Kończymy "Moje listy" - podejście outside-in Alternatywa, czyli podejście inside-out Dlaczego preferowane jest podejście outside-in? Test funkcjonalny dla strony "Moje listy" Warstwa zewnętrzna - prezentacja i szablony Przejście o jedną warstwę w dół do funkcji widoku (kontroler) Kolejne zaliczenie - podejście outside-in Szybka restrukturyzacja szablonu Wczesne zakończenie, czyli refaktoryzacja pod kątem zielonego Wyodrębnienie dwóch tagów include w szablonie Projektowanie API za pomocą szablonu Przejście w dół do kolejnej warstwy - co widok przekazuje szablonowi? Kolejne wymaganie z warstwy widoku - nowe listy powinny zapamiętywać swego właściciela Czy przejść do kolejnej warstwy, gdy test kończy się niepowodzeniem? Przejście w dół do warstwy modelu Ostatni krok: uzyskanie z poziomu szablonu dostępu do właściciela za pomocą API .name Rozdział 25. Ciągła integracja Ciągła integracja w nowoczesnych przepływach pracy Wybór usługi ciągłej integracji Przekazanie naszego kodu do serwisu GitLab Utworzenie konta Utworzenie projektu Przekazanie kodu za pomocą git push Początkowa konfiguracja potoku CI Pierwsza kompilacja (i pierwsze niepowodzenie) Próba lokalnego odtworzenia błędu CI Włączanie dzienników debugowania dla Selenium, Firefoksa i Webdrivera Włączenie trybu headless dla przeglądarki Firefox Niestabilne testy - najczęstszy problem w Selenium Wykonanie zrzutów ekranu Zapisywanie danych wyjściowych kompilacji (lub plików debugowania) jako artefaktów W razie wątpliwości spróbuj wydłużyć limit czasu Pomyślne wykonanie zestawu testów Pythona Wykonanie testów JavaScriptu w CI Instalacja Node.js Instalowanie i konfigurowanie Jasmine Dodawanie kroku kompilacji dla kodu w JavaScripcie Testy są obecnie zaliczone Więcej zadań do wykonania za pomocą serwera ciągłej integracji Zdefiniowanie obrazu Dockera dla CI Buforowanie Zautomatyzowane wdrożenia, czyli ciągłe wdrażanie (CD) Rozdział 26. Token serwisów społecznościowych, wzorzec strony i ćwiczenie dla czytelnika Test funkcjonalny z wieloma użytkownikami i funkcja addCleanup() Wzorzec strony Rozszerzenie testu funkcjonalnego na drugiego użytkownika i stronę "Moje listy" Ćwiczenie dla czytelnika Wyjaśnienie krok po kroku Rozdział 27. Szybkie testy, wolne testy i gorąca lawa Dlaczego testujemy? Nasze wymagania dotyczące skutecznych testów Pewność i poprawność (zapobieganie regresji) Wydajny przepływ pracy Dążenie do lepszego projektu Czy nasze testy jednostkowe były od początku testami integracyjnymi? Skąd ta ciepła poświata bijąca od bazy danych? Byliśmy w "idealnym punkcie" Czym jest "prawdziwy" test jednostkowy i dlaczego to ma znaczenie? Wraz z upływem czasu testy integracyjne i funkcjonalne są wykonywane coraz wolniej Nie wykorzystujemy w pełni potencjalnych korzyści z testowania Idealna piramida testów Unikanie piekła imitacji Rzeczywiste rozwiązania są architektoniczne Porty i adaptery, architektura heksagonalna, architektura cebulowa i czysta architektura Architektura Functional Core, Imperative Shell Górnolotna metafora - te architektury są "lepsze" Najtrudniejsze zadanie: trzeba wiedzieć, kiedy przeprowadzić zmianę Podsumowanie Dalsza lektura Niech Cię prowadzi Testing Goat! Bibliografia A. Ściąga B. Co dalej? C. Przykładowe fragmenty kodu Skorowidz O autorze: Harry J.W. Percival jest zagorzałym zwolennikiem podejścia TDD i doświadczonym programistą Pythona. Swoją wiedzą dzieli się na całym świecie poprzez prelekcje i warsztaty. Pracuje dla Kraken Technologies, gdzie tworzy oprogramowanie wspierające globalną transformację energetyczną w kierunku odnawialnych źródeł energii. Jest autorem kolejnych wydań cenionego przewodnika po TDD w Pythonie. Najpierw pisz testy i wdrażaj pewnie. TDD w Pythonie od A do Z

Specyfikacja

Podstawowe informacje

Autor
  • Harry J.W. Percival
Wydawnictwo
  • Helion
Okładka
  • Miękka
Format
  • 165x235 mm
Rok wydania
  • 2026
Ilość stron
  • 624
Tematyka
  • Programowanie
ISBN
  • 9788328938212