Lekcja 3.1: Podstawy Testowania Statycznego

Dotychczasowe lekcje koncentrowały się głównie na testowaniu dynamicznym – czyli takim, które wymaga uruchomienia kodu programu i obserwacji jego zachowania.

Jednak proces zapewniania jakości oprogramowania obejmuje również techniki, które można stosować bez konieczności egzekucji kodu.

Mowa o testowaniu statycznym, które stanowi kluczowy element wczesnego wykrywania defektów i podnoszenia jakości produktów pracy na każdym etapie cyklu życia oprogramowania.

Sylabus ISTQB Foundation Level v4.0 poświęca temu zagadnieniu cały rozdział, zaczynając od fundamentalnych podstaw, które zgłębimy w tej lekcji.

Dowiemy się, czym jest testowanie statyczne, jakie są jego cele i korzyści, czym różni się od testowania dynamicznego oraz jakie produkty pracy mogą być mu poddawane.

Definicja i Cele Testowania Statycznego

Jak sama nazwa wskazuje, testowanie statyczne odbywa się „na sucho”, bez uruchamiania aplikacji.

Sylabus definiuje je następująco: „W przeciwieństwie do testowania dynamicznego testowanie statyczne nie wymaga uruchamiania testowanego oprogramowania”.

Zamiast tego, polega ono na analizie i ocenie produktów pracy (work products) – czyli wszelkich dokumentów, modeli czy kodu – w celu znalezienia potencjalnych problemów.

Ta analiza może przybierać dwie główne formy:

  1. Manualne badanie (np. przeglądy): Ludzie (testerzy, programiści, analitycy, użytkownicy) czytają, analizują i dyskutują nad produktem pracy, szukając błędów, nieścisłości, niespójności czy braków. Różne formy przeglądów (nieformalne, przejrzenia, przeglądy techniczne, inspekcje) zostaną szczegółowo omówione w kolejnej lekcji.
  2. Zastosowanie narzędzi (np. analiza statyczna): Specjalistyczne oprogramowanie (analizatory statyczne) automatycznie skanuje kod źródłowy lub inne formalne modele w poszukiwaniu określonych wzorców, potencjalnych błędów, naruszeń standardów kodowania czy luk bezpieczeństwa.

Główne cele testowania statycznego, wymienione w sylabusie, to:

  • Podnoszenie jakości produktów pracy: Poprzez identyfikację i eliminację problemów na wczesnym etapie, zanim zostaną one przekazane dalej w procesie rozwoju.
  • Wykrywanie defektów: Znajdowanie błędów w logice, niespójności w wymaganiach, niejednoznaczności w specyfikacjach, naruszeń standardów w kodzie itp.
  • Ocenianie charakterystyk jakościowych: Analiza takich atrybutów jak czytelność, kompletność, poprawność, testowalność, spójność, utrzymywalność czy bezpieczeństwo produktów pracy.

Co ważne, sylabus podkreśla, że „testowanie statyczne można stosować zarówno w przypadku weryfikacji (czy tworzymy produkt poprawnie?), jak i w przypadku walidacji (czy tworzymy właściwy produkt?)”.

Przeglądając wymagania, możemy walidować, czy odpowiadają one potrzebom użytkownika.

Analizując kod, weryfikujemy, czy jest on zgodny ze standardami i czy poprawnie implementuje projekt.

Testowanie Statyczne w Praktykach Zwinnych

Testowanie statyczne odgrywa również istotną rolę w metodykach zwinnych.

Sylabus wspomina o współpracy testerów, przedstawicieli biznesu i programistów podczas takich aktywności jak:

  • Mapowanie przykładów (Example Mapping): Wspólne tworzenie konkretnych przykładów ilustrujących działanie historyjki użytkownika, co pomaga wykryć niejasności i braki w wymaganiach.
  • Wspólne pisanie historyjek użytkownika: Kolaboracyjne tworzenie opisów funkcjonalności, zapewniające ich zrozumiałość i kompletność.
  • Doprecyzowywanie backlogu (Backlog Refinement): Regularne przeglądanie i uszczegóławianie elementów backlogu produktu, w tym historyjek użytkownika i ich kryteriów akceptacji.

