Details zum E-Book

Test-Driven Development w C# i .NET. Tworzenie wysokiej jakości kodu w architekturze DDD za pomocą znanych narzędzi i bibliotek

Test-Driven Development w C# i .NET. Tworzenie wysokiej jakości kodu w architekturze DDD za pomocą znanych narzędzi i bibliotek

Adam Tibi

E-book

Spośród wielu koncepcji tworzenia oprogramowania na szczególną uwagę zasługuje model programowania sterowanego testami - TDD. Zastosowanie podejścia TDD ułatwia utrzymanie wysokiej jakości kodu. Technika ta opiera się na dodawaniu funkcjonalności do produktu dopiero po utworzeniu i przeprowadzeniu testów jednostkowych. TDD coraz częściej jest wyborem szanowanych firm programistycznych.

W tej praktycznej książce przedstawiono zasady TDD na rzeczywistych przykładach z użyciem popularnych frameworków, takich jak ASP.NET Core i Entity Framework. Po zapoznaniu się z solidnym wprowadzeniem do koncepcji TDD dowiesz się, jak można używać Visual Studio 2022 do tworzenia aplikacji internetowej z wykorzystaniem Entity Framework, a także baz danych SQL Server i Cosmos DB. Nauczysz się też korzystać z różnych wzorców, takich jak repozytorium, usługi i budowniczy. Ponadto omówiono tu architekturę DDD i inne najlepsze praktyki stosowane podczas tworzenia oprogramowania, w tym reguły SOLID i wskazówki FIRSTHAND. Nie zabrakło przydatnych uwag o biznesowych aspektach podejścia TDD.

W książce między innymi:

  • testy jednostkowe i mechanizm wstrzykiwania zależności
  • NSubstitute: imitacje i dublery używane podczas testów
  • zastosowanie TDD dla ASP.NET API, Entity Framework i baz danych
  • tworzenie potoków ciągłej integracji za pomocą GitHub
  • zaawansowane scenariusze używania imitacji
  • korzyści z wdrażania podejścia TDD przez zespoły i firmy

TDD wprowadza dobre praktyki i doskonali programistę!

Część I. Rozpoczęcie pracy i podstawy TDD

Rozdział 1. Przygotowanie pierwszej implementacji TDD

  • Wymagania techniczne
  • Wybór zintegrowanego środowiska programistycznego
    • Microsoft Visual Studio
    • JetBrains Rider
    • Visual Studio Code
    • Wersje .NET i C#
  • Utworzenie szkieletu rozwiązania razem z testami jednostkowymi
    • Wymagania
    • Utworzenie szkieletu projektu
    • Zapoznanie się z wbudowanymi narzędziami przeznaczonymi do przeprowadzania testów
  • Implementacja wymagań z zastosowaniem programowania sterowanego testami
    • SUT
    • Klasa testów
    • Warunki i oczekiwania
    • Czerwony - zielony
    • Wzorzec AAA
    • Jeszcze więcej testów
  • Podsumowanie
  • Dalsza lektura

Rozdział 2. Wprowadzenie do mechanizmu wstrzykiwania zależności

  • Wymagania techniczne
  • Aplikacja WFA
    • Utworzenie przykładowej aplikacji
    • Dodawanie komponentu odpowiedzialnego za dostarczanie rzeczywistej prognozy pogody
  • Poznawanie mechanizmu wstrzykiwania zależności
    • Typy abstrakcyjne i konkretne
    • Czym jest zależność?
    • Znaczenie zależności
    • Definiuj zależności od abstrakcji, a nie od konkretnej implementacji
  • Wprowadzenie do mechanizmu wstrzykiwania zależności
    • Pierwszy przykład wstrzykiwania zależności
    • Testowanie API
    • Czym jest szew?
    • Odwrócenie kontroli
  • Używanie kontenerów wstrzykiwania zależności
    • Rola kontenera
    • Kontenery podmiotów zewnętrznych
    • Cykl życiowy usługi
    • Refaktoryzacja pod kątem wstrzykiwania zależności
    • Rzeczywisty scenariusz użycia wstrzykiwania zależności
    • Wstrzykiwanie metody
    • Wstrzykiwanie właściwości
    • Lokalizator usługi
  • Podsumowanie
  • Dalsza lektura

