Architektura systemu i podsumowanie prototypu:
Niniejsza praca przedstawia ulepszony i adaptacyjny prototyp systemu PreventativeTestPro, który egzemplifikuje proaktywne podejście do inżynierii jakości, wykorzystujące dane z obserwowalności oraz duże modele językowe (LLM) w celu dalszej poprawy procesu rozwiązywania zgłoszeń problemów technicznych. System ma na celu rozwiązanie współczesnych problemów związanych z dostarczaniem oprogramowania poprzez automatyzację wykrywania anomalii, analizę przyczyn źródłowych oraz inteligentne opracowywanie i wykonywanie przypadków testowych dla obszarów nieobjętych pokryciem, z wykorzystaniem syntetycznego monitorowania, danych z obserwowalności oraz integracji z GenAI. Architektura jest modułowa i składa się z trzech głównych komponentów: Kolektora i Analizatora Danych Obserwowalności, Warstwy Inteligencji opartej na GenAI oraz Silnika Orkiestracji i Wykonywania Testów, co zostało szczegółowo określone na Rysunku 1.

Rycina 1Wejście-wyjście proponowanego systemu. Dane dotyczące obserwowalności, wraz z wynikami obserwatora, repozytorium testów i reguł mapowania, są dostarczane jako dane wejściowe wraz z platformami testowymi BHRAMARI, które konstruują sterowane przez AI środowiska testowe w celu zwiększenia odporności przypadków testowych. Proponowany system generuje instrumentację anomalii, rekomendacje generowane przez AI, wykonanie odpowiednich przypadków testowych, dokumentację i raportowanie, a także identyfikację i tworzenie brakujących przypadków testowych. Kliknij tutaj, aby wyświetlić powiększoną wersję tej ryciny.
Rysunek 2 przedstawia architekturę proponowanego podejścia. Rysunek ilustruje wejście, przetwarzanie i wyjście systemu. Stanowi on również kompleksowy opis systemu, który został następnie przełożony na wyjaśnienie w celu lepszego zrozumienia podstawowych funkcji.