Podczas tych sesji, jak zauważa sylabus, uczestnicy „korzystają z technik przeglądu, aby zyskać pewność, że tworzone historyjki użytkownika są kompletne i zrozumiałe oraz zawierają testowalne kryteria akceptacji”.

Testerzy, „zadając właściwe pytania, mogą również badać, kwestionować i udoskonalać proponowane historyjki użytkownika”.

Jest to przykład wczesnego testowania statycznego wymagań, które zapobiega powstawaniu defektów w późniejszych fazach.

Analiza Statyczna Kodu

Szczególną formą testowania statycznego jest analiza statyczna kodu, wykonywana za pomocą specjalistycznych narzędzi.

Jak podkreśla sylabus, „analiza statyczna pozwala rozpoznać problemy przed rozpoczęciem testowania dynamicznego, a przy tym jest często mniej pracochłonna, ponieważ nie wymaga tworzenia przypadków testowych i odbywa się zwykle z wykorzystaniem narzędzi”.

Narzędzia do analizy statycznej (zwane też linterami, statycznymi analizatorami kodu) potrafią automatycznie wykrywać szeroki zakres problemów w kodzie źródłowym, takich jak:

  • Naruszenia standardów kodowania: Niezgodności z przyjętymi w projekcie lub języku programowania zasadami formatowania, nazewnictwa, struktury kodu.
  • Potencjalne błędy logiczne: Niezainicjowane zmienne, nieosiągalny kod (dead code), nieskończone pętle, potencjalne wycieki pamięci.
  • Luki bezpieczeństwa: Znane wzorce podatności, takie jak SQL Injection, Cross-Site Scripting (XSS), użycie niebezpiecznych funkcji.
  • Zbyt skomplikowany kod: Wysoka złożoność cyklomatyczna, która może wskazywać na trudności w testowaniu i utrzymaniu.
  • Problemy z utrzymywalnością: Duplikacja kodu, brak komentarzy, zbyt długie metody/funkcje.

Sylabus zauważa, że analiza statyczna „jest często elementem mechanizmów ciągłej integracji (CI)”.

Oznacza to, że skanowanie kodu może odbywać się automatycznie przy każdej zmianie, dostarczając programistom natychmiastowej informacji zwrotnej o potencjalnych problemach.

Choć głównym celem jest wykrywanie defektów, analiza statyczna „może również służyć do oceny utrzymywalności i poziomu zabezpieczenia systemu”.

Co ciekawe, sylabus podaje jako przykłady narzędzi do analizy statycznej również „narzędzia do sprawdzania pisowni i czytelności”, co pokazuje szerokie rozumienie tego pojęcia – obejmuje ono wszelkie zautomatyzowane analizy produktów pracy bez ich uruchamiania.

Produkty Pracy Badane Metodą Testowania Statycznego (FL-3.1.1 K1)

Jednym z celów nauczania na poziomie K1 jest rozpoznanie, jakie typy produktów pracy mogą być badane za pomocą testowania statycznego.

Odpowiedź jest bardzo szeroka: „Przy użyciu technik testowania statycznego można zbadać niemal wszystkie produkty pracy”.

Sylabus wymienia przykłady:

  • Specyfikacje wymagań: Dokumenty biznesowe, wymagania systemowe, przypadki użycia, historyjki użytkownika.
  • Kod źródłowy: W różnych językach programowania.
  • Modele: Diagramy UML, modele procesów biznesowych, diagramy przepływu danych.
  • Dokumentacja projektowa: Architektura systemu, specyfikacje interfejsów, szczegółowe projekty modułów.
  • Testware: Plany testów, przypadki testowe, skrypty testowe, dane testowe.
  • Dokumentacja użytkownika: Instrukcje obsługi, materiały szkoleniowe, pomoc online.
  • Strony internetowe: Treść, struktura, linki (bez uruchamiania skryptów po stronie klienta).
  • Kontrakty i umowy: Pod kątem kompletności, spójności i jednoznaczności.

Zasadniczo, każdy produkt pracy, który można przeczytać i przeanalizować, może być poddany testowaniu statycznemu.

Korzyści z Testowania Statycznego

