Testy jednostkowe. Zasady, praktyki i wzorce

39.24

Opis

Każdy inżynier oprogramowania zna teoretyczne podstawy testowania. O tym, że sumienne przeprowadzenie testów ma podstawowe znaczenie dla jakości gotowego produktu, nie trzeba nikogo przekonywać. A jednak wciąż zbyt często okazuje się, że zaplanowanie, napisanie i przeprowadzenie testów jednostkowych w praktyce nie jest łatwym zadaniem. Co gorsza, niewłaściwe testy psują kod, mnożą błędy i zabierają mnóstwo cennego czasu i pieniędzy. Okazuje się, że dla uzyskania maksymalnej jakości projektu, który trzeba dostarczyć w krótkim czasie, konieczne jest nauczenie się praktycznego stosowania zasad i wzorców testowania jednostkowego.Jeśli znasz już podstawy testowania jednostkowego, dzięki tej książce nauczysz się projektowania i pisania testów, które obierają za cel model domeny i pozostałe kluczowe obszary kodu. Ten przejrzyście napisany przewodnik poprowadzi Cię przez proces tworzenia zestawów testowych o optymalnej wartości, bezpiecznej automatyzacji testowania i umiejętnego włączania go w cykl życia oprogramowania. W książce znalazły się uniwersalne wskazówki dotyczące analizy dowolnych testów jednostkowych oraz porady odnoszące się do zmian testów następujących wraz ze zmianami kodu produkcyjnego. Nie zabrakło również informacji, dzięki którym sprawnie zidentyfikujesz i wykluczysz ewentualne antywzorce testowania. Materiał został bogato zilustrowany przejrzystymi przykładami kodu napisanego w C#. Naturalnie, mają one zastosowanie także dla innych języków programowania.W książce między innymi:cel testowania jednostkowego i cechy dobrych testówfundamenty porządnego testowania jednostkowegowpływ zaślepek i sterowników na stabilność testówstyle testowania jednostkowegozalety i ograniczenia testowania integracyjnegoPrzed wdrożeniem dobrze przetestuj swój kod!Spis treści:Przedmowa 11Podziękowania 12O książce 13O autorze 15CZĘŚĆ I. SZEROKI HORYZONT 17Rozdział 1. Cel testowania jednostkowego 191.1. Obecna kondycja testowania jednostkowego 201.2. Cel testowania jednostkowego 211.2.1. Co czyni test dobrym? 231.3. Stosowanie wskaźników pokrycia do mierzenia jakości zestawu testowego 241.3.1. Interpretacja wskaźnika pokrycia kodu 251.3.2. Interpretacja wskaźnika pokrycia gałęzi 261.3.3. Problemy z pokryciem gałęzi 271.3.4. Wymaganie procentowej wartości pokrycia 301.4. Właściwości dobrego zestawu testowego 311.4.1. Integracja z cyklem wytwarzania oprogramowania 311.4.2. Koncentracja na najważniejszych częściach kodu 311.4.3. Maksymalna wartość przy minimalnych kosztach 321.5. Czego nauczysz się z tej książki 33Podsumowanie 34Rozdział 2. Co to jest test jednostkowy? 372.1. Definicja testu jednostkowego 382.1.1. Izolacja – podejście londyńskie 382.1.2. Izolacja – podejście klasyczne 442.2. Klasyczna i londyńska szkoła testów jednostkowych 472.2.1. Obsługa zależności według szkoły londyńskiej i klasycznej 472.3. Zestawienie podejść – klasycznej i londyńskiej szkoły testowania jednostkowego 512.3.1. Testowanie jednostkowe jednej klasy na raz 512.3.2. Testowanie jednostkowe dużej mapy wzajemnie łączących się klas 522.3.3. Dokładne wskazywanie źródła błędów 522.3.4. Inne różnice między podejściem klasycznym a londyńskim 532.4. Testy integracyjne według dwóch szkół 542.4.1. Testy systemowe to podzbiór testów integracyjnych 55Podsumowanie 57Rozdział 3. Anatomia testu jednostkowego 593.1. Struktura testu jednostkowego 603.1.1. Zastosowanie wzorca AAA 603.1.2. Unikanie wielokrotnych sekcji przygotuj, zrób, sprawdź 613.1.3. Unikanie warunków w testach 623.1.4. Optymalna wielkość sekcji 633.1.5. Liczba weryfikacji w sekcji asercji 653.1.6. Sekwencja końcowa 653.1.7. Zróżnicowanie systemu poddawanego testom 653.1.8. Usunięcie komentarzy na temat sekcji z testów 663.2. Omówienie biblioteki testowej xUnit 673.3. Wielokrotne wykorzystanie jarzma testowego 683.3.1. Silne wiązania między testami – antywzorzec 693.3.2. Użycie konstruktora zmniejsza czytelność 703.3.3. Lepszy sposób wielokrotnego wykorzystania jarzma testowego 703.4. Nazewnictwo testów jednostkowych 723.4.1. Nazewnictwo testów jednostkowych – wytyczne 743.4.2. Przykład: zmiana nazwy testu zgodnie z wytycznymi 743.5. Zamiana na testy parametryzowane 763.5.1. Generowanie danych dla testów parametryzowanych 783.6. Biblioteka asercji i dalsze poprawianie czytelności testów 80Podsumowanie 81CZĘŚĆ II. TESTY, KTÓRE PRACUJĄ DLA CIEBIE 83Rozdział 4. Cztery filary dobrego testu jednostkowego 854.1. Cztery filary dobrego testu jednostkowego 864.1.1. Filar pierwszy: ochrona przed regresją 864.1.2. Filar drugi: odporność na zmiany 874.1.3. Co powoduje wyniki obarczone błędem pierwszego rodzaju 894.1.4. Skup się na końcowym wyniku, a nie szczegółach implementacyjnych 924.2. Nierozerwalny związek między pierwszą a drugą cechą 944.2.1. Zwiększanie dokładności testów 944.2.2. Waga wyników fałszywie dodatnich i fałszywie ujemnych – dynamika 964.3. Filary trzeci i czwarty: szybka informacja zwrotna i utrzymywalność 974.4. W poszukiwaniu idealnego testu 984.4.1. Czy możliwe jest stworzenie idealnego testu 994.4.2. Przypadek skrajny nr 1: test systemowy 994.4.3. Przypadek skrajny nr 2: testy trywialne 1004.4.4. Przypadek skrajny nr 3: niestabilne testy 1014.4.5. W poszukiwaniu idealnego testu – wyniki 1024.5. Omówienie dobrze znanych pojęć z zakresu testów automatycznych 1054.5.1. Poziomy piramidy testów 1054.5.2. Wybór między testowaniem czarno- i białoskrzynkowym 107Podsumowanie 108Rozdział 5. Atrapy i stabilność testów 1115.1. Rozróżnienie między atrapami a zaślepkami 1125.1.1. Rodzaje dublerów testowych 1125.1.2. Atrapa (narzędzie) kontra atrapa (dubler testowy) 1135.1.3. Nie poddawaj asercjom interakcji z zaślepkami 1145.1.4. Używanie atrap i zaślepek razem 1165.1.5. Związek atrap i zaślepek z poleceniami i zapytaniami 1165.2. Zachowanie dające się zaobserwować a szczegóły implementacyjne 1175.2.1. Dające się zaobserwować zachowanie to nie publiczny interfejs API 1185.2.2. Wyciekające szczegóły implementacyjne – przykład z operacją 1195.2.3. Dobrze zaprojektowany interfejs API i enkapsulacja 1225.2.4. Wyciekające szczegóły implementacyjne – przykład ze stanem 1235.3. Związek między atrapami a niestabilnością testów 1255.3.1. Architektura heksagonalna 1255.3.2. Komunikacja wewnątrzsystemowa i międzysystemowa 1295.3.3. Komunikacja wewnątrzsystemowa i międzysystemowa – przykład 1305.4. Klasyczna i londyńska szkoła testowania jednostkowego – raz jeszcze 1335.4.1. Nie wszystkie zewnętrzne zależności należy zastępować atrapami 1335.4.2. Wykorzystanie atrap do weryfikowania zachowania 135Podsumowanie 135Rozdział 6. Style testowania jednostkowego 1396.1. Trzy style testowania jednostkowego 1406.1.1. Styl oparty na rezultatach – definicja 1406.1.2. Styl oparty na stanach – definicja 1416.1.3. Styl oparty na komunikacji – definicja 1426.2. Trzy style testowania jednostkowego – porównanie 1436.2.1. Porównanie stylów pod względem ochrony przed regresją i szybkości informacji zwrotnej 1446.2.2. Porównanie stylów pod względem odporności na zmiany 1446.2.3. Porównanie stylów pod względem utrzymywalności 1456.2.4. Porównanie stylów – wyniki 1476.3. Architektura funkcyjna 1486.3.1. Czym jest programowanie funkcyjne? 1486.3.2. Czym jest architektura funkcyjna? 1516.3.3. Porównanie architektury funkcyjnej i heksagonalnej 1536.4. Przejście do architektury funkcyjnej i testowania opartego na rezultatach 1546.4.1. System audytowania – wprowadzenie 1546.4.2. Wykorzystanie atrap w celu oddzielenia testu od systemu plików 1576.4.3. Przejście do architektury funkcyjnej 1606.4.4. Potencjalne dalsze kroki 1646.5. Wady architektury funkcyjnej 1656.5.1. Zasadność stosowania architektury funkcyjnej 1656.5.2. Wady pod względem wydajności 1676.5.3. Wady pod względem rozmiaru bazy kodu 167Podsumowanie 168Rozdział 7. Zmiany ku bardziej wartościowym testom jednostkowym 1717.1. Określenie kodu podlegającego refaktoryzacji 1727.1.1. Cztery typy kodu 1727.1.2. Wykorzystanie wzorca Skromny Obiekt do podziału przeszacowanego kodu 1757.2. Zmiany ku bardziej wartościowym testom 1787.2.1. System zarządzania kontaktami z klientami – wprowadzenie 1787.2.2. Próba nr 1: ujawnienie zależności 1807.2.3. Próba nr 2: wprowadzenie warstwy usług aplikacji 1807.2.4. Próba nr 3: usunięcie złożoności z usługi aplikacji 1827.2.5. Próba nr 4: wprowadzenie nowej klasy Company 1847.3. Analiza optymalnego pokrycia testami jednostkowymi 1867.3.1. Testowanie warstwy domeny i kodu pomocniczego 1877.3.2. Testowanie kodu z pozostałych części diagramu 1887.3.3. Czy powinno się testować warunki wstępne? 1887.4. Obsługa logiki warunkowej w kontrolerach 1897.4.1. Wykorzystanie wzorca Polecenie 1917.4.2. Wykorzystanie zdarzeń domeny do śledzenia zmian w modelu domeny 1947.5. Wnioski 197Podsumowanie 199CZĘŚĆ III. TESTY INTEGRACYJNE 203Rozdział 8. Po co testy integracyjne? 2058.1. Test integracyjny – definicja 2068.1.1. Rola testów integracyjnych 2068.1.2. Piramida testów – jeszcze raz 2078.1.3. Testy integracyjne kontra szybka reakcja 2088.2. Które zewnętrzne zależności testować bezpośrednio 2098.2.1. Dwa typy zależności poza kontrolą procesu 2108.2.2. Obsługa zarządzanych i niezarządzanych zależności 2118.2.3. Co, jeśli nie możesz wykorzystać prawdziwej bazy danych w testach integracyjnych? 2128.3. Testy integracyjne – przykład 2138.3.1. Jakie scenariusze przetestować? 2148.3.2. Klasyfikacja bazy danych i szyny danych 2148.3.3. Co z testami systemowymi? 2158.3.4. Test integracyjny – próba pierwsza 2168.4. Stosowanie interfejsów do abstrakcji zależności 2178.4.1. Interfejsy i luźne wiązania 2178.4.2. Po co używać interfejsów dla zewnętrznych zależności? 2188.4.3. Stosowanie interfejsów dla wewnętrznych zależności 2198.5. Najlepsze praktyki testów integracyjnych 2208.5.1. Jasno oznacz granice modelu domeny 2208.5.2. Zmniejszaj liczbę warstw 2208.5.3. Usuwaj zapętlone zależności 2228.5.4. Użycie wielu sekcji działania w teście 2248.6. Jak testować zapisywanie logów 2258.6.1. Czy w ogóle powinno się testować pisanie logów 2258.6.2. Jak testować pisanie logów 2268.6.3. Ile logowania wystarczy 2318.6.4. Jak przekazywać instancje mechanizmu logowania 2328.7. Wnioski 233Podsumowanie 233Rozdział 9. Najlepsze praktyki modelowania za pomocą atrap 2379.1. Maksymalizowanie wartości atrap 2379.1.1. Weryfikacja interakcji na obrzeżach systemu 2409.1.2. Zastępowanie atrap agentami 2439.1.3. Co z interfejsem IDomainLogger 2459.2. Najlepsze praktyki modelowania za pomocą atrap 2469.2.1. Atrapy służą tylko do testów integracyjnych 2469.2.2. Wiele atrap w jednym teście 2469.2.3. Weryfikacja liczby żądań 2479.2.4. Modeluj tylko typy, które sam utworzyłeś 247Podsumowanie 248Rozdział 10. Testowanie bazy danych 25110.1. Warunki umożliwiające testowanie bazy danych 25210.1.1. Przechowywanie bazy danych w systemie kontroli wersji 25210.1.2. Dane referencyjne to część schematu bazy danych 25310.1.3. Oddzielne instancje dla każdego programisty 25410.1.4. Stanowe i migracyjne podejście do dostarczania bazy danych 25410.2. Zarządzanie transakcjami w bazie danych 25610.2.1. Zarządzanie transakcjami w kodzie produkcyjnym 25610.2.2. Zarządzanie transakcjami w testach integracyjnych 26310.3. Cykl życia danych testowych 26510.3.1. Równoległe i sekwencyjne wykonanie testów 26510.3.2. Sprzątanie danych pomiędzy wykonaniami testów 26610.3.3. Unikanie baz danych operujących w pamięci 26710.4. Wielokrotne wykorzystanie kodu w sekcjach 26810.4.1. Wielokrotne użycie kodu w sekcji przygotowań 26810.4.2. Wielokrotne użycie kodu w sekcji działania 27110.4.3. Wielokrotne użycie kodu w sekcji asercji 27110.4.4. Czy test tworzy zbyt wiele transakcji do bazy danych 27210.5. Często zadawane pytania na temat testowania baz danych 27310.5.1. Czy testować operacje odczytu? 27310.5.2. Czy testować repozytoria? 27510.6. Wnioski 276Podsumowanie 276CZĘŚĆ IV. ANTYWZORCE TESTOWANIA JEDNOSTKOWEGO 279Rozdział 11. Antywzorce testowania jednostkowego 28111.1. Testowanie jednostkowe prywatnych metod 28211.1.1. Metody prywatne i niestabilność testów 28211.1.2. Metody prywatne i niedostateczne pokrycie 28211.1.3. Kiedy testowanie metod prywatnych jest akceptowalne 28311.2. Udostępnianie stanu prywatnego 28511.3. Przenikanie wiedzy domenowej do testów 28611.4. Zanieczyszczanie kodu 28811.5. Modelowanie za pomocą atrap konkretnych klas 29011.6. Praca z czasem 29311.6.1. Czas jako kontekst środowiskowy 29311.6.2. Czas jako jawna zależność 29411.7. Wnioski 295Podsumowanie 295O autorze: Vladimir Khorikov – jest inżynierem oprogramowania od ponad 15 lat. Zdobył tytuł Microsoft Most Valuable Professional. Jest ekspertem w zakresie testowania jednostkowego. W ciągu ostatnich kilku lat opublikował kilka popularnych serii wpisów o testowaniu jednostkowym na różnych blogach, a także prowadził internetowe kursy na ten temat. Jest ceniony za bogatą wiedzę teoretyczną, którą potrafi znakomicie wyjaśnić i zastosować w praktyce.

Informatyka

impel software fm, minimalne wynagrodzenie kierowcy międzynarodowego 2022, mieszkania ukraina, grzybki halucynki gdzie szukac, biedronka po portugalsku, płatne autostrady czechy, morskie oko cennik 2021, nasi partnerzy, wyładowania atmosferyczne online, choroba po ustaniu zatrudnienia, samochód prywatny do celów służbowych 2019, kwiecień święta 2022, francja vat, kiedy konferencja w sprawie obostrzeń, cecha charakteru na l, abb kłodzko opinie, w marcu na ryby, o niepomniejszanie przez płatnika dochodu o kwotę ulgi dla pracowników, ile można przewieźć papierosów do niemiec 2021, dystrybucja prądu w polsce

yyyyy