Tytuł Automatyzacja testów. Kompletny przewodnik dla testerów oprogramowania Autor Arnon Axelrod Język polski Wydawnictwo Wydawnictwo Naukowe PWN Tłumaczenie Krzysztof Kapustka ISBN 978-83-01-20854-7 Rok wydania 2019 Warszawa Wydanie 1 liczba stron 482 Format mobi, epub Spis treści O autorze XV O recenzencie technicznym XVII Podziękowania XIX Wprowadzenie XXI Kto powinien przeczytać tę książkę? XXII Jak zorganizowana jest ta książka? XXII Część I: „Dlaczego" oraz „Co" XXIII Część II: „Jak" XXIII CZĘŚĆ I. „Dlaczego" oraz „co " 1 1. Wartość automatyzacji testów 3 Dlaczego potrzebujemy automatyzacji testów? 3 Od modelu kaskadowego do zwinnego tworzenia oprogramowania 4 Koszt złożoności oprogramowania 5 Utrzymywanie stałego kosztu 6 Refaktoryzacja 8 Ciągłe doskonalenie 9 2. Od testowania ręcznego do samoczynnego 11 Podejście pierwsze: nagrywanie i odtwarzanie 11 Uzyskiwanie maksimum korzyści z automatyzacji testów 13 Różnice między testami manualnymi i samoczynnymi 16 Testowanie eksploracyjne 16 Rozważania dotyczące testowania samoczynnego 18 3. Ludzie i narzędzia 27 Wybieranie właściwych narzędzi 27 Kto powinien pisać testy? 28 Promowanie testerów manualnych lub niedoświadczonych deweloperów do rangi deweloperów automatyzacji 28 Dzielenie pracy pomiędzy testerów manualnych i deweloperów automatyzacji 31 Korzystanie z przeznaczonego zespołu automatyzacji 33 asygnowany deweloper automatyzacji we wnętrzu każdego zespołu 34 Dawanie deweloperom pełnej odpowiedzialności za automatyzację 35 zasobność narzędzi 35 Klasyfikacja narzędzi 36 IDE i języki programowania 36 Biblioteki testowania (jednostkowego) 39 Biblioteki w stylu BDD 41 Technologie zapewniające interakcję z testowanym systemem 42 pakiety do zarządzania testami 53 Narzędzia kompozycji oraz potoki ciągłej integracji albo ciągłego dostarczania 54 Inne czynniki posiadające znaczenie przy wybieraniu narzędzi 54 4. Osiąganie pełnego pokrycia 57 W jaki sposób mierzymy pokrycie? 58 Procent przypadków testów manualnych pokrytych przez automatyzację 58 Procent pokrytych funkcji 59 Procent pokrycia kodu 60 Uzyskiwanie korzyści przed osiągnięciem pełnego pokrycia 63 Co robimy po osiągnięciu pełnego pokrycia? 64 W jaki sposób uzyskać 100% pokrycia? 65 Odwracanie koła 66 Mapa drogowa prowadząca do pomyślnego projektu automatyzacji 69 Kiedy rozpocząć pracę nad progresją? 70 Nadawanie priorytetu pracy w celu zlikwidowania luki w regresji 71 5. Procesy biznesowe 73 Regularne uruchamianie testów 73 Najprostsze podejście 74 Testowanie nocne 74 Obsługiwanie błędów wykrywanych poprzez automatyzację 75 Zachowywanie testów kończących się niepowodzeniem 76 Wykluczanie testów kończących się niepowodzeniem 77 Tworzenie obejść w teście 78 Traktowanie wszelkich niepowodzeń automatyzacji jako błędów krytycznych 80 Ciągła integracja 81 Tworzenie oprogramowania sterowane testami akceptacyjnymi 81 Ciągłe dostarczanie i ciągłe wdrażanie 82 Wydania kanarkowe 84 Podsumowanie 85 6. A utomatyzacja i architektura testów 87 Założenia dotyczące do architektury testów 87 Poznawanie architektury testowanego systemu 88 Powrót do podstaw: czym jest system komputerowy? 88 Czym jest test automatyczny? 89 Rzeczywiste systemy komputerowe 90 Alternatywy i założenia w architekturze warstwowej 93 Związki między zakresem a testem 94 Omówienie warstw 95 Alternatywne zakresy testowania 97 Rzeczywista architektura 110 Architektura planowana kontra architektura rzeczywista 110 charakterystyczne typy 111 Łączenie testów 112 Podsumowanie czynników 115 Co poza architekturą warstwową? 118 Podsumowanie: dokonywanie własnych wyborów 122 7. Izolacja i środowiska testowe 123 Stan 123 Problemy z izolacją i ich rozwiązania 125 Problem 1 – testy manualne i test samoczynny realizowane w rozmaitym czasie 125 Problem 2 – testy manualne i samoczynne realizowane jednocześnie 126 Problem 3 – kolejność ma znaczenie 126 Problem 4 – testy samoczynne uruchamiane równocześnie 127 Techniki izolacji 127 Korzystanie z oddzielnych kont 128 Osobne bazy danych dla testów manualnych i automatyzacji testów 128 Oddzielne środowisko dla każdego członka zespołu 128 Resetowanie środowiska przed każdym cyklem testowania 130 Tworzenie niepowtarzalnych danych dla każdego testu 134 Każdy test czyści wszystko, co utworzył 138 Współdzielone dane tylko do odczytu 139 Podsumowanie 141 8. Szersza perspektywa 143 Relacje między architekturą oprogramowania i strukturą biznesu 143 Prawo Conwaya 143 Zespoły pionowe kontra zespoły poziome 144 Zależności pomiędzy architekturą oprogramowania i strukturą organizacyjną z automatyzacją testów 145 przeznaczony zespół automatyzacji 146 Deweloperzy automatyzacji w zespołach poziomych 146 Deweloperzy automatyzacji w zespołach pionowych 147 sprężysta struktura organizacyjna 147 Ekspert ds. Automatyzacji 148 Podsumowanie 148 CZĘŚĆ II. „Jak" 151 9. Przygotowanie do samouczka 153 oczekiwania i założenia wstępne 153 użytkowanie procesu do istniejących systemów automatyzacji testów 154 Omówienie cyklu 155 „Z dołu do góry" albo „z góry do dołu" 155 proces 156 Poznawanie testowanego systemu 157 Omówienie projektu MVCForum 157 Przygotowanie środowiska pod samouczek 160 Instalowanie Visual Studio w edycji Community 161 Pobieranie i instalowanie przeglądarki Chrome 161 Pobieranie i instalowanie bazy informacji SQL Server Express 161 Pobieranie i budowanie aplikacji 162 Instalacja dodatku ReSharper (krok opcjonalny) 165 Korzystanie z narzędzia Git z poziomu Visual Studio 167 Przełączanie między gałęziami 168 Podsumowanie 171 10. Projektowanie pierwszego przypadku testowego 173 Wybieranie pierwszego testu do automatycznia 173 Wybieranie pierwszego przypadku testowego dla aplikacji MVCForum 177 Naukowa metoda projektowania przypadku testowego 178 Projektowanie kroków testu 178 Myślenie w kontekście obiektów i jednostek 181 Wzorzec obiektu strony 183 Podsumowanie 188 11. Kodowanie pierwszego testu 189 Tworzenie projektu 189 Modyfikowanie nazw klas, plików i metod testowych 192 Pisanie pseudokodu 194 Uwagi odnośnie do pseudokodu 195 dobieranie kodu w celu jego skompilowania 197 Deklarowanie klasy LoggedInUser 199 Deklarowanie właściwości MVCForum 199 Deklarowanie metody RegisterNewUserAndLogin 201 Deklarowanie pozostałych klas i metod 201 Omówienie kodu modelu 205 Podsumowanie 206 12. Kompletowanie pierwszego testu 207 Uruchamianie testu w celu znalezienia pierwszej metody do zastosowania 208 Dodawanie Selenium do projektu 209 Uruchamianie IISExpress 211 Implementowanie konstruktora MVCForumClient 211 Implementowanie metody RegisterNewUserAndLogin 213 Proszenie dewelopera o dodanie niepowtarzalnego identyfikatora automatyzacji 217 Implementowanie metod ustawiających dla parametry 219 usuwanie duplikacji z metod ustawiających cechy 222 Napotykanie błędu izolacji 224 Implementowanie metody CreateDiscussion i analizowanie niepowodzenia 228 Kończenie testu 231 Podsumowanie 232 13. Badanie niepowodzeń 233 Integrowanie z najnowszą wersją aplikacji MVCForum 233 upraszczanie raportowania błędów 235 Unikanie debugowania 238 Badanie głównej przyczyny 239 Rozwiązywanie problemu 239 Więcej problemów… 241 Rejestrowanie i inne formy zbierania dowodów 247 Przechwytywanie ekranu 247 Rejestrowanie 247 Rejestrowanie zagnieżdżone 248 Rejestrowanie wizualne 249 dodatkowe opcje rejestrowania i diagnozowania 250 Dodawanie zagnieżdżonego rejestratora wizualnego do testów aplikacji MVCForum 252 Badanie trudniejszych niepowodzeń 254 Niepowodzenia, które zdarzają się tylko na jednej maszynie 254 Badanie testów wpływających na inne testy 258 Badanie testów migoczących 258 Podsumowanie 265 14. Dodawanie kolejnych testów 267 Pisanie kolejnych testów 267 Planowanie kolejnych testów 269 Dodawanie testu: dyskusje mogą być filtrowane według kategorii 270 Podsumowanie cyklu dodawania drugiego testu 283 Wprowadzanie dodatkowych usprawnień 283 Tworzenie bardziej zrozumiałych identyfikatorów 283 Organizowanie kodu w foldery 284 Wyodrębnianie klasy bazowej dla testów 284 Obsługa wielu użytkowników i przeglądarek 285 Wskazówki w zakresie korzystania z plików konfiguracyjnych testów 285 Obsługiwanie wielu przeglądarek 287 dodatkowe możliwości upraszczania 289 automatyczne ponowne tworzenie bazy danych 289 Oczyszczanie 290 Poprawienie produktywności 292 Dodawanie kolejnych testów 292 Testy sterowane danymi 292 Podsumowanie 294 15. Ciągła integracja 295 Czy to naprawdę niezbędne? 296 Tworzenie procesu kompozycji testów 296 Planowanie procesu kompilacji testów 297 Tworzenie cyklu samoczynnego wdrażania 299 Dodawanie testów do kombinacji 301 Zmiana cyklu tworzenia oprogramowania i kultury 303 Dążenie do „Świętego Graala" 304 Co jest konieczne do zmiany kultury? 304 Określanie punktu wyjścia 306 Skracanie czasu wykonywania testów 313 poprawianie izolacji 314 wykonywanie wymagań wstępnych za pośrednictwem API 314 Równoległe wykonywanie i wirtualizacja 314 Uruchamianie wyłącznie testów poprawności w ramach ciągłej integracji 315 Dzielenie potoku CI na etapy 315 Pisanie przeważnie testów integracyjnych i jednostkowych 316 Uruchamianie testów wyłącznie dla potężnych części 316 Optymalizowanie sprawności testów 317 Pokrywanie szerszej macierzy 318 Podsumowanie 319 16. Tworzenie oprogramowania sterowane testami akceptacyjnymi (ATDD) 321 Omówienie metodyki ATDD 321 Bycie bardziej zwinnym 322 Dług technologiczny 322 Co sprawia, że zespół jest zwinny? 322 Unikanie długu technicznego 323 cykl 324 Tworzenie historyjki użytkownika 325 Pisanie testów automatycznych 328 Dostarczanie aplikacji i zbieranie opinii na jej temat 335 stosowanie testów akceptacyjnych jako dokumentacji 336 Wiązanie kroków zamiast testów 336 Kompromis między możliwością ponownego użycia, poziomem szczegółów i czytelnością 338 Wprowadzanie metodyki ATDD do istniejącego projektu 339 Rozpoczynanie bez testów automatycznych 339 Retrospektywna implementacja automatyzacji 340 Rozpoczynanie od naprawy błędów 340 zwiększanie pokrycia regresji 341 Podsumowanie 342 17. Test jednostkowe i tworzenie oprogramowania sterowane testami (TDD) 343 Przyswajanie testów jednostkowych i TDD 343 Sposoby pisania testów jednostkowych 344 Mechanizm biblioteki testów jednostkowych 345 Sposób pisania testu jednostkowego 347 Testy jednostkowe i operacje wejścia/wyjścia 350 Mechanizm działania TDD 355 Czerwone-zielone-refaktoryzacja 355 Dlaczego najpierw powinniśmy pisać testy? 358 Prawdziwe wyzwania w testowaniu jednostkowym i TDD 359 Główne wyzwania związane z testowaniem jednostkowym 359 Główne wyzwania związane z podejściem TDD 360 Bardziej szczegółowe wyzwania 360 Opanowywanie czystego kodu i zasad SOLID 364 Opanowywanie umiejętności refaktoryzowania 365 Największe wyzwanie: co testować? 366 wykorzystywanie metodyki TDD w celach, do jakich była projektowana 367 Podejście „z zewnątrz do środka" kontra podejście „od środka na zewnątrz" 367 Podsumowanie 368 18. Inne typy testów samoczynnych 369 Testy efektywności 369 Mierzenie wydajności w środowisku produkcyjnym 369 Czego nie robić? 371 Definiowanie oczekiwanego rezultatu 372 Ponowne użytkowanie kodu między testami praktycznymi i testami produktywności 373 Badanie wąskich gardeł w produktywności 373 efektywność postrzegana a produktywność rzeczywista 373 Testy obciążeniowe 373 Jak działają testy obciążeniowe 374 Definiowanie oczekiwanego rezultatu 375 Łączenie testów wydajności z testami obciążeniowymi 377 Uruchamianie testów w środowisku produkcyjnym 377 Testowanie wdrożenia 377 Testowanie stanu zdrowia środowiska produkcyjnego 378 Które testy uruchamiać? 378 Oczyszczanie danych testu 379 Testowanie wizualne 379 Przepływ pracy testowania wizualnego 380 Testowanie wizualne i testowanie w wielu przeglądarkach/na wielu platformach 381 Testy instalacji 381 Podejścia dla testów instalacji 381 Testowanie instalacji za pośrednictwem interfejsu użytkownika albo instalacji dyskretnej 383 Testowanie programu deinstalacyjnego 383 Testy aktualizacji 383 Podejścia dla testów aktualizacji 384 Testowanie algorytmów statystycznych, niedeterministycznych i nienaturalnej inteligencji 385 Sposoby testowania algorytmów statystycznych 386 Testowanie aplikacji, które wykorzystują liczby losowe 388 Testowanie aplikacji analityki biznesowej 389 Podsumowanie 390 19. Co dalej? 391 Popełniaj błędy 391 Słuchaj, konsultuj się i zasięgaj porad 391 Poznaj i przypasuj się do celów swego biznesu 392 Poznaj swoje narzędzia 392 Doskonalenie umiejętności programistycznych 393 Doskonalenie umiejętności w zakresie zapewniania jakości 394 Poszerzaj swoje horyzonty 394 Dzielenie się wiedzą 395 Dziel się własnymi narzędziami 395 Bawmy się prawidłowo! 396 Dodatek A. Rzeczywiste przykłady 397 Przykład 1 – system monitorowania wodomierzy 397 Symulowanie serwera komunikacji 399 Praca z usługą Google Maps 400 Przykład 2 – system do handlu na rynku Forex 402 Rozwiązanie 403 Niestabilność powodowana poprzez CRM 403 Izolowanie środowisk 404 Testowanie aplikacji przenośnej z zastosowaniem abstrakcyjnego zakresu testowania 405 Przykład 3 – zarządzanie sklepem detalicznym 405 Opis architektury 405 Wdrożenie minimalne 407 Struktura organizacyjna 408 Rozwiązania automatyzacji testów 409 Symulator daty i godziny 410 Testy dla trzech warstw 411 Testy kompleksowe 411 Dodatek B. Mechanizm oczyszczania 413 Wywołania zwrotne i delegaty 413 Budowanie mechanizmu oczyszczania 415 Problem 415 Proste rozwiązanie 416 Ponowne stosowanie mechanizmu oczyszczania 418 Obsługiwanie zależności między akcjami oczyszczającymi 419 Obsługiwanie wyjątków w akcjach oczyszczających 421 Podsumowanie 422 Dodatek C. Projekt „Test Automation Essentials" 423 Kontekst 423 Struktura projektu 424 Uwaga dotycząca testów jednostkowych i komentarzy XML 425 komplety NuGet 425 Funkcje i narzędzia 425 TestAutomationEssentials.Common 425 TestAutomationEssentials.MSTest 428 TestAutomationEssentials.CodedUI 429 TestAutomationEssentials.Selenium 429 Pomoc w produkowaniu projektu i przenoszenie na inne języki 432 Dodatek D. Wskazówki i praktyki zwiększające wydajność programisty 433 Preferuj korzystanie z klawiatury 433 Poka-Yoke 435 Unikaj wartości Null 436 Unikaj przechwytywania wyjątków 437 Wybieranie najszczególniej adekwatnego lokalizatora 440 Trwale zakodowane ciągi znaków w automatyzacji testów: za i przeciw 443 Indeks 447