Wprowadzenie testowania statycznego do procesu rozwoju oprogramowania przynosi liczne korzyści:

  • Wczesne wykrywanie defektów: Problemy są identyfikowane na etapie wymagań, projektu lub kodowania, zanim zostaną zaimplementowane i staną się kosztowniejsze do naprawienia.
  • Niższy koszt naprawy defektów: Im wcześniej defekt zostanie wykryty, tym taniej go naprawić.
  • Poprawa jakości produktów pracy: Przeglądy i analiza statyczna prowadzą do tworzenia lepszych, bardziej spójnych i zrozumiałych dokumentów oraz kodu.
  • Zwiększenie produktywności rozwoju: Mniej czasu poświęca się na debugowanie i poprawianie błędów w późniejszych fazach.
  • Lepsze zrozumienie produktu: Proces przeglądu sprzyja wymianie wiedzy i budowaniu wspólnego zrozumienia wymagań i projektu w zespole.
  • Zapobieganie defektom: Analiza przyczyn znalezionych problemów może prowadzić do usprawnień w procesie, które zapobiegną powstawaniu podobnych błędów w przyszłości.
  • Wykrywanie defektów trudnych do znalezienia dynamicznie: Niektóre problemy (np. nieosiągalny kod, naruszenia standardów) są łatwiejsze do wykrycia statycznie niż dynamicznie.

Testowanie Statyczne vs Dynamiczne

Ważne jest zrozumienie kluczowych różnic między testowaniem statycznym a dynamicznym:

Cecha Testowanie Statyczne Testowanie Dynamiczne
Wymaga uruchomienia kodu Nie Tak
Badany obiekt Produkty pracy (kod, dokumenty, modele) Zachowanie działającego systemu
Główny cel Wykrywanie defektów w produktach pracy, poprawa jakości Wykrywanie awarii, ocena jakości działania
Kiedy stosowane Na wczesnych etapach (wymagania, projekt, kodowanie), przed testowaniem dynamicznym Po zaimplementowaniu kodu, na różnych poziomach testów
Typowe techniki Przeglądy, analiza statyczna Techniki czarnoskrzynkowe, białoskrzynkowe, oparte na doświadczeniu
Wykrywane problemy Defekty w logice, niespójności, naruszenia standardów, problemy z utrzymywalnością Awarie (nieprawidłowe działanie), problemy wydajnościowe, problemy z użytecznością

Jak podkreśla sylabus, „testowanie statyczne i dynamiczne wzajemnie się uzupełniają”. Stosowanie obu podejść zapewnia bardziej kompleksowe pokrycie i wyższą jakość końcowego produktu.

Podsumowanie

Testowanie statyczne to technika badania produktów pracy (dokumentów, kodu, modeli) bez uruchamiania oprogramowania.

Jego celem jest wczesne wykrywanie defektów, podnoszenie jakości produktów pracy i ocena charakterystyk jakościowych.

Może być wykonywane manualnie (przeglądy) lub za pomocą narzędzi (analiza statyczna).

Praktycznie każdy produkt pracy może być poddany testowaniu statycznemu.

Główne korzyści to niższy koszt naprawy błędów, poprawa jakości i produktywności.

Testowanie statyczne i dynamiczne są komplementarne i powinny być stosowane razem dla najlepszych rezultatów.

Najczęściej Zadawane Pytania (FAQ)