Rozdział 3. Rozpoczęcie pracy z testami jednostkowymi

  • Wymagania techniczne
  • Wprowadzenie do testów jednostkowych
    • Czym jest testowanie jednostkowe?
    • Frameworki testów jednostkowych
  • Wyjaśnienie struktury projektu stosującego testy jednostkowe
    • Dodawanie projektu xUnit za pomocą wiersza poleceń
    • Konwencje nazw w projekcie testów jednostkowych
    • Wykonanie przykładowego testu jednostkowego
    • Okno Test Explorer
  • Analiza anatomii klasy testu jednostkowego
    • Konwencja nadawania nazwy klasie
    • Metody testowe
    • Wzorzec "przygotowanie, działanie, asercja"
    • Testowany system
  • Omówienie podstaw frameworka xUnit
    • Atrybuty Fact i Theory
    • Wykonywanie testów
    • Klasa Assert
    • Klasa Record
  • Omówienie powiązań zachodzących między regułami SOLID a testami jednostkowymi
    • Reguła jednej odpowiedzialności
    • Reguła otwarte-zamknięte
    • Zasada podstawień Barbary Liskov
    • Zasada rozdzielania interfejsów
    • Zasada odwrócenia zależności
  • Podsumowanie
  • Dalsza lektura

Rozdział 4. Rzeczywiste stosowanie testów jednostkowych z wykorzystaniem dublerów używanych podczas testów

  • Wymagania techniczne
  • Wprowadzenie do koncepcji dublerów używanych podczas testów
    • Typy dublerów używanych podczas testów
    • Którego rozwiązania należy używać w programowaniu sterowanym testami?
  • Omówienie kolejnych kategorii testów
    • Testy integracyjne
    • Testy sintegration
    • Testy akceptacyjne
    • Wybór kategorii testów
  • Podsumowanie
  • Dalsza lektura

Rozdział 5. Programowanie sterowane testami

  • Wymagania techniczne
  • Filary programowania sterowanego testami
    • Najpierw testy
    • Czerwony, zielony, refaktoryzacja
  • Programowanie sterowane testami w praktyce
    • Utworzenie rozwiązania w wierszu poleceń
    • Dodawanie zadania programistycznego
    • Krótkie podsumowanie
  • Najczęściej zadawane pytania i zastrzeżenia do programowania sterowanego testami
    • Dlaczego potrzebne jest programowanie sterowane testami? Czy nie można po prostu używać testów jednostkowych?
    • Podejście w stylu TDD podczas tworzenia oprogramowania wydaje się nienaturalne
    • Stosowanie programowania sterowanego testami będzie nas spowalniać
    • Czy programowanie sterowane testami ma znaczenie dla startupów?
    • Nie lubię programowania sterowanego testami i wolę najpierw zająć się swoją bazą kodu
    • Testy jednostkowe nie sprawdzają rzeczywistych aspektów kodu
    • Podobno istnieją dwie szkoły w zakresie programowania sterowanego testami - londyńska i klasyczna. Jakie są między nimi różnice?
    • Dlaczego niektórzy programiści nie lubią testów jednostkowych i programowania sterowanego testami?
    • Jaki związek zachodzi między programowaniem sterowanym testami a programowaniem ekstremalnym?
    • Czy system jest w stanie przetrwać bez programowania sterowanego testami?
  • Programowanie sterowane testami i testy sintegration
    • Testy sintegration jako alternatywa dla testów jednostkowych w programowaniu sterowanym testami
    • Wyzwania pojawiające się podczas stosowania testów sintegration
  • Podsumowanie
  • Dalsza lektura

Rozdział 6. Wskazówki FIRSTHAND dotyczące programowania sterowanego testami

  • Wymagania techniczne
  • Wskazówka "pierwszy"
    • Później oznacza nigdy
    • Przygotowanie do użycia mechanizmu wstrzykiwania zależności
    • Opracowanie z perspektywy klienta
    • Promowanie testowania sposobu działania
    • Eliminowanie fałszywych alarmów
    • Eliminowanie kodu spekulatywnego
  • Wskazówka "intencja"
    • NazwaMetody_Warunek_Oczekiwanie
    • NazwaMetody_Should_When
    • Struktura testu jednostkowego
  • Wskazówka "czytelność"
    • Inicjalizacja konstruktora testowanego systemu
    • Wzorzec budowniczego
  • Wskazówka "jeden sposób działania"
    • Czym jest sposób działania?
    • Przykład sposobu działania
    • Testowanie jedynie zewnętrznie zdefiniowanego sposobu działania
    • Dlaczego nie testujemy elementów wewnętrznych?
    • Test sprawdza tylko jeden sposób działania
  • Wskazówka "dokładność"
    • Testy jednostkowe przeznaczone do testowania zależności
    • Co oznacza pokrycie kodu testami?
    • Bycie dokładnym
  • Wskazówka "wysoka wydajność"
    • Integracja jako ukryte jednostki
    • Testy jednostkowe w ogromnym stopniu wykorzystujące procesor i pamięć operacyjną
    • Istnienie zbyt wielu testów
  • Wskazówka "automatyzacja"
    • Automatyzacja począwszy od dnia pierwszego
    • Niezależność od platformy
    • Wysoka wydajność w potoku ciągłej integracji
  • Wskazówka "brak współzależności"
    • Odpowiedzialność frameworka testów jednostkowych
    • Odpowiedzialność programisty
  • Wskazówka "deterministyczność"
    • Przypadki niedeterministycznych testów jednostkowych
    • Przykład zamrożenia czasu
  • Podsumowanie

