Kiedy masz wystarczająco dużo automatycznych testów, aby mieć pewność co do ciągłości procesu integracji?

10

Ciągła integracja z testowaniem jest przydatna, aby upewnić się, że kod „wysyłalny” jest cały czas sprawdzany.

Jednak naprawdę trudno jest utrzymać kompleksowy zestaw testów i często wydaje się, że kompilacja i tak będzie wadliwa.

Ile testów powinieneś czuć się pewnie podczas testowania rurociągów CI? Czy używasz jakiegoś rodzaju danych, aby zdecydować, kiedy jest wystarczająca liczba testów?

kamienne owoce
źródło

Odpowiedzi:

16

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 CheeseMeltCalculatordział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, -1a int.MaxValueg 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 CheeseMeltCalculatorjest on poprawnie włączony do całego procesu obliczania temperatury i czasu żywności. Jeśli to się nie powiedzie, ale CheeseMeltCalculatorpowyż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.

R. Schmitz
źródło
To dobry pogląd koncepcyjny. Czy masz przykładowe wskaźniki, które byłyby przydatne, aby zapewnić zaufanie do naszego zakresu testów?
stonefruit
@stonefruit Nie bardzo, ale myślę, że mam dokładnie taką odpowiedź, jakiej potrzebujesz: Testivus o pokryciu testowym
R. Schmitz
@stonefruit Jeśli chodzi o liczbę w tej przypowieści, 80%, jest to liczba, którą częściej słyszysz w tym kontekście. Głównie z powodu zasady pareto - ostatnie 20% pokrycia stanowi 80% pracy. Innymi słowy, jest to 4 razy więcej pracy, aby uzyskać go z 80% do 100%, tak jak to było, aby uzyskać go do 80% w pierwszej kolejności. To często przesada, ale wyobraź sobie, że piszesz kod kontrolny dla satelity: Jeśli pojawi się błąd, nie możesz tego po prostu naprawić; uzyskanie 100% pokrycia jest zatem opłacalną inwestycją.
R. Schmitz
Wygląda na to, że jestem trzecim programistą. ha ha. Pod koniec dnia powraca do podejścia opartego na ryzyku, jak wspomniałeś na przykładzie satelitarnym.
stonefruit
1
@stonefruit Być może jednak jesteś pierwszy. Jeśli masz już projekt objęty 0%, nie zaczynaj marszu śmierci do 80%. Zamiast tego naprawdę „ po prostu napisz kilka dobrych testów ”. Może wykorzystaj ostatnią połowę piątku do napisania testów, coś w tym rodzaju. Z mojego doświadczenia wynika, że ​​automatycznie wymyślisz testy z najlepszym stosunkiem wysiłku do nagrody, a każdy test da ci trochę więcej pewności siebie.
R. Schmitz
4

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:

  1. Liczba stwierdzonych wad w produkcji
  2. Czy potrafisz zmienić bazę kodu i polegać na zasięgu testu, aby wykryć wady regresji?

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.

Greg Burghardt
źródło
W porównaniu z innymi odpowiedziami ta odpowiedź dotyczy możliwych wskaźników. Zastanawiałem się nad tym, aby sugerowane wskaźniki były bardziej znaczące. Być może oprócz znalezienia liczby wad wykrytych w produkcji, nadaj każdej z nich punktację na podstawie zarządzania ryzykiem i ustal próg (np. 30 punktów wad wykrytych w ciągu ostatnich 3 miesięcy). Osiągnięcie progu może wskazywać na dokonanie przeglądu systemu pod kątem ewentualnych błędów, zanim zadłużenie techniczne kodu błędów wzrośnie wykładniczo.
stonefruit
2

Kiedy masz wystarczająco dużo automatycznych testów, aby mieć pewność co do ciągłości procesu integracji?

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.

  • Niektóre zautomatyzowane testy są tanie w realizacji, a niektóre są wyjątkowo kosztowne.
  • W zależności od faktycznego zarządzania ryzykiem niektóre ryzyka muszą być objęte testami, a inne nie.

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.

k3b
źródło
1

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ą.

Liath
źródło
0

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.

dzisiaj
źródło