Po co projektowi graf kodu i testy mutacyjne?
Agent, który pisze kod, potrzebuje dwóch informacji, których nie da mu sam plik. Pierwsza: kto korzysta z funkcji, którą właśnie zmienia. Druga: czy zielone testy coś znaczą. Graf kodu odpowiada na pierwsze pytanie, a testy mutacyjne na drugie.
| Cecha | Graf kodu | Testy mutacyjne |
|---|---|---|
| Pytanie | co zależy od tego kodu? | czy testy wykryją błąd w tym kodzie? |
| Kiedy pomaga | przy planowaniu ticketu i rozpoznaniu zmiany | po napisaniu kodu i testów |
| Skąd dane | analiza składni plików źródłowych | wielokrotne uruchomienie testów na celowo zepsutym kodzie |
| Koszt | sekundy do minut, lokalnie | minuty; rośnie z liczbą zmienionych linii |
| Gdzie widać wynik | moduł Połączenia w panelu | raport komendy, kryteria i tickety |
Jak zasilić graf kodu?
Graf powstaje w dwóch krokach. Najpierw narzędzie graphify czyta pliki źródłowe i zapisuje wynik do pliku graphify-out/graph.json. Potem skrypt cicd/sync_graph.py zamienia ten plik na węzły i krawędzie Monolynx i wysyła je na platformę.
Narzędzie graphify analizuje składnię plików w repozytorium i zapisuje graf do pliku. Skrypt synchronizacji mapuje go na typy węzłów i krawędzi Monolynx, a potem jednym wywołaniem podmienia cały graf projektu na platformie. Z gotowego grafu korzystają panel i agenci.
flowchart LR
A["Pliki źródłowe"] --> B["graphify update"]
B --> C["graphify-out/graph.json"]
C --> D["cicd/sync_graph.py"]
D --> E["Graf projektu w Monolynx"]
E --> F["Moduł Połączenia w panelu"]
E --> G["Agenci: ticket-create, work"]Ręcznie: /monolynx:graph-sync
Komenda prowadzi przez cały proces za rękę. Dobra na pierwszy raz i dla projektu bez CI.
- Sprawdzenie graphify
Komenda sprawdza, czy narzędzie jest zainstalowane. Gdy go brakuje, podaje polecenie instalacji dla Twojego systemu i czeka na zgodę.
- Plik wykluczeń
Komenda sprawdza albo proponuje plik
.graphifyignore, który pomija testy, migracje, dokumentację i kod zewnętrzny. - Ekstrakcja
Polecenie
graphify update .buduje graf lokalnie z samej składni plików. - Przebieg próbny
Skrypt synchronizacji uruchomiony z flagą
--dry-runpokazuje liczby węzłów i krawędzi, ale niczego nie wysyła. - Wysyłka po Twojej zgodzie
Komenda uprzedza, że wysyłka podmienia cały graf projektu, i czeka na potwierdzenie.
$ uv tool install graphifyy
$ graphify --version
$ graphify update .
$ python cicd/sync_graph.py --dry-run
$ python cicd/sync_graph.pySkrypt cicd/sync_graph.py nie jest częścią Twojego repozytorium, dopóki go nie wygenerujesz. Tworzy go komenda /monolynx:create-graph-ci-script, a gdy pliku brakuje, /monolynx:graph-sync generuje go sam według tej samej specyfikacji.
Automatycznie: /monolynx:create-graph-ci-script
Ta komenda dodaje do CI krok, który odświeża graf po każdym merge do gałęzi głównej. Wykrywa system CI (GitLab, GitHub Actions, Bitbucket albo Jenkins), tworzy plik wykluczeń i skrypt synchronizacji, a potem dopisuje krok.
sync-graph:
stage: deploy
allow_failure: true
script:
- command -v graphify || { echo "graphify nie zainstalowane na runnerze"; exit 0; }
- graphify update .
- python cicd/sync_graph.py
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: on_successKrok ma trzy cechy, które warto znać przed uruchomieniem.
| Cecha | Co oznacza |
|---|---|
| Nie instaluje graphify | narzędzie instaluje właściciel maszyny wykonującej CI, raz |
| Nie blokuje | brak narzędzia, pliku grafu albo tokenu kończy krok komunikatem i sukcesem |
| Podmienia cały graf | każdy przebieg usuwa stary graf projektu i wstawia nowy |
Dlaczego plik wykluczeń ma znaczenie
Bez pliku .graphifyignore graf bywa pięć razy większy, a większość węzłów to testy. Platforma przyjmuje w jednej synchronizacji najwyżej 20 000 węzłów i 60 000 krawędzi.
Graf w obecnej wersji obejmuje tylko kod projektu. Dokumentacja, pakiety i symbole z zewnętrznych bibliotek są pomijane. Skutek uboczny: krawędź dziedziczenia po klasie z biblioteki znika, bo jej drugi koniec nie należy do projektu. To nie jest błąd.
Jak działają testy mutacyjne?
Narzędzie mutacyjne wprowadza do kodu drobny błąd, na przykład zamienia >= na >, i uruchamia testy. Gdy któryś test pada, mutant został wykryty. Gdy wszystkie testy są zielone, mutant przeżył: w tym miejscu kod można zepsuć, a testy tego nie zauważą.
> /monolynx:mutation-check
Mutacje (diff względem 4f2a9c1): 4 przeżyło / 17 mutantów
| plik:linia | mutator | oryginał -> mutant |
| src/rozliczenia.py:88 | ConditionalBoundary | >= -> > |Komenda ma dwa tryby. Wybiera je argument.
| Cecha | Tryb na zmianie | Tryb pełny |
|---|---|---|
| Wywołanie | bez argumentu | ze ścieżką modułu |
| Zakres | linie zmienione względem gałęzi głównej | cały wskazany moduł |
| Wynik | liczba mutantów, które przeżyły | wynik procentowy, wartość bazowa i różnica |
| Kiedy | po każdym tickecie | okresowo, dla najważniejszych modułów |
Skąd komenda zna polecenie?
Komenda niczego nie zgaduje. Polecenie, ścieżkę raportu i jego format czyta z sekcji ## Mutacje strony wiki toolchain. Tę sekcję zapisuje komenda /monolynx:project-toolchain, która wykrywa narzędzie pasujące do języka projektu.
| Język | Narzędzie | Raport rozumiany przez plugin |
|---|---|---|
| Python | mutmut | tak |
| JavaScript i TypeScript | Stryker | tak |
| Java i Kotlin | PIT | tak |
| C# | Stryker.NET | tak |
| Rust | cargo-mutants | tak |
| Scala | Stryker4s | w kroku CI tak; komenda mutation-check pokazuje surowy raport |
| PHP | Infection | zależy od ustawionego formatu raportu |
| Go | gremlins | nie; surowy raport |
| Ruby | mutant | nie; surowy raport |
Plugin nie instaluje narzędzia mutacyjnego. Gdy sekcji brakuje albo narzędzie nie jest zainstalowane, komenda mówi to wprost, odsyła do /monolynx:project-toolchain i kończy pracę.
Co się dzieje z mutantem, który przeżył?
Mutant, który przeżył, jest brakującym przypadkiem testowym, a nie wynikiem do poprawienia. Komenda najpierw czyta kod wokół wskazanej linii, nazywa niesprawdzane zachowanie, a potem pyta, co z tym zrobić.
| Wybór | Skutek |
|---|---|
| Kryteria przy tickecie | każde brakujące zachowanie staje się kryterium akceptacji wskazanego ticketu |
| Ticket na każdy przypadek | osobny ticket o niskim priorytecie dla każdego miejsca |
| Jeden ticket zbiorczy | jeden ticket z listą przypadków jako kryteriami |
| Tylko raport | nic nie jest zapisywane |
Mutant równoważny: kiedy odpuścić
Część mutantów zmienia kod, ale nie zmienia zachowania, które da się zaobserwować. Przykład: zamiana <= na < na granicy, której program nigdy nie osiąga. Takiego mutanta nie da się wykryć żadnym sensownym testem.
Komenda uzasadnia taki przypadek jednym zdaniem, pomija go przy zapisie i wymienia osobno w raporcie. To poprawna odpowiedź, nie dług.
Jak dodać testy mutacyjne do CI?
Komenda /monolynx:create-mutation-ci-script dodaje osobny etap CI, który działa tylko na merge requestach i liczy mutacje na zmianie. Raport narzędzia trafia do artefaktów. Etap kopiuje też do katalogu cicd/ dwa skrypty: jeden sprowadza raport do wspólnego formatu, drugi porównuje wynik z zapisaną wartością bazową.
Porównanie działa jak zapadka: wartość bazowa może tylko rosnąć.
| Status | Kiedy | Co robi etap |
|---|---|---|
first |
brak pliku z wartością bazową | zapisuje pierwszy pomiar do artefaktu |
up |
wynik wyższy niż wartość bazowa | zapisuje nową wartość do artefaktu |
same |
wynik równy | nic nie zapisuje |
down |
wynik niższy | wypisuje ostrzeżenie, wartości nie zmienia, etap zostaje zielony |
no-mutants |
zmiana bez mutantów, na przykład sama dokumentacja | pomija porównanie |
Najczęstsze pytania
Czy budowa grafu wysyła mój kod do modelu AI?
Nie. Graphify analizuje składnię plików lokalnie. Na platformę trafiają nazwy plików, klas i funkcji oraz powiązania między nimi, a nie treść kodu.
Co się stanie, gdy graf jest nieaktualny?
Agenci dostaną nieaktualną mapę zależności, ale praca się nie zatrzyma. Graf jest warstwą pomocniczą. Odświeżysz go jednym poleceniem albo krokiem CI po merge.
Ile trwa przebieg testów mutacyjnych?
Komenda ma budżet 600 sekund. Po jego przekroczeniu zatrzymuje proces i, jeśli raport jest kompletny, pokazuje wynik częściowy z wyraźnym oznaczeniem.
Czy mutant, który przeżył, blokuje ticket?
Nie. Wynik jest informacją. Staje się pracą dopiero wtedy, gdy wybierzesz zapis jako kryteria albo tickety.
Od czego zacząć w istniejącym projekcie?
Od /monolynx:setup. Checklista pokaże stan grafu i mutacji, a przy każdym braku wskaże komendę, która go usuwa.
Słownik i następny krok
- Graf kodu
- mapa plików, klas i funkcji projektu oraz powiązań między nimi
- Graphify
- zewnętrzne narzędzie, które buduje graf z analizy składni plików
- Węzeł
- element grafu: plik, klasa, metoda, funkcja, stała albo moduł
- Krawędź
- powiązanie między węzłami, na przykład wywołanie albo import
- Mutant
- kopia kodu z jedną celowo wprowadzoną zmianą
- Mutant, który przeżył
- zmiana, której nie wykrył żaden test
- Wartość bazowa
- zapisany wynik mutacji, z którym porównuje się kolejne przebiegi
- Zapadka
- zasada, że wartość bazowa może tylko rosnąć
- Toolchain
- strona wiki z poleceniami lintu, testów i mutacji projektu
Stronę toolchain i resztę konfiguracji opisuje wpis Pierwszy projekt w Monolynx. Miejsce obu komend wśród pozostałych pokazuje Mapa pluginu Monolynx.
Chcesz zobaczyć graf zależności swojego projektu w przeglądarce?
Zobacz moduł Połączenia w Monolynx