Analiza statyczna kodu w QA - jak wdrożyć ją w CI/CD

Analiza statyczna kodu Java w IDE. Wykryto ostrzeżenia o nieużywanych zmiennych i pustych klasach.

Autor

Juliusz Król

Opublikowano

23 paź 2026

Spis treści

Gdy błąd trafia do testów systemowych albo na produkcję, jego naprawa zwykle kosztuje więcej niż poprawienie kilku linijek kodu na początku pracy. Analiza statyczna pozwala sprawdzać kod źródłowy bez uruchamiania aplikacji, dlatego jest jednym z najprostszych sposobów na wcześniejsze wykrywanie defektów, problemów jakościowych i potencjalnych luk bezpieczeństwa. Pokażę, co dokładnie badają takie narzędzia, jak włączyć je do procesu QA oraz gdzie kończą się ich możliwości.

Największą wartość daje połączenie skanowania z dobrym procesem QA

  • Bez uruchamiania programu można wykryć błędy składni, problemy typów, duplikację kodu i część podatności.
  • SAST skupia się na bezpieczeństwie, a linters i analizatory jakości obejmują również czytelność, standardy i utrzymanie kodu.
  • Najlepszy moment na skanowanie to lokalna praca programisty oraz pipeline CI przed scaleniem zmian.
  • Fałszywe alarmy trzeba filtrować, bo zbyt duża liczba nieistotnych wyników szybko obniża zaufanie do narzędzia.
  • Raport nie zastępuje testów jednostkowych, integracyjnych, end-to-end ani ręcznego przeglądu.

Czym jest statyczne badanie kodu i co właściwie sprawdza

To kontrola programu na podstawie jego kodu źródłowego, kodu pośredniego albo plików konfiguracyjnych, ale bez wykonywania aplikacji. Narzędzie analizuje między innymi składnię, strukturę projektu, przepływ danych, zależności między funkcjami oraz zgodność z ustalonymi regułami.

Najprostszy przykład to linter, który sygnalizuje nieużywaną zmienną, zbyt długą funkcję albo niezgodny styl zapisu. Bardziej zaawansowane rozwiązania budują drzewo składniowe i śledzą przepływ danych, dzięki czemu mogą zauważyć, że dane od użytkownika trafiają do zapytania SQL bez odpowiedniej ochrony.

W praktyce rozróżniam kilka grup kontroli:

  • Błędy kompilacji i typów, czyli problemy, które mogą uniemożliwić zbudowanie aplikacji albo prowadzić do nieprzewidywalnych wyników.
  • Problemy utrzymaniowe, takie jak duplikacja, nadmierna złożoność, martwy kod i naruszenia konwencji.
  • Reguły bezpieczeństwa, na przykład ryzykowne operacje na danych wejściowych, niebezpieczna deserializacja czy sekrety zapisane w repozytorium.
  • Zgodność ze standardami, gdy projekt musi spełniać określone reguły branżowe lub firmowe.

Nie każdy wynik oznacza realny defekt. Część komunikatów to sugestie poprawy, a część może być fałszywym alarmem. Dlatego traktuję skaner jako system wczesnego ostrzegania, a nie automatycznego arbitra, który bez kontekstu rozstrzyga, czy kod jest dobry.

Jaką rolę pełni ta metoda w procesach QA

W dobrze poukładanym QA statyczne kontrole działają przed testami uruchomieniowymi. Programista dostaje informację zwrotną już podczas pracy lub przy tworzeniu pull requesta, a zespół nie czeka z wykryciem prostego problemu do końca sprintu.

Największą korzyścią jest krótka pętla informacji zwrotnej. Jeżeli narzędzie wykryje nieużywaną zmienną po kilku minutach, poprawka jest tania. Jeżeli podobny problem zostanie znaleziony dopiero po integracji kilku modułów, trzeba już analizować logi, odtwarzać środowisko i ustalać, która zmiana go wywołała.

W procesie QA wyniki można wykorzystać na kilku poziomach:

  • Przed commitem uruchamiać szybkie reguły lokalne, które nie spowalniają pracy.
  • W pull requeście sprawdzać tylko zmienione pliki i blokować oczywiste błędy.
  • W CI/CD wykonywać pełniejszy skan całego projektu, wraz z raportem jakości i bezpieczeństwa.
  • W przeglądzie kodu używać wyników jako listy punktów do omówienia, a nie jako zamiennika rozmowy technicznej.

Dobrym rozwiązaniem jest ustalenie jasnych progów. Przykładowo nowa zmiana może nie przejść dalej, jeśli zawiera krytyczną podatność, błąd kompilacji albo nową regułę o wysokim priorytecie. Mniej istotne ostrzeżenia można zebrać w backlogu, zamiast blokować każdą zmianę.

To rozróżnienie ma znaczenie dla zespołu. Gdy pipeline zatrzymuje pracę z powodu dziesiątek kosmetycznych komunikatów, ludzie zaczynają omijać ostrzeżenia. Gdy blokuje tylko problemy naprawdę ważne, narzędzie staje się częścią jakości, a nie przeszkodą administracyjną.

Co można wykryć na konkretnych przykładach

Załóżmy, że aplikacja przyjmuje parametr wyszukiwania od użytkownika. Prosty wzorzec może wskazać bezpośrednie składanie zapytania SQL z tekstu wejściowego. Nie oznacza to jeszcze, że podatność na pewno istnieje, ale daje testerowi i programiście konkretny punkt do weryfikacji.

W innym miejscu skaner może wykryć klucz API wpisany w pliku konfiguracyjnym. Taki wynik jest szczególnie istotny, bo sekret może trafić do historii repozytorium i pozostać dostępny nawet po usunięciu go z najnowszej wersji. Wtedy sama korekta kodu nie wystarczy, często trzeba również unieważnić klucz.

Przykład wyniku Co może oznaczać Co robi zespół QA
Nieobsłużony wyjątek Awaria w nieoczekiwanej ścieżce wykonania Sprawdza scenariusz negatywny i dodaje test regresji
Duplikacja kodu Ryzyko niespójnych poprawek w kilku miejscach Ocena, czy refaktoryzacja zmniejszy koszt utrzymania
Niebezpieczne dane wejściowe Możliwość wstrzyknięcia polecenia lub zapytania Weryfikacja walidacji, parametryzacji i test bezpieczeństwa
Zbyt duża złożoność funkcji Trudniejsze testowanie i większe ryzyko pominięcia ścieżki Podział logiki oraz uzupełnienie pokrycia testami
Niebezpieczna biblioteka Znana podatność w zależności projektu Aktualizacja, zamiana biblioteki albo świadoma akceptacja ryzyka

Ten ostatni przypadek dotyczy analizy zależności, która jest blisko związana ze statycznym skanowaniem, ale nie bada wyłącznie kodu napisanego przez zespół. Nie należy mieszać tych raportów, bo inny jest sposób naprawy błędu w kodzie, a inny w zewnętrznym pakiecie.

Ważne są też reguły dotyczące jakości. Narzędzie może wskazać metodę liczącą kilkaset linii, wiele zagnieżdżonych warunków albo nieużywane fragmenty. Nie każdy taki przypadek wymaga natychmiastowej przebudowy, lecz w obszarze krytycznym dla biznesu jest sygnałem, że testowanie będzie trudniejsze i droższe.

Schemat CI/CD: rozwój, przegląd kodu, QA (analiza statyczna, testy), preprodukcja i produkcja z auto-deploy.

Jak wdrożyć skanowanie w pipeline bez blokowania zespołu

Najrozsądniej zacząć od jednego repozytorium i ograniczonego zestawu reguł. Próba włączenia wszystkiego w całej organizacji zwykle kończy się ogromnym raportem, którego nikt nie ma czasu przeczytać. Ja zaczynam od problemów, które mają największy wpływ na bezpieczeństwo i stabilność produktu.

  1. Ustal cel kontroli. Zdecyduj, czy priorytetem są błędy programistyczne, bezpieczeństwo, zgodność ze standardem czy redukcja długu technicznego.
  2. Dobierz narzędzie do stosu technologicznego. ESLint i TypeScript pasują do projektów JavaScript, Pylint i mypy do Pythona, a rozwiązania takie jak SonarQube, Semgrep czy CodeQL sprawdzają się przy szerszym zestawie reguł.
  3. Uruchom skan lokalnie. Programista powinien móc zobaczyć problem przed wysłaniem zmian do zdalnego repozytorium.
  4. Dodaj kontrolę do CI. Pipeline powinien sprawdzać kod przy każdym pull requeście, a pełny skan można wykonywać również cyklicznie.
  5. Ustal zasady jakości. Określ, które problemy blokują scalanie, które wymagają komentarza, a które są tylko rekomendacją.
  6. Przeglądaj reguły. Wyłączaj te, które generują głównie nieistotne wyniki, i dodawaj własne kontrole tam, gdzie projekt ma specyficzne ryzyko.

