Integracja testów automatycznych w procesie CI/CD zapewnia wczesne wykrywanie defektów przy każdej zmianie kodu. Jest to kluczowe dla nowoczesnych procesów rozwoju i zapewnienia stabilności produktu.
Historia pytania: Tradycyjnie testy automatyczne uruchamiano ręcznie lub za pomocą oddzielnych zadań. Z pojawieniem się koncepcji ciągłej integracji (CI, Continuous Integration) i ciągłego wdrażania (CD, Continuous Deployment) pojawiła się potrzeba automatycznego uruchamiania wszystkich testów przy każdym commit. Obecnie popularne są systemy Jenkins, GitLab CI/CD, GitHub Actions, TeamCity i ich odpowiedniki.
Problem: Bez integracji testów automatycznych błędy są wykrywane późno: problem może nie zauważyć programista i trafi do produkcji. Ręczne uruchamianie opóźnia wydanie i nie daje pełnej pewności co do jakości każdej zmiany.
Rozwiązanie: Integracja testów automatycznych w CI/CD pozwala:
W tym celu testy są przedstawione jako oddzielne zadania w pipeline'ie: zazwyczaj są fazy dla testów jednostkowych, integracyjnych, UI i obciążeniowych. Przykład z .gitlab-ci.yml:
stages: - test - deploy unit_test: stage: test script: - npm run test:unit ui_tests: stage: test script: - npm run test:ui
Kluczowe cechy:
Czy integracja testów automatycznych w CI/CD spowoduje spowolnienie rozwoju?
Nie, prawidłowo skonfigurowany pipeline wykorzystuje równoległość, izolowane środowiska i triggery do uruchamiania tylko niezbędnych testów — to pozwala przyspieszyć wydania dzięki wczesnemu wykrywaniu błędów.
Czy należy uruchamiać wszystkie testy automatyczne na każdym etapie pipeline'u?
Nie, zazwyczaj wczesne etapy (np. gałęzie pull request) wykorzystują szybkie kontrole (linters i testy jednostkowe), a pełne testy regresyjne — tylko przed wydaniem lub na nocnym buildzie.
Czy można ograniczyć się tylko do testów automatycznych w CI/CD, zapominając o ręcznych regresjach?
Nie jest zalecane — automatyzacja jest skuteczna w przypadku powtarzalnych scenariuszy, ale złożone przypadki i kontrole doświadczeń użytkowników nadal wymagają ręcznej weryfikacji.
W projekcie wszystkie testy automatyczne uruchamiano przy każdym commicie, pipeline wydłużał się do 40 minut, programiści musieli czekać na zakończenie testów, aby połączyć swoje gałęzie, co prowadziło do konfliktowych sytuacji i opóźnień w wydaniach.
Plusy:
Minusy:
Zaprojektowano pipeline z podziałem zadań: na gałęziach funkcji uruchamiano tylko szybkie testy, pełną regresję — na stage/prod. Błędy i raporty były przekazywane botom, zespół otrzymywał powiadomienia o błędach i szybko reagował.
Plusy:
Minusy: