moje wieloletnie doświadczenie w tworzeniu oprogramowania sugeruje, że w praktyce nie może ono działać.
Próbowałeś tego? Dave i ja napisaliśmy książkę na podstawie wielu wspólnych lat doświadczeń, zarówno nas samych, jak i innych starszych osób w ThoughtWorks, faktycznie wykonując rzeczy, które omawiamy. Nic w książce nie spekuluje. Wszystko, co omawiamy, zostało wypróbowane i przetestowane nawet w dużych, rozproszonych projektach. Ale nie sugerujemy, abyście przyjmowali to na wiarę. Oczywiście powinieneś spróbować sam i napisz, co znajdujesz, a co nie, w tym odpowiedni kontekst, aby inni mogli uczyć się na podstawie twoich doświadczeń.
Continuous Delivery kładzie duży nacisk na automatyczne testy. Mówimy o tym w około 1/3 książki. Robimy to, ponieważ alternatywa - testowanie ręczne - jest droga i podatna na błędy, a właściwie nie jest to świetny sposób na tworzenie wysokiej jakości oprogramowania (jak powiedziała Deming: „Przestań polegać na masowej inspekcji w celu uzyskania jakości. Popraw proces i wbuduj jakość w produkt w pierwszej kolejności ”)
Pełny zasięg testu jest niemożliwy. Musisz poświęcić dużo czasu - a czas to pieniądz - na każdą drobiazg. Jest to cenne, ale czas można poświęcić na poprawę jakości na inne sposoby.
Oczywiście pełne pokrycie testowe jest niemożliwe, ale jaka jest alternatywa: zerowe pokrycie testowe? Występuje kompromis. Gdzieś pomiędzy znajduje się poprawna odpowiedź dla twojego projektu. Uważamy, że ogólnie należy spodziewać się, że spędzisz około 50% swojego czasu na tworzeniu lub utrzymywaniu automatycznych testów. To może wydawać się drogie, dopóki nie weźmiesz pod uwagę kosztu kompleksowych testów ręcznych i naprawiania błędów, które trafiają do użytkowników.
Niektóre rzeczy są trudne do przetestowania automatycznie. Np. GUI. Nawet Selenium nie powie ci, czy twój GUI jest dziwny.
Oczywiście. Sprawdź kwadrant testowy Briana Maricka. Nadal musisz ręcznie przeprowadzić testy eksploracyjne i testy użyteczności. Ale do tego powinieneś używać drogich i cennych ludzi - a nie testów regresyjnych. Kluczem jest to, że musisz zainstalować potok wdrażania, abyś zawracał sobie głowę uruchamianiem drogich ręcznych sprawdzeń poprawności względem kompilacji, które przeszły kompleksowy zestaw automatycznych testów. W ten sposób zmniejszacie zarówno ilość pieniędzy, które wydajecie na ręczne testowanie, jak i liczbę błędów, które kiedykolwiek trafiły do ręcznego testowania lub produkcji (do tego czasu naprawienie ich jest bardzo drogie). Zautomatyzowane testy wykonane prawidłowo są znacznie tańsze w całym cyklu życia produktu, ale oczywiście są to nakłady inwestycyjne, które amortyzują się z czasem.
Dostęp do bazy danych jest trudny do przetestowania bez nieporęcznych urządzeń, a nawet to nie obejmie dziwnych narożnych przypadków w pamięci masowej. Podobnie bezpieczeństwo i wiele innych rzeczy. Tylko kod warstwy biznesowej można skutecznie przetestować jednostkowo.
Dostęp do bazy danych jest niejawnie testowany przez kompleksowe testy akceptacji funkcjonalnej oparte na scenariuszu. Bezpieczeństwo będzie wymagało połączenia testów automatycznych i ręcznych - automatycznych testów penetracyjnych i analizy statycznej w celu wykrycia (np.) Przekroczenia bufora.
Nawet w warstwie biznesowej większość kodu nie jest prostymi funkcjami, których argumenty i zwracane wartości można łatwo izolować do celów testowych. Możesz spędzać dużo czasu na budowaniu fałszywych obiektów, które mogą nie odpowiadać rzeczywistym implementacjom.
Oczywiście testy automatyczne są drogie, jeśli źle zbudujesz swoje oprogramowanie i testy. Zdecydowanie polecam przeczytanie książki „rosnące oprogramowanie obiektowe oparte na testach”, aby dowiedzieć się, jak zrobić to dobrze, aby z czasem utrzymać testy i kod.
Testy integracyjne / funkcjonalne uzupełniają testy jednostkowe, ale ich uruchomienie zajmuje dużo czasu, ponieważ zazwyczaj wymagają ponownego zainicjowania całego systemu w każdym teście. (Jeśli nie zainicjujesz ponownie, środowisko testowe jest niespójne.)
Jeden z produktów, nad którymi pracowałem, zawiera pakiet 3500 kompleksowych testów akceptacyjnych, których uruchomienie zajmuje 18 godzin. Prowadzimy go równolegle na siatce 70 skrzynek i otrzymujemy informacje zwrotne w odległości 45 metrów. Wciąż dłużej niż ideał, dlatego uruchamiamy go jako drugi etap w przygotowaniu po testach jednostkowych w ciągu kilku minut, więc nie marnujemy naszych zasobów na kompilację, w której nie mamy podstawowego poziomu zaufanie do.
Refaktoryzacja lub wszelkie inne zmiany psują wiele testów. Spędzasz dużo czasu na ich naprawianiu. Jeśli chodzi o sprawdzanie znaczących zmian specyfikacji, to dobrze, ale często testy są przerywane z powodu bezsensownych szczegółów implementacyjnych niskiego poziomu, a nie rzeczy, które naprawdę dostarczają ważnych informacji. Często poprawianie koncentruje się na przerobieniu wewnętrznych elementów testu, a nie na prawdziwym sprawdzaniu testowanej funkcjonalności.
Jeśli kod i testy są dobrze zamknięte i luźno powiązane, refaktoryzacja nie przerwie wielu testów. W naszej książce opisujemy, jak zrobić to samo w przypadku testów funkcjonalnych. Jeśli testy akceptacyjne się zepsują, oznacza to, że brakuje jednego lub więcej testów jednostkowych, więc część płyty CD wymaga ciągłego ulepszania zakresu testów, aby próbować znaleźć błędy wcześniej w procesie dostarczania, w którym testy są bardziej szczegółowe i błędy są tańsze do naprawienia.
Raporty terenowe dotyczące błędów nie mogą być łatwo dopasowane do precyzyjnej mikro-wersji kodu.
Jeśli testujesz i częściej zwalniania (część punktu CD), to jest stosunkowo proste do zidentyfikowania zmian, który spowodował błąd. Celem CD jest optymalizacja cyklu sprzężenia zwrotnego, abyś mógł zidentyfikować błędy tak szybko, jak to możliwe po ich sprawdzeniu w kontroli wersji - i rzeczywiście najlepiej przed ich zalogowaniem (dlatego przeprowadzamy testy kompilacji i testów jednostkowych przed odprawą).