W małym projekcie podstawowy zestaw może działać w kilkadziesiąt sekund, natomiast duży monorepo z wieloma językami potrzebuje często kilku minut lub osobnych etapów pipeline'u. Czas zależy od liczby plików, głębokości analizy, cache'a i sposobu budowania projektu, więc nie warto obiecywać jednego uniwersalnego wyniku.

Dobre wdrożenie powinno pokazywać różnicę między problemami starymi a nowymi. Jeżeli repozytorium ma tysiące historycznych ostrzeżeń, można ustawić punkt odniesienia i wymagać, aby każda nowa zmiana nie pogarszała stanu kodu. To praktyczniejsze niż próba naprawienia całego długu technicznego w jednym sprincie.

Analiza statyczna a testy dynamiczne i ręczny przegląd

Te metody nie konkurują ze sobą. Każda odpowiada na inne pytanie, dlatego w QA największą wartość daje ich połączenie.

Metoda Co sprawdza Czego zwykle nie pokaże
Analizator statyczny Strukturę kodu, wzorce błędów, przepływ danych i zgodność z regułami Rzeczywiste zachowanie aplikacji pod obciążeniem
Test dynamiczny Program działający w określonym środowisku i dla konkretnych danych Część nieuruchomionych ścieżek oraz problemy ukryte w kodzie
Przegląd ręczny Kontekst biznesowy, sens rozwiązania i nietypowe ryzyka Powtarzalne kontrole na dużą skalę

Statyczne reguły mogą wykryć ryzykowny sposób budowania ścieżki pliku, ale nie sprawdzą, czy użytkownik faktycznie może dotrzeć do tej funkcji przez interfejs. Test dynamiczny może ujawnić błąd sesji, którego nie widać w samym kodzie, a reviewer może zauważyć, że logika uprawnień jest formalnie poprawna, lecz niezgodna z procesem biznesowym.

Najczęstszy błąd polega na uznaniu, że zielony raport oznacza bezpieczną aplikację. Zielony skan oznacza tylko brak problemów według określonego zestawu reguł. Nie mówi, że wszystkie ścieżki zostały przetestowane ani że wymagania biznesowe są spełnione.

Najczęstsze pułapki i warunki skutecznego wdrożenia

Pierwszą pułapką jest traktowanie wszystkich ostrzeżeń jednakowo. Błąd bezpieczeństwa o wysokim ryzyku nie powinien mieć tego samego priorytetu co sugestia zmiany nazwy zmiennej. Potrzebna jest klasyfikacja według wpływu i prawdopodobieństwa, inaczej raport szybko zamienia się w ścianę komunikatów.

Drugi problem to brak właściciela wyników. Każdy zespół powinien wiedzieć, kto potwierdza alarm, kto poprawia kod i kto może zaakceptować ryzyko. Samo wysłanie raportu na kanał projektowy nie tworzy procesu QA.

Trzecia pułapka to zbyt późne uruchamianie narzędzia. Jeżeli skan pojawia się dopiero przed wydaniem, jego wyniki konkurują z presją czasu. Kontrola przy pull requeście daje znacznie lepszy efekt, bo problem jest jeszcze powiązany z konkretną zmianą i autorem.

Trzeba też uważać na fałszywe poczucie kompletności. Narzędzie może nie rozumieć niestandardowego frameworka, kodu generowanego automatycznie albo zależności ładowanych dopiero w środowisku produkcyjnym. W takich miejscach potrzebne są dodatkowe testy, dokumentacja wyjątków i ręczna ocena.

