Dlaczego miałbyś uruchamiać testy jednostkowe na serwerze CI?
Z pewnością, zanim coś zostanie zobowiązane do opanowania, programista przeprowadził już wszystkie testy jednostkowe i naprawił wszelkie błędy, które mogły wystąpić w ich nowym kodzie. Czy nie o to chodzi w testach jednostkowych? W przeciwnym razie właśnie popełnił uszkodzony kod.
master
powinien być zawsze rozsądny i najlepiej automatycznie wdrażany przy każdym połączeniu w środowisku pomostowym w celu wewnętrznej kontroli jakości i testowania.Odpowiedzi:
Albo nie. Może być wiele przyczyn, dla których tak się dzieje:
Ale prawdziwym celem jest uruchomienie testów na komputerze, który nie jest maszyną programistyczną. Ten, który jest skonfigurowany inaczej.
Pomaga to wychwycić problemy, w których testy i / lub kod zależą od czegoś specyficznego dla pudełka programisty (konfiguracja, dane, strefa czasowa, ustawienia regionalne, cokolwiek innego).
Inne ważne powody, dla których kompilacje CI uruchamiają testy:
źródło
Jako programista, który nie przeprowadza wszystkich testów integracji i testów jednostkowych przed zatwierdzeniem kontroli źródła, zaoferuję tutaj swoją obronę.
Musiałbym zbudować, przetestować i sprawdzić, czy aplikacja działa poprawnie na:
Dodaj Fortran (zarówno z kompilatorami Intela, jak i GNU), Python (i różne wersje w zależności od systemu operacyjnego) oraz komponenty skryptu bash / bat i myślę, że widać spiralne zmiany
A więc to szesnaście maszyn, które musiałbym mieć, żeby przeprowadzić kilka testów kilka razy dziennie. Zarządzanie infrastrukturą byłoby prawie pełnym etatem. Myślę, że prawie każdy zgodziłby się z tym, że jest to nierozsądne, zwłaszcza pomnożenie go przez liczbę osób w projekcie. Dlatego pozwalamy naszym serwerom CI wykonać pracę.
Testy jednostkowe nie zatrzymują Państwo popełnienia złamany kod, oni powiedzieć, czy oni wiedzą, złamałeś coś. Ludzie mogą powiedzieć „testy jednostkowe powinny być szybkie” i mówić o zasadach, wzorcach projektowych i metodach, ale w rzeczywistości czasem lepiej jest pozwolić komputerom, które zaprojektowaliśmy do powtarzalnych, monotonnych zadań, wykonywać te zadania i angażować się tylko wtedy, gdy powiedz nam, że coś znaleźli.
źródło
Oprócz doskonałej odpowiedzi Oded:
Kiedyś pracowałem w firmie, która miała wiele błędów podczas wdrażania z powodu procesu łączenia i wdrażania. Było to spowodowane dziwnym, zastrzeżonym szkieletem, który utrudniał testowanie i CI. Nie było przyjemnym doświadczeniem, że kod, który działał doskonale przy programowaniu, nie dotarł bezpośrednio do produkcji.
źródło
Można by pomyśleć, że nie, ale programiści są ludźmi i czasami zapominają.
Ponadto programiści często nie pobierają najnowszego kodu. Ich ostatnie testy mogą działać poprawnie, a następnie w momencie odprawy ktoś inny dokonuje przełomowej zmiany.
Twoje testy mogą również opierać się na lokalnym (niezaznaczonym) zasobie. Coś, czego nie wykryłyby testy lokalnych jednostek.
Jeśli uważasz, że wszystko powyższe jest fantazyjne, istnieje poziom powyżej CI (przynajmniej w TFS) o nazwie Gated, gdzie kompilacje, które nie przeszły pomyślnie testów, są odkładane na półkę i nie są przypisywane do bazy kodu.
źródło
Zazwyczaj konfiguruję CI, aby uruchamiał się przy każdym zatwierdzeniu. Gałęzie nie łączą się w master, dopóki gałąź nie zostanie przetestowana. Jeśli polegasz na przeprowadzaniu testów na systemie głównym, otwiera się okno, w którym kompilacja może zostać uszkodzona.
Przeprowadzenie testów na komputerze CI dotyczy powtarzalnych wyników. Ponieważ serwer CI ma znane czyste środowisko pobrane z VCS, wiesz, że wyniki testu są poprawne. Podczas uruchamiania lokalnego możesz zapomnieć o zatwierdzeniu kodu potrzebnego do przekazania lub mieć niezatwierdzony kod, który powoduje, że przechodzą, gdy powinny zawieść.
Może także zaoszczędzić czas programistów, uruchamiając równolegle różne pakiety, szczególnie jeśli niektóre są powolnymi, wielominutowymi testami, które prawdopodobnie nie będą uruchamiane lokalnie po każdej zmianie.
W mojej obecnej pracy nasze wdrożenie produkcyjne jest testowane, gdy CI przejdzie wszystkie testy. Skrypty wdrażania zapobiegną wdrożeniu, chyba że zostaną przekazane. Uniemożliwia to przypadkowe zapomnienie ich uruchomienia.
CI będące częścią przepływu pracy odciąża również programistów. Czy jako programista zwykle przeprowadzasz linijkę, analizator statyczny, test jednostkowy, pokrycie kodu i test integracji dla każdej pojedynczej zmiany? CI może całkowicie automatycznie i bez konieczności myślenia o tym - zmniejszając zmęczenie decyzją.
źródło
Zanim coś zobowiązuje się do opanowania, programista powinien już przeprowadzić wszystkie testy jednostkowe ... ale co jeśli nie? Jeśli nie uruchomisz testów jednostkowych na serwerze CI, nie będziesz wiedział, dopóki ktoś inny nie pobierze zmian na ich komputerze i nie odkryje, że testy po prostu się na nich zepsuły.
Ponadto deweloper mógł popełnić błąd i odniósł się do lokalnego zasobu specyficznego dla ich komputera. Gdy sprawdzą kod, a uruchomienie CI nie powiedzie się, problem zostanie natychmiast zidentyfikowany i można go rozwiązać.
źródło
Zakładając (w przeciwieństwie do innych odpowiedzi), że programiści są dość zdyscyplinowani i przeprowadzają testy jednostkowe przed zatwierdzeniem, może być kilka przyczyn:
źródło
Można sobie wyobrazić przypadki, w których zmiana A nie przerywa testu, a zmiana B nie przerywa testu, ale A i B razem . Jeśli A i B są tworzone przez różnych programistów, tylko serwer CI wykryje nowy błąd. A i B mogą być nawet dwiema częściami tego samego dłuższego zdania.
Wyobraź sobie pociąg prowadzony przez dwie lokomotywy A i B. Może jeden jest więcej niż wystarczający i jest to poprawka do zastosowania. Jeśli jednak zastosowane zostaną dwie „poprawki” usuwające obie, pociąg się nie ruszy.
Ponadto nie wszyscy programiści wykonują wszystkie testy jednostkowe, podczas gdy większość dobrych programistów.
źródło
Zadajmy równoważne pytanie:
Istnieje kilka powodów, dla których warto wykonać CI, ale głównym celem CI jest zrozumienie, jaki jest stan kodu w czasie. Główną korzyścią (spośród kilku), jaką zapewnia, jest to, że możemy dowiedzieć się, kiedy kompilacja się psuje, dowiedzieć się, co ją zepsuło, a następnie naprawić.
Jeśli kod nigdy nie jest uszkodzony, dlaczego w ogóle używamy CI? Aby dostarczyć kompilacje do testowania, kompilacje nocne byłyby wystarczające.
źródło