Część II. Stworzenie aplikacji z zastosowaniem podejścia w stylu TDD

Rozdział 7. Pragmatyczne omówienie architektury DDD

  • Wymagania techniczne
  • Praca z przykładową aplikacją
    • Projekt aplikacji
    • Projekt obiektów kontraktu
    • Projekt warstwy dziedziny
  • Poznawanie dziedzin
    • Obiekty dziedziny
    • Encje i obiekty wartości
    • Agregacja
    • Modele anemiczne
    • Wszechobecny język
  • Poznawanie usług
    • Zarządzanie postem
    • Usługi aplikacji
    • Usługi infrastruktury
    • Cechy charakterystyczne usługi
  • Poznawanie repozytoriów
    • Przykład repozytorium
    • Entity Framework i repozytoria
  • Połączenie wszystkiego w całość
    • Okno Solution Explorer
    • Widok architekturalny
  • Podsumowanie
  • Dalsza lektura

Rozdział 8. Opracowanie aplikacji pozwalającej na rezerwowanie wizyt

  • Wymagania techniczne
  • Zebranie wymagań biznesowych
    • Cele biznesowe
    • Historyjki użytkownika
  • Projektowanie w duchu architektury DDD
    • Obiekty dziedziny
    • Usługi dziedziny
    • Architektura systemu
  • Implementowanie tras
    • Frontend
    • Backend w postaci relacyjnej bazy danych
    • Backend w postaci bazy danych opartej na dokumentach
    • Używanie wzorca mediatora
  • Podsumowanie
  • Dalsza lektura

Rozdział 9. Wykorzystanie Entity Framework i relacyjnej bazy danych do opracowania aplikacji pozwalającej na rezerwowanie wizyt

  • Wymagania techniczne
  • Planowanie kodu źródłowego i struktury projektu
    • Analiza struktury projektu
    • Utworzenie projektów i konfiguracja zależności
    • Konfiguracja projektu dziedziny
    • Przygotowanie Entity Framework
    • Przygotowanie projektu witryny internetowej
  • Implementacja Web API z użyciem programowania sterowanego testami
    • Używanie działającego dostawcy EF dla magazynu danych w pamięci
    • Implementacja pierwszej historyjki użytkownika
    • Implementacja piątej historyjki użytkownika (zarządzanie czasem)
  • Udzielenie odpowiedzi na najczęściej zadawane pytania
    • Czy te testy jednostkowe są wystarczające?
    • Dlaczego nie utworzyliśmy testów jednostkowych dla kontrolerów?
    • Czy system został wystarczająco przetestowany?
    • Pominęliśmy testowanie pewnych obszarów, więc jak osiągnąć wysoki poziom pokrycia testami?
  • Podsumowanie

Rozdział 10. Wykorzystanie wzorca repozytorium i bazy danych opartej na dokumentach do opracowania aplikacji pozwalającej na rezerwowanie wizyt

  • Wymagania techniczne
  • Planowanie kodu źródłowego i struktury projektu
    • Analiza struktury projektu
    • Utworzenie projektów i konfiguracja zależności
    • Konfiguracja projektu dziedziny
    • Wzorzec repozytorium
    • Przygotowanie projektu witryny internetowej
  • Implementacja Web API z użyciem programowania sterowanego testami
    • Implementacja pierwszej historyjki użytkownika
    • Implementacja piątej historyjki użytkownika (zarządzanie czasem)
  • Udzielenie odpowiedzi na najczęściej zadawane pytania
    • Czy te testy jednostkowe są wystarczające?
    • Dlaczego nie utworzyliśmy testów jednostkowych dla kontrolerów?
    • Dlaczego nie utworzyliśmy testów jednostkowych dla implementacji repozytoriów?
    • Czy system został wystarczająco przetestowany?
    • Pominęliśmy testowanie pewnych obszarów, więc jak osiągnąć wysoki poziom pokrycia testami?
  • Podsumowanie