Warto mierzyć nie tylko liczbę znalezionych problemów, lecz także czas ich naprawy, liczbę powtarzających się alarmów i defekty wykryte po wydaniu. Jeżeli raportów przybywa, ale błędy nadal trafiają do produkcji, zespół powinien sprawdzić jakość reguł i sposób interpretacji wyników.

Od czego zacząć, żeby kontrola kodu dawała realny efekt

Najlepszy start to mały, mierzalny eksperyment. Wybierz jeden serwis, zdefiniuj kilka krytycznych reguł i ustal, że pipeline blokuje wyłącznie najpoważniejsze problemy. Po dwóch lub trzech iteracjach łatwiej ocenić, które komunikaty pomagają, a które tylko zwiększają hałas.

W mojej ocenie największą różnicę robi nie sama marka narzędzia, lecz jakość zasad i konsekwencja zespołu. Lepiej mieć kilkanaście trafnych kontroli, które programiści rozumieją i poprawiają, niż setki ostrzeżeń ignorowanych przy każdym wdrożeniu.

Statyczne sprawdzanie kodu powinno być jednym z punktów kontroli jakości, obok testów, przeglądu zmian, monitoringu i testów bezpieczeństwa. Wtedy skraca drogę od wykrycia problemu do poprawki, ogranicza koszt późnych błędów i pomaga budować kod, który łatwiej rozwijać bez dokładania kolejnych warstw ryzyka.

Artykuł ma charakter wyłącznie informacyjny i edukacyjny. Materiał został opracowany przy wsparciu nowoczesnych narzędzi analitycznych i językowych (AI). Przed podjęciem decyzji skonsultuj się z ekspertem.

FAQ - Najczęstsze pytania

Narzędzia mogą wskazać błędy składni i typów, duplikację, martwy kod, nadmierną złożoność oraz naruszenia ustalonych konwencji. Reguły bezpieczeństwa wykrywają między innymi ryzykowne dane wejściowe, niebezpieczną deserializację i sekrety zapisane w repozytorium.

Szybkie reguły warto uruchamiać lokalnie przed commitem, a w pull requeście sprawdzać przede wszystkim zmienione pliki. Pełniejszy skan całego projektu powinien działać w CI/CD, przy każdym pull requeście lub cyklicznie, zależnie od rozmiaru repozytorium.

Pipeline powinien blokować zmiany zawierające na przykład krytyczną podatność, błąd kompilacji albo nową regułę o wysokim priorytecie. Mniej istotne ostrzeżenia można kierować do backlogu, a przy dużym długu technicznym ustawić zasadę, że nowe zmiany nie pogarszają istniejącego stanu kodu.

Analiza statyczna bada strukturę kodu, wzorce błędów, przepływ danych i zgodność z regułami bez wykonywania programu. Testy dynamiczne sprawdzają działającą aplikację w konkretnym środowisku, a przegląd ręczny pozwala ocenić kontekst biznesowy i nietypowe ryzyka, których automatyczne reguły mogą nie rozpoznać.

Oceń artykuł

Ocena: 0.00 Liczba głosów: 0

Tagi:

sast ci/cd podatności dług techniczny linting

Udostępnij artykuł

Juliusz Król

Juliusz Król

Nazywam się Juliusz Król i od 4 lat zajmuję się automatyzacją testów oraz zapewnieniem jakości oprogramowania. Moje zainteresowanie tymi tematami zrodziło się z potrzeby zrozumienia, jak technologia może wspierać procesy tworzenia oprogramowania i jak kluczowe jest zapewnienie jego wysokiej jakości. W swoich tekstach skupiam się na praktycznych rozwiązaniach, które pomagają innym w efektywnym wdrażaniu automatyzacji oraz w rozwiązywaniu problemów związanych z jakością. Dzięki mojemu doświadczeniu staram się przekazywać wiedzę w sposób przystępny i zrozumiały, porównując różne podejścia oraz analizując aktualne trendy w branży. Zawsze dbam o to, aby moje materiały były rzetelne, aktualne i pomocne dla czytelników, którzy pragną rozwijać swoje umiejętności w obszarze QA.

Napisz komentarz