Rysunek 2Architektura proponowanego systemu z kolektorem i analizatorem danych obserwowalności, warstwą inteligencji opartą na GenAI oraz silnikiem orkiestracji i wykonywania testów. Rysunek ten przedstawia wewnętrzną architekturę systemu PreventativeTestPro, podzieloną na trzy warstwy: Warstwa Kolektora Obserwowalności (Observability Collector Layer) agreguje dane z wielu źródeł, w tym zdarzenia przeglądarki, logi, pliki HAR, logi backendowe, metryki oraz ślady. Warstwa Inteligencji Generatywnej AI (Generative AI Intelligence Layer) wykorzystuje te dane do przeprowadzania analizy przyczyn źródłowych, priorytetyzowania anomalii oraz autonomicznego tworzenia przypadków testowych (UI, API, manualnych) i dokumentacji przy użyciu modeli LLM. Moduł BHARAMARI ustanawia również nowe środowiska testowe. Silnik Orkiestracji i Wykonywania Testów (Test Orchestration and Execution Engine) przypisuje rozbieżności do przypadków testowych, wykonuje testy równolegle, ocenia wyniki i informuje zespoły inżynieryjne, systemy zgłoszeniowe oraz pulpity nawigacyjne w celu nadzoru w czasie rzeczywistym i monitorowania rozwiązywania problemów. Kliknij tutaj, aby wyświetlić powiększoną wersję tej ryciny.
Moduł kolektora i analizatora danych obserwowalności pełni funkcję systemu sensorycznego platformy, w sposób ciągły gromadząc na dużą skalę wieloaspektowe dane dotyczące ocenianej aplikacji. W przypadku monitorowania frontendu wdrażane są syntetyczne agenty monitorujące, które śledzą zdarzenia po stronie przeglądarki, takie jak struktury Document Object Model (DOM), akcje użytkownika (np. kliknięcia, najechania kursorem i wprowadzanie danych) oraz pliki HAR rejestrujące informacje o żądaniach i odpowiedziach sieciowych oraz API. W celu zwiększenia możliwości przeglądarek, w systemie OBSERVER zaimplementowano również rozwiązanie PreventativeTestPro. Monitorowanie backendu koncentruje się na analizie logów, w ramach której żądane i przetwarzane są informacje o obserwowalności po stronie serwera, obejmujące logi aplikacji, komunikaty błędów, informacje i debugowanie, logi wyjątków i ślady stosu (stack trace), metryki wydajności, takie jak czasy odpowiedzi, a także śledzenie (tracing) z wykorzystaniem technologii takich jak OpenTelemetry lub New Relic. System współpracuje z agentami syntetycznymi symulującymi ruch i interakcje użytkowników, a kolektory logów kondensują przychodzące dane w czasie rzeczywistym. Zebrane dane są następnie normalizowane do formatów strukturalnych i przekazywane do innych jednostek przetwarzających w celu dalszej analizy.
Istotą PreventativeTestPro jest warstwa inteligencji oparta na GenAI, która wykorzystuje duże modele językowe (LLM), takie jak GPT, do odczytywania i analizowania danych z obserwowalności oraz kontekstualizacji i generowania odpowiedzi. Moduł ten przeprowadza analizę przyczyn źródłowych (root cause analysis): proces interpretacji logów i śladów przyczyn źródłowych w celu wyjaśnienia błędów technicznych w zrozumiały sposób, na przykład wskazując NullPointerException w konkretnej linii kodu oraz przypuszczalną przyczynę problemu, taką jak nie zainicjowana zmienna. W zakresie generowania przypadków testowych system wykorzystuje autotesty tworzone poprzez konwersję wzorców wyjątków lub sekwencji zdarzeń na wykonywalne skrypty testowe, np. testy Selenium lub API, a także generuje zrozumiałe dla człowieka procedury testowe, które może przeprowadzić personel zapewnienia jakości (QA). Testy API ewoluowały poprzez transformację logów HAR i śladów w sekwencje żądań API z oczekiwanymi asercjami, a wszystkie wygenerowane przypadki testowe są dodatkowo wzbogacane o efektywne środowiska testowe dzięki integracji z BHRAMARI. System rekomendacji sugeruje dalsze ulepszenia, zwiększenie pokrycia testami oraz możliwości integracji z CI/CD, w zależności od analizowanego zachowania systemu. Silnik AI wykorzystuje strukturalne dane z obserwowalności za pomocą inżynierii promptów (prompt engineering) i wzbogacania kontekstu, aby przedstawić kontekst logów przy użyciu szablonów promptów przekazujących ustrukturyzowane zapytania do modelu LLM, a ostatecznie generuje wyniki w formie funkcjonalnej, takiej jak fragmenty kodu, specyfikacje przypadków testowych i dokumentacja w języku naturalnym.
Moduł silnika orchestracji i wykonywania testów zarządza priorytetami, harmonogramowaniem i wykonywaniem testów, umożliwiając zautomatyzowaną walidację w oparciu o szczegóły pokrycia zmian w kodzie, tagi oraz mapowanie anomalii. Mapowanie i wybór testu polega na powiązaniu anomalii w mapach lub wzorcach instrumentacji ze znanymi przypadkami testowymi za pomocą silnika reguł mapowania, a następnie uruchomieniu przypadków testowych zgodnie z ustalonym mapowaniem. Funkcje równoległego wykonywania testów pozwalają na jednoczesne uruchamianie wielu rodzajów testów, takich jak testy funkcjonalne, wydajnościowe lub bezpieczeństwa w różnych środowiskach, oraz koordynację wykorzystania Selenium, JMeter i ZAP jako instrumentów w potokach automatyzacji. Implementacja pętli sprzężenia zwrotnego zapewnia rejestrowanie wyników wykonania, a w przypadku niepowodzenia testu – przekazywanie informacji o zmianach do systemów wsparcia, w tym Jira i Azure DevOps, w celu ich śledzenia i rozwiązania.
Hipoteza:
H1 (Efektywność operacyjna): Postuluje się, że połączenie danych z obserwowalności i inteligencji opartej na AI poprawi wskaźniki operacyjne, w szczególności poprzez skrócenie średniego czasu rozwiązania problemu (H1a), średniego czasu analizy (H1b), średniego czasu wykrywania problemów produkcyjnych (H1c) oraz średniego czasu wdrażania poprawek na produkcji (H1d). Zmiany te powinny ułatwić spełnienie wymogów umowy o poziomie usług (SLA) (H1e) poprzez przyspieszenie wykrywania, analizy i wdrażania, przy jednoczesnym zminimalizowaniu czasu przestoju systemu.
H2 (Badanie skuteczności): Przyjmuje się również, że skuteczność testowania oprogramowania wzrośnie wraz z szerszym zakresem testów (H2a), równoległym uruchamianiem przypadków testowych (H2b) oraz inteligentną priorytetyzacją testów (H2c). Oczekuje się również, że rekomendacje generowane przez AI (H2d) pomogą zarówno w procesach testowania, jak i w przepływach operacyjnych. Pozwoli to na szybsze wykrywanie błędów, przyspieszenie pętli zwrotnych oraz wsparcie praktyk zapewniania jakości o charakterze prewencyjnym i długofalowym.
Zakres i odbiorcy:
Ten prototyp przedstawia ogólny projekt systemu, główną koncepcję oraz instrukcję krok po kroku dotyczącą konfiguracji i uruchamiania frameworka PreventativeTestPro. Szczegółowo opisano w nim również sposób przygotowania odpowiednich stanowisk testowych/danych wejściowych oraz podano wskazówki dotyczące rozwiązywania problemów. Treść jest skierowana do inżynierów jakości oprogramowania, którzy znają podstawy języka Java i chcą dowiedzieć się, jak wykorzystać testowanie zapobiegawcze (preventative testing) w celu zwiększenia niezawodności i wydajności oprogramowania.
Konfiguracja środowiska:
Plik uzupełniający 1 zawiera szczegółowy opis krok po kroku oraz program wymagany do komunikacji z PreventativeTestPro. Obejmuje on instrukcje instalacji niezbędnego środowiska, sposób uruchamiania i zatrzymywania usług narzędzia oraz jasne wyjaśnienie podstawowego zastosowania narzędzia. Aby uzyskać bardziej szczegółową dokumentację, wraz z instrukcjami dotyczącymi korzystania z zaawansowanych narzędzi, instrukcjami konfiguracji i innymi szczegółami organizacyjnymi, należy zapoznać się z oficjalnymi źródłami GitHub dedykowanymi projektowi: konkretną stroną Wiki pod adresem https://github.com/sohambpatel/PreventativeTests/wiki oraz głównym plikiem README pod adresem https://github.com/sohambpatel/PreventativeTests?tab=readme-ov-file/readme.
Przykładowe dane wejściowe:
Przykładowe pliki wejściowe znajdują się w repozytorium GitHub: https://github.com/sohambpatel/PreventativeTests/tree/main/preventativetestframework/Inputs. Framework może natychmiast uruchomić predefiniowane przypadki testowe i zestawy danych z tych plików. Służą one jako dane wejściowe referencyjne do weryfikacji konfiguracji środowiska oraz w celu uzyskania wyników opisanych w niniejszym protokole.
Przykładowe wyniki:
Repozytorium GitHub (https://github.com/sohambpatel/PreventativeTests/tree/main/preventativetestframework/SampleOutputs) zawiera konkretne przykłady danych wyjściowych z ram testów zapobiegawczych w formacie surowym. Dzięki tym plikom użytkownicy mogą bezpośrednio zapoznać się z układem i szczegółami wygenerowanych raportów oraz metryk, co obrazuje wyniki osiągnięte przez narzędzie podczas jego pracy. Niniejszy przewodnik jest istotny dla zrozumienia potoku danych i potwierdzenia oczekiwanego zachowania ram podczas odtwarzania procesu eksperymentalnego.
Prototyp wykonania:
Niniejsza sekcja zawiera szczegółowy przewodnik krok po kroku dotyczący korzystania z frameworka PreventativeTestPro. Aby pomóc użytkownikom w odtworzeniu przepływu pracy, każdy etap został opisany w odpowiedniej kolejności. W tej sekcji kroki wykonawcze przedstawiono w ustrukturyzowanej formie, aby ułatwić reprodukcję wyników, wskazać kluczowe punkty kontrolne oraz zapewnić spójne stosowanie frameworka PreventativeTestPro w różnych warunkach eksperymentalnych lub operacyjnych.
Na tym etapie można użyć interfejsu graficznego PreventativeTestPro GUI do wyboru optymalnego przepływu pracy dla testów zapobiegawczych. Rysunek 3 przedstawia pięć opcji, z których każda odpowiada innemu etapowi procesu testowania: uruchamianiu testów równolegle, tworzeniu zestawu testów na podstawie wyników monitorowania poprzez priorytetyzację istniejących przypadków testowych, tworzeniu manualnych przypadków testowych, tworzeniu zautomatyzowanych przypadków testowych oraz znajdowaniu przyczyny źródłowej. Po dokonaniu wyboru przez użytkownika uruchamiany jest wyznaczony przepływ pracy. Następnie w późniejszych etapach można dodać dodatkowe tryby (takie jak generowanie przypadków testowych oparte na AI lub analiza przyczyn źródłowych). Ten dobrze zorganizowany interfejs umożliwia przeprowadzanie badań testów zapobiegawczych, które mogą być powtarzalne i dzielone na mniejsze części.

Rysunek 3Interfejs użytkownika 1 systemu. Rysunek ten przedstawia interfejs użytkownika PreventativeTestPro, który umożliwia wybór jednej z pięciu różnych metod przeprowadzania testów zapobiegawczych: 1. Test zapobiegawczy, równoległe wykonanie: rozpocznij testowanie, 2. Test zapobiegawczy, finalizacja zestawu testowego na podstawie monitorowania syntetycznego aplikacji, 3. Test zapobiegawczy, generowanie ręcznych przypadków testowych przy użyciu GenAI, 4. Test zapobiegawczy, generowanie zautomatyzowanych przypadków testowych przy użyciu GenAI, 5. Test zapobiegawczy, analiza przyczyn źródłowych przy użyciu GenAI. W danej chwili można wybrać tylko jedną opcję. Modułowa konstrukcja ułatwia przeprowadzanie testów zapobiegawczych oraz wprowadza tworzenie testów i diagnostykę opartą na sztucznej inteligencji. Kliknij tutaj, aby wyświetlić powiększoną wersję tego rysunku.
Rysunek 4 przedstawia interfejs równoległego wykonywania (Parallel Execution) frameworka. Na tym etapie użytkownik wprowadza adres URL aplikacji, którą chce przetestować, oraz pełną ścieżkę do pliku właściwości zawierającego ustawienia konfiguracji. Po wprowadzeniu danych użytkownik może rozpocząć jednoczesne uruchamianie testów, klikając przycisk Start Testing, który monitoruje również testowaną witrynę i generuje logi bezpieczeństwa, wydajności, konsoli oraz JavaScript. Trwające wykonywanie można zatrzymać, klikając przycisk Stop Testing. Przycisk Get Recommendation umożliwia uzyskanie opartych na AI wniosków z zapisanych logów. Taka konstrukcja zapewnia jednoczesne uruchomienie wielu kategorii testów (funkcjonalnych, wydajnościowych i bezpieczeństwa), co ułatwia szybsze wykrywanie problemów.

Rycina 4Interfejs użytkownika 2 systemu. Rysunek ten przedstawia tryb równoległego wykonywania (Parallel Execution) frameworka PreventativeTestPro. Użytkownik określa adres URL docelowej aplikacji oraz ścieżkę do pliku właściwości zawierającego szczegóły konfiguracji. Dostępne opcje obejmują Start Testing (w celu równoległego uruchomienia testów funkcjonalnych, bezpieczeństwa i wydajności oraz zarejestrowania logów), Stop Testing (w celu zatrzymania wykonywania) oraz Get Recommendation (w celu uzyskania analiz opartych na sztucznej inteligencji na podstawie logów i metryk). Kliknij tutaj, aby wyświetlić powiększoną wersję tej ryciny.
Rysunek 5 przedstawia interfejs Finalizacji Testów w oparciu o Monitorowanie w ramach frameworka PreventativeTestPro. Na tym etapie użytkownik określa ścieżkę do pliku wyjściowego monitorowania, zapytanie JSON path w celu pobrania węzłów błędów lub wyjątków oraz ścieżkę do repozytorium testów, aby zapisać utworzone przypadki. Po ustawieniu danych wejściowych użytkownik może najpierw pobrać nazwy klasy i metody z nimi powiązane, a następnie posortować przypadki testowe pobrane z testów na podstawie znalezionych klas i metod. Ten krok priorytetyzacji pokazuje, jak wykorzystać dane z monitorowania do efektywnego rankingowania przypadków testowych.

Rysunek 5Interfejs użytkownika 3 systemu. Rysunek ten przedstawia sposób priorytetyzacji zestawu testów w frameworku PreventativeTestPro z wykorzystaniem wyników monitorowania syntetycznego. Użytkownik wprowadza ścieżkę do pliku z wynikami monitorowania, ścieżkę JSON służącą do pobierania wyjątków/błędów oraz ścieżkę do repozytorium testów (offline). Opcje „Get Class/Method Name” i „Get Test Cases” mogą zostać wykorzystane do przekształcenia anomalii mapowania w przypadki testowe gotowe do uruchomienia. Zapewnia to uwzględnienie problemów występujących w czasie wykonania w procesie testowania. Aby wyświetlić powiększoną wersję tej ilustracji, kliknij tutaj.
Rysunek 6 przedstawia interfejs ręcznego generowania przypadków testowych w programie PreventativeTestPro. Na tym etapie użytkownik wskazuje programowi lokalizację pliku ze śladem stosu (stack trace) wykazującego anomalię, podając bezwzględną ścieżkę do pliku śladu stosu oraz ścieżkę do pliku właściwości konfiguracji. Po ustawieniu danych wejściowych można uruchomić opcję Generuj przypadki testowe, która przekształci anomalię w ustrukturyzowane, ręczne przypadki testowe. Zapewnia to, że błędy czasu wykonania, które wystąpiły w przeszłości, są zawsze uwzględniane w procesie testowania. Framework ułatwia tworzenie przypadków testowych poprzez automatyzację tego procesu. Pozwala to ograniczyć pracę ręczną, zwiększyć pokrycie testami oraz poprawić niezawodność testów, zapobiegając ponownemu wystąpieniu tego samego problemu. Krok ten stanowi bardzo ważny łącznik między wykrywaniem problemów a zapewnieniem wysokiej jakości przed ich wystąpieniem.

Rycina 6interfejs użytkownika 3 systemu. Rysunek przedstawia interfejs generowania przypadków testowych programu PreventativeTestPro. Narzędzie to przekształca ślady stosu (stack traces) anomalii w manualne przypadki testowe w formacie Behavior Driven Development (BDD), które mogą zostać wykorzystane w dalszych pracach. Użytkownik podaje ścieżki do pliku ze śladem stosu oraz pliku właściwości, a następnie klika przycisk „Generate Test Cases”, aby automatycznie utworzyć przypadki odpowiadające wykrytemu błędowi. Zapewnia to, że problemy występujące podczas działania programu są zawsze przekształcane w powtarzalne testy regresyjne. Kliknij tutaj, aby wyświetlić powiększoną wersję tej ryciny.
Rysunek 7 przedstawia interfejs automatycznego generowania przypadków testowych w systemie PreventativeTestPro. Na tym etapie użytkownik podaje bezwzględną ścieżkę do pliku wyjściowego JSON z danymi obserwowalności oraz ścieżkę do pliku konfiguracyjnego właściwości. Po kliknięciu przycisku Generate Automated Test Cases system przetwarza dane z monitorowania i tworzy przypadki testowe, które można uruchomić, aby odtworzyć zaobserwowane problemy.

Rycina 7Interfejs użytkownika 4 systemu. Rysunek przedstawia interfejs automatycznego generowania przypadków testowych narzędzia PreventativeTestPro, które tworzy testy możliwe do uruchomienia w oparciu o dane obserwowalności (observability data). Użytkownik podaje ścieżkę do pliku właściwości oraz pliku wyjściowego JSON z danymi obserwowalności. Następnie klika przycisk „Generate Automated Test Cases”, aby stworzyć skrypty możliwe do uruchomienia (w formacie Selenium i TestNG). Kliknij tutaj, aby wyświetlić powiększoną wersję tego rysunku.

Rycina 8Interfejs użytkownika 5 systemu. Rysunek przedstawia interfejs instrumentacji anomalii programu PreventativeTestPro służący do analizy przyczyn źródłowych (RCA). Użytkownik podaje ścieżkę do pliku właściwości oraz pliku śladu stosu, a następnie wybiera opcję RCA, aby rozpocząć analizę opartą na sztucznej inteligencji. Krok ten przekształca wykryte anomalie w ustrukturyzowane wnioski diagnostyczne, co zapewnia możliwość naprawy błędów w sposób powtarzalny i specyficzny dla danego problemu. Kliknij tutaj, aby wyświetlić powiększoną wersję tej ryciny.
Rozwiązywanie problemów:
Tabela 1 przedstawia najważniejsze punkty dotyczące rozwiązywania problemów, które dotyczą wyłącznie kodu aplikacji. Punkty te stanowią szybki sposób na przypomnienie sobie, jak naprawiać błędy na poziomie kodu, które pojawiają się podczas uruchamiania frameworka PreventativeTestPro. Dokumentacja projektu zawiera więcej informacji i instrukcje krok po kroku dla czytelników, którzy potrzebują dodatkowej pomocy w rozwiązywaniu problemów wpływających na ogólną funkcjonalność aplikacji. Pełny zasób jest dostępny pod linkiem: https://github.com/sohambpatel/PreventativeTests/wiki/How-to-use%3F. Ta dodatkowa referencja zapewnia, że użytkownicy nie tylko naprawiają błędy w kodzie, ale także uczą się, jak diagnozować funkcje, co umożliwia im bardziej efektywne korzystanie z frameworka.
| Zachowanie w przypadku błędów | Przyczyna źródłowa | Jak naprawić? |
| Aplikacja nie uruchamia się | Ścieżka Java nie została ustawiona | W zmiennej środowiskowej ustaw JAVA_HOME |
| Błąd uruchamiania serwera | Port 8080/9090 jest używany (w szczególności podczas korzystania z Docker) | Aktualizacja mapowania portów w Dockerze |
| Treść GenAI jest pusta | Token mógł wygasnąć | Wygeneruj token i zaktualizuj plik config.properties przed podaniem go jako dane wejściowe |
| Instancja przeglądarki wygenerowana przez framework nie łączy się z siecią | Serwer ZAP nie działa lub dane uwierzytelniające ZAP są nieprawidłowe | Włącz ZAP przed uruchomieniem aplikacji; w przypadku, gdy aplikacja jest uruchomiona, a problem nadal występuje, zaktualizuj dane uwierzytelniające ZAP w pliku config.properties przed przekazaniem go jako danych wejściowych. |
Tabela 1: Typowe proponowane błędy systemowe i szybkie rozwiązania. W tabeli przedstawiono typowe błędy specyficzne dla danej aplikacji, sposoby rozwiązywania problemów oraz szybkie poprawki, które można zastosować w celu wyeliminowania tych problemów.