Czy testowanie statyczne to tylko przeglądy kodu?
Nie. Testowanie statyczne obejmuje przeglądy *wszystkich* produktów pracy (wymagań, projektów, planów testów, dokumentacji użytkownika itp.) oraz automatyczną analizę statyczną kodu za pomocą narzędzi.
Czy analiza statyczna kodu może zastąpić testowanie dynamiczne?
Nie. Analiza statyczna znajduje potencjalne problemy w kodzie, ale nie weryfikuje, czy system działa poprawnie w rzeczywistych warunkach i spełnia wymagania użytkownika. Testowanie dynamiczne jest niezbędne do oceny zachowania działającego systemu.
Kto powinien uczestniczyć w testowaniu statycznym?
W zależności od typu produktu pracy i formy testowania statycznego, mogą uczestniczyć różne role: autorzy, testerzy, programiści, analitycy biznesowi, eksperci domenowi, projektanci UX, a nawet użytkownicy końcowi.
Czy testowanie statyczne jest zawsze formalnym procesem?
Niekoniecznie. Może przybierać formę nieformalnych przeglądów (np. kolega z zespołu rzuca okiem na kod) aż po bardzo sformalizowane inspekcje z określonymi rolami, procedurami i metrykami.
Jakie narzędzia wspierają testowanie statyczne?
Istnieje wiele narzędzi do analizy statycznej kodu (np. SonarQube, Checkstyle, PMD, ESLint), narzędzia do sprawdzania pisowni i gramatyki, a także narzędzia wspierające proces przeglądu (np. systemy do code review jak Gerrit, Crucible).
Czy testowanie statyczne jest przydatne w Agile?
Tak, jest bardzo przydatne. Wczesne przeglądy historyjek użytkownika, kryteriów akceptacji i kodu (np. w ramach code review) pomagają zapobiegać defektom i zapewniają lepszą jakość w krótkich iteracjach.
Czy testowanie statyczne może znaleźć wszystkie defekty?
Nie. Testowanie statyczne jest skuteczne w wykrywaniu pewnych typów defektów (np. w wymaganiach, projekcie, kodzie), ale nie jest w stanie wykryć wszystkich problemów, zwłaszcza tych związanych z interakcją komponentów, środowiskiem czy wydajnością.
Czy można mierzyć efektywność testowania statycznego?
Tak. Można śledzić liczbę i typy defektów znalezionych podczas przeglądów lub przez analizę statyczną, gęstość defektów (liczba defektów na stronę/linię kodu), czas poświęcony na przeglądy, czy koszt naprawy defektów znalezionych statycznie vs dynamicznie.
Co oznacza, że testowanie statyczne wspiera weryfikację i walidację?
Weryfikacja (czy robimy produkt dobrze?) jest wspierana np. przez analizę kodu pod kątem standardów. Walidacja (czy robimy właściwy produkt?) jest wspierana np. przez przegląd wymagań pod kątem potrzeb użytkownika.
Czy testowanie statyczne wymaga specjalistycznej wiedzy?
Efektywne przeprowadzanie przeglądów wymaga umiejętności analitycznych, komunikacyjnych i znajomości przedmiotu przeglądu. Korzystanie z narzędzi do analizy statycznej wymaga ich konfiguracji i interpretacji wyników.

Przykładowe Pytania Egzaminacyjne

Pytanie 1 (K1): Które z poniższych jest przykładem testowania statycznego?

  • a) Wykonanie przypadku testowego sprawdzającego logowanie.
  • b) Przegląd dokumentu wymagań biznesowych.
  • c) Pomiar czasu odpowiedzi systemu pod obciążeniem.
  • d) Testowanie interfejsu użytkownika na różnych przeglądarkach.

Poprawna odpowiedź: b (Przegląd dokumentu to badanie produktu pracy bez jego uruchamiania, co jest definicją testowania statycznego. Pozostałe opcje to przykłady testowania dynamicznego.)

Pytanie 2 (K1): Który z poniższych produktów pracy NIE może być zazwyczaj badany za pomocą testowania statycznego?

  • a) Kod źródłowy programu.
  • b) Plan testów.
  • c) Czas odpowiedzi systemu.
  • d) Historyjka użytkownika.

Poprawna odpowiedź: c (Czas odpowiedzi systemu jest charakterystyką dynamiczną, mierzoną podczas działania systemu. Pozostałe to produkty pracy, które można analizować statycznie.)

Pytanie 3 (K2): Jaka jest główna korzyść z wczesnego wykrywania defektów za pomocą testowania statycznego?

  • a) Zwiększa liczbę testów dynamicznych.
  • b) Zmniejsza koszt naprawy defektów.
  • c) Eliminuje potrzebę testowania dynamicznego.
  • d) Gwarantuje brak defektów w produkcie końcowym.

Poprawna odpowiedź: b (Defekty wykryte i naprawione na wczesnych etapach (np. w wymaganiach, projekcie) są znacznie tańsze w usunięciu niż te znalezione podczas testów systemowych lub przez klienta.)