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