Część III. Zastosowanie programowania sterowanego testami we własnych projektach

Rozdział 11. Wdrożenie potoku ciągłej integracji za pomocą usługi GitHub Actions

  • Wymagania techniczne
  • Wprowadzenie do systemu ciągłej integracji
    • Sposób działania systemu ciągłej integracji
    • Zalety systemu ciągłej integracji
  • Implementacja procesu ciągłej integracji za pomocą usługi GitHub Actions
    • Utworzenie przykładowego projektu w repozytorium GitHub
    • Zdefiniowanie sposobu działania
    • System ciągłej integracji i testowanie
    • Symulowanie testów zakończonych niepowodzeniem
    • Omówienie sposobu działania
  • Podsumowanie
  • Dalsza lektura

Rozdział 12. Praca z uaktualnianymi projektami

  • Wymagania techniczne
  • Analizowanie trudności
    • Obsługa mechanizmu wstrzykiwania zależności
    • Trudności związane z modyfikowaniem kodu źródłowego
    • Trudności związane z czasem i wysiłkiem
  • Strategia pozwalająca na zastosowanie programowania sterowanego testami
    • Rozważ ponowne utworzenie projektu
    • Zmiany kodu źródłowego
    • Natywna obsługa dla mechanizmu wstrzykiwania zależności
    • Poziom pokrycia testami przed dodaniem testów jednostkowych
  • Refaktoryzacja na potrzeby testów jednostkowych
    • Tworzenie egzemplarzy w kodzie
    • Zastępowanie statycznych elementów składowych
    • Zmiana struktury kodu źródłowego
  • Podsumowanie
  • Dalsza lektura

Rozdział 13. Zawiłości związane ze stosowaniem programowania sterowanego testami

  • Trudności techniczne
    • Projekt nowy czy uaktualniany?
    • Narzędzia i infrastruktura
  • Trudności w zespole
    • Doświadczenie zespołu
    • Ochota do działania
    • Czas
  • Trudności biznesowe
    • Korzyści biznesowe wynikające z programowania sterowanego testami
    • Wady testów jednostkowych z perspektywy biznesowej
  • Argumenty za programowaniem sterowanym testami i związane z nim błędne koncepcje
    • Testy jednostkowe, a nie programowanie sterowane testami
    • Testy jednostkowe nie są implementowane przez testerów
    • Sposób tworzenia i obsługi technicznej dokumentacji
    • Mamy niekompetentnych programistów
  • Podsumowanie

Dodatek A. Biblioteki, których najczęściej używa się podczas testów jednostkowych

  • Wymagania techniczne
  • Frameworki testów jednostkowych
    • MSTest
    • NUnit
  • Biblioteki imitacji
    • Moq
  • Biblioteki pomocnicze dla testów jednostkowych
    • Fluent Assertions
    • AutoFixture
  • Dalsza lektura

Dodatek B. Zaawansowane scenariusze związane z używaniem imitacji

  • Wymagania techniczne
  • Utworzenie biblioteki klienta OpenWeather
    • API One Call
    • Utworzenie szkieletu rozwiązania
    • Rozpoczęcie pracy nad implementacją z użyciem programowania sterowanego testami
    • Niezaliczenie i późniejsze zaliczenie testu
    • Podsumowanie
    • Analizowanie skomplikowanych scenariuszy imitacji
  • Dalsza lektura
  • Titel: Test-Driven Development w C# i .NET. Tworzenie wysokiej jakości kodu w architekturze DDD za pomocą znanych narzędzi i bibliotek
  • Autor: Adam Tibi
  • Originaler Titel: Pragmatic Test-Driven Development in C# and .NET: Write loosely coupled, documented, and high-quality code with DDD using familiar tools and libraries
  • Übersetzung: Robert Górczyński
  • ISBN: 978-83-289-1694-4, 9788328916944
  • Veröffentlichungsdatum: 2025-01-28
  • Format: E-book
  • Artikelkennung: tedrde
  • Verleger: Helion