NEON CITYmaking of
05 / 07

Jakość

Zielone testy to dopiero początek

Tysiące testów jednostkowych, testy mutacyjne sprawdzające, czy testy w ogóle łapią błędy, wizualny smoke w czystej przeglądarce i porównanie pikseli z bazą. Na końcu i tak gra właściciel.

5.1 Bramki przed scaleniem

Diagram bramek jakości od lewej: testy jednostkowe, testy mutacyjne, czysty eksport z buildem i testem dystrybucji, smoke wizualny w headless Chrome, porównanie pikseli z bazą, bramki wydajności, podgląd Pages, staging z playtestem i scalenie

Każda bramka odpowiada na inne pytanie. Testy jednostkowe: czy kod robi to, co deklaruje. Mutacje: czy testy w ogóle by zauważyły, gdyby nie robił. Czysty eksport: czy to, co działa w katalogu roboczym, działa też z samego repozytorium. Smoke: czy gra się uruchamia i wygląda jak trzeba. Wydajność: czy mieści się w budżecie. Playtest: czy jest dobra.

5.2 Testy mutacyjne

Recenzent celowo psuje kod – odwraca warunek, zmienia stałą, przywraca stary błąd – i sprawdza, czy któryś test to zauważy. Mutant, który przeżywa, oznacza dziurę w testach, nawet jeśli wszystkie świecą na zielono.

Po TRAM-1 do zestawu mutacji trafił m.in. dawny, błędny winding korytarza D5. Test zwykłego meczu wykrywa go od razu – ten sam błąd nie wróci po cichu.

Osobno sprawdzane jest wersjonowanie: zmiana reguły generatora musi zmienić wersję, a zmiana wejścia, które na wynik nie wpływa, nie może jej ruszyć – 15 z 15 prób zgodnych z oczekiwaniem.

Mutacje po drugim przeglądzie TRAM-1: 17 z 17 wykrytych (wybór)
MutacjaWynik
Przywrócony dawny winding D5wykryta
Zamienione strony drzwi lewe/prawewykryta
Obrażenia od stojącego tramwajuwykryta
Brak limitu „raz na przejazd”wykryta
Najkrótsze trasy zamiast najdłuższychwykryta

5.3 Smoke wizualny i kryterium pikseli

Smoke uruchamia produkcyjny build z czystego eksportu repozytorium w headless Chrome, z lokalnym Workerem i bez dostępu do sieci poza komputerem. Każdy błąd w konsoli i każda odpowiedź 404 to porażka. Znane problemy środowiska są wypisywane w raporcie, a nie maskowane.

Zrzuty powstają w macierzy okien – od telefonu 667×375 po monitor 2560×1080, w dzień i w nocy, w jakości Wysokiej i Niskiej. Gdy zmiana ma nie ruszać dotychczasowego trybu, obowiązuje twarde kryterium: 0,000 % pikseli różniących się o więcej niż 8/255 względem bazy.

Zrzut smoke na telefonie 667×375 nocą: broń, HUD i przyciski dotykowe
667×375 – telefon, sterowanie dotykowe. Mapa: © OpenStreetMap contributors (ODbL).
Zrzut smoke na monitorze 2560×1080 nocą: szeroki widok placu z bronią i HUD
2560×1080 – monitor panoramiczny. Mapa: © OpenStreetMap contributors (ODbL).
Horda 120 zombie nocą widziana z dystansu na placu miejskim
Horda 120 – scena do pomiaru GPU. Mapa: © OpenStreetMap contributors (ODbL).

5.4 Bramki wydajności

Pomiary z odbioru TRAM-1 (próg w nawiasie)
PomiarWynikPróg
Tick symulacji, p95 (scenariusz PLAY-1)1,344 ms3 ms
Pole przeciwników, p950,744 ms1,5 ms
Łódź r600, 3 tramwaje w ruchu, 60+ botów, p951,047 ms3 ms
LocalServer: 169,0 → 40,9 ms4,13×≥ 3×

Pomiary mają warunki: zasilanie sieciowe, ciche okno i obciążenie procesora poniżej progu. Gdy warunek nie jest spełniony, pomiar jest pomijany i opisany w raporcie – nieudanych pomiarów nie zastępuje się zerami ani starszymi wynikami.

5.5 Praca w liczbach

  • 869commitów w 15 iteracjach (klient + backend)
  • 179raportów zadań w repozytoriach
  • 1634 + 937testów backendu i klienta, 0 błędów
  • 4,13×przyspieszenie LocalServer (próg: 3×)
Commity na iterację, iteracje 1–15Słupki skumulowane: repozytorium klienta i backendu. Szczyt iteracja 9: 136 commitów. 050100150 klientbackend iteracja 1: klient 15, backend 12, razem 27 1 iteracja 2: klient 21, backend 14, razem 35 iteracja 3: klient 23, backend 25, razem 48 3 iteracja 4: klient 13, backend 10, razem 23 iteracja 5: klient 12, backend 10, razem 22 5 iteracja 6: klient 12, backend 4, razem 16 iteracja 7: klient 47, backend 6, razem 53 7 iteracja 8: klient 40, backend 7, razem 47 iteracja 9: klient 107, backend 29, razem 136 1369 iteracja 10: klient 48, backend 43, razem 91 iteracja 11: klient 45, backend 41, razem 86 11 iteracja 12: klient 18, backend 23, razem 41 iteracja 13: klient 39, backend 30, razem 69 13 iteracja 14: klient 57, backend 9, razem 66 iteracja 15: klient 86, backend 23, razem 109 15
Commity na iterację, iteracje 1–15. Słupki skumulowane: repozytorium klienta i backendu. Szczyt iteracja 9: 136 commitów.
Pokaż dane w tabeli
Iteracjaklientbackendrazem
iteracja 1151227
iteracja 2211435
iteracja 3232548
iteracja 4131023
iteracja 5121022
iteracja 612416
iteracja 747653
iteracja 840747
iteracja 910729136
iteracja 10484391
iteracja 11454186
iteracja 12182341
iteracja 13393069
iteracja 1457966
iteracja 158623109
Σ583286869

Liczby zagregowane z historii git (wszystkie gałęzie) i raportów zadań; bez nazw gałęzi i treści commitów.