Ogólnie
Kiedy masz wystarczająco dużo automatycznych testów, aby mieć pewność co do ciągłości procesu integracji?
Odpowiedź prawdopodobnie stanie się jasna, jeśli pomyślisz o tym, co chcesz być pewny. Ostatecznie odwzorowuje 1-1; każdy test daje pewność co do jednej rzeczy, którą testuje:
- Testy jednostkowe dają pewność, że klasa (lub moduł) robi to, co jest testowana.
- Testy integracyjne dają pewność, że kilka jednostek współpracuje ze sobą w sposób, w jaki jest testowany.
- Kompleksowe testowanie daje pewność, że cała aplikacja wykonuje określone czynności w sposób opisany w teście.
Ze sposobu, w jaki sformułowałeś pytanie, prawdopodobnie myślisz teraz w dużym znaczeniu biznesowym, na przykład:
Chcę mieć pewność, że moja aplikacja może zrobić X .
Więc piszesz test end-to-end, który próbuje wykonać X i sprawdza, czy robi to poprawnie.
Bardziej konkretny
To wszystko jest bardzo autoreferencyjne, ale to dlatego, że do tego się sprowadza. Po prostu nie ma nic więcej.
Na przykład wyobraź sobie, że piszesz aplikację do tworzenia przepisów kulinarnych. Jedną cechą jest to, że jeśli dodasz różne ilości kilku różnych rodzajów sera, daje to odpowiednią temperaturę i czas, aby wszystkie się stopiły.
Możesz więc napisać test jednostkowy CheeseMeltCalculator
, w którym podajesz 100 g sera Gouda i 200 g sera Emmental, a następnie sprawdzasz, czy temperatura i czas się zgadzają. Oznacza to, że możesz być pewny, że CheeseMeltCalculator
działa na 100 g sera Gouda i 200 g sera. Teraz, jeśli powtórzysz ten test z 300 g Gouda zamiast 200 g, możesz być całkiem pewny , że działa on poprawnie dla różnych wartości. Można dodać do testów 0
, -1
a int.MaxValue
g Gouda, aby mieć pewność, że kod nie potknąć się (lub wycieczki prawidłowo zgodnie z przeznaczeniem) do wejścia dziwne.
Możesz napisać test integracji, aby sprawdzić, czy CheeseMeltCalculator
jest on poprawnie włączony do całego procesu obliczania temperatury i czasu żywności. Jeśli to się nie powiedzie, ale CheeseMeltCalculator
powyższe testy są w porządku, możesz mieć pewność, że błąd występuje w innych kalkulatorach lub w sposobie łączenia danych z różnych kalkulatorów.
I na koniec możesz napisać kompleksowy test do stworzenia całej receptury, a jedną z rzeczy, które sprawdzasz, jest temperatura i czas wyniku. Jeśli poprzednie 2 poziomy testów są w porządku, ale idzie to źle, możesz ponownie mieć pewność, że te części są poprawne, a błąd polega na tym, jak obliczenia temperatury są zintegrowane z aplikacją. Na przykład być może dane wejściowe użytkownika nie zostały poprawnie przesłane.
I wreszcie , jeśli wszystkie z tych testów są w porządku, możesz mieć pewność, że „ jeśli dodasz różne ilości kilku różnych rodzajów sera, zapewni to odpowiednią temperaturę i czas, aby wszystkie się stopiły ”
Krótko mówiąc
Chodzi o to, że nie możesz mieć testu „działa poprawnie”. Możesz przetestować tylko „Jeśli zrobię X, Y się zdarzy”.
Jest to jednak dokładnie to, co powinno zawierać specyfikacje techniczne projektu. Oświadczenie typu „ jeśli dodasz różne ilości kilku różnych rodzajów sera, zapewni to odpowiednią temperaturę i czas, aby wszystkie się stopiły ”, nie tylko daje klientowi jasne oczekiwania co do tego, co zrobi gotowy produkt, ale także może zostać obrócony w zautomatyzowane testy.
dodatkowe informacje
Użytkownik Richard dodał te informacje w edycji:
Martin Fowler ma bardzo ładne streszczenie na swojej stronie internetowej na temat najpopularniejszych strategii: https://martinfowler.com/articles/microservice-testing/
Nie chcę tego usuwać, ale chcę powiedzieć: w porównaniu z tą odpowiedzią nie jest to „podsumowanie”, ale raczej bardziej szczegółowe wyjaśnienie, z ładną grafiką i wszystkim innym.
Moja rada byłaby następująca: jeśli po przeczytaniu mojej odpowiedzi wszystko ma dla ciebie sens, to koniec. Jeśli wszystko nadal wydaje się niejasne, odłóż trochę czasu i przeczytaj link do artykułu.
Nie możesz obliczyć żadnych danych, które dadzą ci pewność, której szukasz. Zaufanie buduje się poprzez zrobienie czegoś, a następnie odniesienie sukcesu lub porażki i wyciągnięcie z tego czegoś.
Jedyne znalezione przeze mnie „mierniki”, które dają mi zaufanie do naszego testu, to:
Zautomatyzowane testy nie są srebrną kulą. Musisz śledzić, ile wad produkcyjnych wykryto podczas każdego cyklu wydania. Kiedy liczba ta spada, dostarczasz lepsze oprogramowanie. Zautomatyzowane testy i ciągła integracja to tylko narzędzia, których używasz do dostarczania lepszego oprogramowania.
Jedyną miarą, którą naprawdę można zmierzyć, jest „Czy dostarczasz lepsze oprogramowanie?”
I nawet wtedy jest subiektywny.
źródło
W większości środowisk ekonomicznych nie będziesz mieć budżetu na wdrożenie wystarczającego zaufania (> 99%), ale musisz zarządzać ograniczonym budżetem: Chodzi o stosunek kosztów do korzyści.
Tak więc w rzeczywistości wdrażane będą łatwe / tanie / ryzykowne testy, podczas gdy drogie / mało prawdopodobne testy nie.
Jednym z celów programowych jest stworzenie architektury, którą można łatwo / tanio przetestować (zaprojektować pod kątem testowalności poprzez zastosowanie Test-powered_development ), aby zautomatyzowane testowanie było przystępne.
Zakładam, że Pareto_principle można również zastosować tutaj do oprogramowania, które można konserwować / testować: Mówi się, że wydając dodatkowe 20% więcej pieniędzy, zyskujesz dodatkowe 80% korzyści. Aby osiągnąć pozostałe 20% więcej korzyści, musisz wydać dodatkowe 80% pieniędzy.
Możesz zastosować metryki testowe, takie jak pokrycie kodu i pokrycie mutacji, aby pokazać potencjalny nieprzetestowany kod źródłowy.
Ale nawet przy 100% pokryciu nie możesz być pewien, że Twój kod jest wolny od błędów.
Zarząd lubi kody danych. Jeśli „pokrycie kodu> = 80%” jest egzekwowane przez kierownictwo, a programiści nie obsługują / nie lubią zautomatyzowanego testowania, istnieją sposoby na napisanie kodu testowego o wysokim zasięgu, który nie dowodzi niczego, co daje fałszywe poczucie bezpieczeństwa.
źródło
Sztuką nie jest martwienie się o pełne pokrycie, ale zarządzanie ryzykiem zmian.
Załóżmy, że używasz swojego potoku do wdrożenia dokładnie takiej samej wersji, jaka jest już w produkcji - jakie jest ryzyko błędu regresji? Zero (ponieważ nie ma zmian).
Powiedzmy, że chcę zmienić fragment tekstu na jednym z ekranów. Dodałem test, aby sprawdzić, czy tekst jest teraz wyświetlany poprawnie (załóżmy dla argumentu, że jest to NAPRAWDĘ ważny fragment tekstu). Jakie inne testy muszę sprawdzić, czy nie ma błędów regresji? Realistycznie żaden ...
Tak więc liczba automatycznych testów wymaganych dla każdej wersji do uruchomienia nie zależy od wielkości aplikacji, ale od wielkości zmiany. Jeśli dokonujesz niewielkich zmian o niskim ryzyku, będziesz potrzebować znacznie mniej testów, aby zminimalizować ryzyko.
Ale poczekaj chwilę ... czy ta linia nie pasuje zbytnio do CI i CD?
Tak! Utrzymując wszystkie swoje zmiany i delty na bardzo niskim poziomie, łagodzisz wiele ryzyka regresji poprzez proces zamiast testowania. Co więcej, pytanie tak naprawdę nie dotyczy automatyzacji (to tylko narzędzie, którego użyjemy) - to po prostu kwestia testowania i apetytu na ryzyko. Zupełnie zapomnij o automatyzacji, jakie testy przeprowadziłbyś wobec zmiany, aby upewnić się, że zmiana nie spowodowała problemów? Odpowiedź na to pytanie nie zmienia się z ręcznego procesu testowego na system CI - jedyną zaletą jest to, że wiele z tych testów regresji mogło wcześniej zostać opracowanych w poprzedniej funkcjonalności, a CI zachęca do wprowadzania mniejszych, bezpieczniejszych zmian.
TLDR
Twoje testy mają na celu zmniejszenie ryzyka zmiany. Wdrożenie z deltą zerową nie wiąże się z żadnym ryzykiem, a zatem nie wiąże się z żadnym ryzykiem. Dzięki niewielkim zmianom znacznie łatwiej jest zidentyfikować testy potrzebne do ich zatwierdzenia - ponowne wykorzystanie automatyzacji jest zaletą.
źródło
Jest to ta sama miara, co podczas ręcznego testowania produktu.
Praktycznie, łatwo jest zidentyfikować te strefy o niskim poziomie ufności: zakładając, że wysyłasz produkt, przypuszczam, że masz jakieś ręczne kroki po potoku, które zwiększają twoją pewność bycia nadającym się do wysyłki. Są to obszary, które należy zautomatyzować, aby zwiększyć zaufanie do samego procesu automatycznego.
Twoja automatyzacja to ciągły wysiłek. Rośnie i poprawia się wraz z ulepszaniem produktu. Wada jest powodem do ponownego przemyślenia kodu wraz z ponownym przemyśleniem CI. A po słonecznej stronie jest to, że ponieważ zaufanie do samego produktu jest osiągalne - zaufanie do automatyki jest również możliwe.
źródło