Pikselowo stabilne rejestracje
Deterministyczne renderowanie z oczekiwaniem na załadowanie czcionek, przypiętymi animacjami i maskowaniem treści dynamicznej — diffy pokazują prawdziwe regresje, nie szum.
ScanU to platforma testów regresji wizualnej i zrzutów ekranu cross-browser dla profesjonalnych zespołów webowych. Wykonuje dokładne, pikselowo stabilne rendery każdej strony, która się liczy, w przeglądarkach i przy rozdzielczościach, z których faktycznie korzystają Państwa użytkownicy — i ujawnia zmiany układu, które testy jednostkowe i end-to-end pomijają w ciszy.
Czym jest ScanU
ScanU zamienia ostatni etap jakości wydania — dokładnie to, co widzą Państwa użytkownicy — w sygnał, na który zespół może zareagować. Platforma wykonuje pikselowo stabilne zrzuty wskazanych stron, zapisuje jawną baseline, a każde kolejne uruchomienie porównuje z tą baseline w przeglądarkach i na urządzeniach, które są istotne.
Większość zespołów uruchamia już lintery, kontrole typów, testy jednostkowe i przepływy end-to-end. Wszystko to może pozostać zielone, gdy przycisk zjedzie o dwanaście pikseli, modal utraci padding, menu zepsuje się w Safari, a mobilny breakpoint w ciszy przepłynie całą sekcję hero. Testy funkcjonalne weryfikują zachowanie; nie weryfikują jak strona wygląda. Właśnie po to jest narzędzie do testów zrzutów ekranu i dokładnie to robi ScanU — bez ceremonii.
Pod maską ScanU steruje prawdziwymi silnikami renderującymi — Chromium, Gecko i WebKit — przeciwko adresom URL lub podglądom komponentów, które Państwo wskażą. Każde uruchomienie wytwarza deterministyczną rejestrację dla każdej skonfigurowanej pary (przeglądarka, viewport). Pierwsze zaakceptowane uruchomienie staje się baseline. Od tej chwili każdy pull request, każde wdrożenie i każda zaplanowana kontrola to diff względem tej baseline: każda regresja wizualna jest eksponowana jako zmiana do przeglądu — tak samo, jak code review pokazuje zmienioną linię.
Pełny pipeline porównywania obsługuje detale, które dopiero sprawiają, że diffowanie zrzutów realnie nadaje się do produkcji: tolerancja na anti-aliasing, stabilizacja animacji, ładowanie czcionek, maskowanie dynamicznej zawartości, przechwyt przy scrollu i percepcyjne progi diffu — aby zmiana sub-pikselowego hintingu nie zagłuszyła prawdziwej regresji układu.
ScanU jest zbudowany dla zespołów, które traktują interfejs jako umowę z użytkownikami. To narzędzie do testów regresji wizualnej, narzędzie do porównywania zrzutów między przeglądarkami i powierzchnia przeglądu diffów — w jednej platformie — między Państwa buildem a release gate’em.
Deterministyczne renderowanie z oczekiwaniem na załadowanie czcionek, przypiętymi animacjami i maskowaniem treści dynamicznej — diffy pokazują prawdziwe regresje, nie szum.
Chromium, Gecko i WebKit równolegle, w viewportach desktop, tablet i mobile, których faktycznie używają Państwa użytkownicy.
Baseline, bieżąca rejestracja i podświetlony diff obok siebie. Akceptuj, odrzuć lub zaktualizuj baseline — zawsze jawną akcją, nigdy po cichu.
Działa w Państwa istniejącym pipeline. Status checki, komentarze pull request i linki do artefaktów pojawiają się tam, gdzie inżynierowie już przeglądają kod.
Skieruj ScanU na Storybook, sandbox komponentów lub żywe URL-e. Zmiany tokenów i refaktoringi komponentów otrzymują uczciwy audyt wizualny przed wydaniem.
Zrzuty i metadane są przechowywane na infrastrukturze europejskiej, z obsługą danych zgodną z RODO — odpowiednie dla zespołów z surowymi wymaganiami co do lokalizacji danych.
Dlaczego to ma znaczenie
Koszt błędu wizualnego rzadko mierzy się w czasie programisty. Mierzy się go w zaufaniu użytkownika, który otwiera Państwa produkt, widzi coś subtelnie niewłaściwego i po cichu stwierdza, że ten zespół nie dba o szczegóły. To zaufanie trudno odbudować — a niemal zawsze taniej jest zapobiec błędowi.
Testy funkcjonalne dobrze odpowiadają na jedno pytanie: „czy przycisk robi, co trzeba po kliknięciu?”. Milczą o wszystkim, co dzieje się przed kliknięciem — czy przycisk ma właściwy kolor, właściwy rozmiar, właściwe miejsce, czy pozostaje czytelny na ekranie 360 px i czy w ogóle jest widoczny po ostatnim refaktorze CSS. Właśnie w tej luce żyje większość incydentów dnia wydania.
Realne regresje, które widzimy i do wyłapywania których ScanU został zbudowany, skupiają się wokół garstki przewidywalnych wyzwalaczy:
gap kontenera flex na jednym breakpoincie. Na desktopie układ wygląda identycznie; na tablecie 768 px dwie karty zaczynają się nakładać.Żadna z tych zmian nie wywoła fałszywej asercji. Każda psuje doświadczenie użytkownika. Zadaniem ScanU jest sprawić, by ta druga klasa błędów była tak samo łatwa do zauważenia, przejrzenia i zablokowania jak czerwony test jednostkowy. Gdy diff pojawia się na pull request, designerka może wtrącić się tak, jak reviewer wtrąca się w sygnaturę funkcji — przed mergem, nie po wydaniu na produkcję.
To przejście — z „liczmy, że ktoś zauważy na stagingu” na „rewidujmy zmianę wizualną tak jak zmianę kodu” — to kluczowa wartość narzędzia regresji wizualnej w nowoczesnym pipeline wydawniczym.
Testy cross-browser
Testowanie cross-browser nie jest podatkiem od nostalgii z czasów IE6. Nowoczesne silniki — Chromium, Gecko i WebKit — wciąż rozchodzą się w detalach, na których po cichu opierają się Państwa układy, a zaskakująca liczba incydentów produkcyjnych sprowadza się do różnicy renderowania, której nikt nie zweryfikował.
Gdy regresja pojawia się tylko w jednym silniku, niemal zawsze znaczy to jedno z trzech: użyto funkcji, która w niektórych silnikach ląduje później niż w innych; układ zależy od metryki różniącej się na różnych platformach (szerokość scrollbara, baseline czcionki, algorytm wygładzania); albo polyfill zależny od user-agenta działa w produkcji inaczej niż na maszynie dewelopera. Wszystkie trzy są niewidoczne dla testów agnostycznych wobec silnika.
Typowe przykłady z audytów cross-browser:
date, datetime-local, select — renderują się w WebKicie z widocznie innym chromem niż w Chromium i od czasu do czasu przesuwają sąsiednie elementy o kilka pikseli.line-height, które trzyma się Chromium, może w Gecko wypchnąć CTA poniżej krawędzi.gap w kontenerach flex, aspect-ratio i container queries pojawiły się w silnikach w nieco różnych momentach. Jeśli build celuje w starszą baseline, ścieżki fallback mogą renderować się inaczej niż ścieżka główna.prefers-color-scheme, accent-color oraz forced-colors na Windowsie — przechodzą do DOM różnie w zależności od platformy i łatwo je przegapić w lokalnym środowisku deweloperskim.ScanU przechwytuje każdą stronę w skonfigurowanych silnikach i viewportach w jednym uruchomieniu, z identycznymi fixturami i hookami czasu, tak aby pokazywane diffy były realnymi różnicami układu — a nie skutkiem ubocznym tego, że każda przeglądarka biegnie w innym harness. Pełen zestaw możliwości cross-browser opisany jest na stronie produktu: matryca, którą konfigurujecie, to matryca rejestrowana w każdym uruchomieniu.
Dla zespołów wydających design systemy — lub każdego produktu, którego tożsamość wizualna jest częścią marki — ta matryca nie jest dodatkiem. Jest jedynym sposobem, by wiedzieć, że to, co klient widzi w Safari, odpowiada temu, co Państwo zatwierdzili w Chromie.
| Przeglądarka | Viewport | Status |
|---|---|---|
| Chromium 124 | 1440 × 900 | Zgodne z baseline |
| Firefox 126 | 1440 × 900 | Zgodne z baseline |
| WebKit (Safari 17) | 1440 × 900 | Diff wizualny · do przeglądu |
| Chromium 124 | 768 × 1024 | Zgodne z baseline |
| WebKit (Safari 17) | 768 × 1024 | Wykryto przesunięcie układu |
| Chromium 124 | 390 × 844 | Nowa baseline oczekuje |
Jak działa porównywanie zrzutów
Narzędzie do diffu wizualnego jest użyteczne dokładnie na tyle, na ile pozwala to stosunek sygnału do szumu w jego diffach. Pipeline przechwytywania ScanU jest tak zaprojektowany, by między dwoma uruchomieniami zmieniło się tylko to, co rzeczywiście zmieniliście — a nie scenografia czcionek, animacji, znaczników czasu czy reklam wokół.
Każde uruchomienie to pipeline w trzech krokach. Najpierw ScanU w każdym silniku nawiguje do strony lub komponentu pod testem, czeka na skonfigurowany zestaw sygnałów gotowości — załadowane czcionki, zdekodowane obrazy, cichy ruch sieciowy, atrybut data-ready lub własna sonda JavaScript — i przypina wszystkie animacje CSS do ich ostatniej klatki. Następnie rejestruje stronę na każdym skonfigurowanym viewporcie w tym samym uruchomieniu, ze scroll-stitching dla długich stron, dzięki czemu otrzymujecie pełny artefakt, a nie tylko widoczny fragment. Na końcu pipeline porównuje rejestrację z zaakceptowaną baseline i produkuje wynik dla każdej pary (przeglądarka, viewport): identyczne, w tolerancji lub znacząco różne.
Samo porównanie nie jest naiwnym diffem pikseli. ScanU stosuje model percepcyjny, który rozumie anti-aliasing, renderowanie sub-pikselowe i drobne przesunięcia przestrzeni barw, tak aby osobliwość kerningu w WebKicie nie udawała buga. Obsługuje też jawne maski dla stref, o których wiadomo, że zmieniają się przy każdym ładowaniu — dane live, relatywne znaczniki czasu, treści losowe, karuzele — dzięki czemu wnoszą one zerowy szum do diffu.
Gdy pojawia się realna zmiana, platforma pokazuje trzy zsynchronizowane panele: baseline, bieżącą rejestrację i nakładkę diffu, która dokładnie zaznacza, co się przesunęło. Dla każdej zmiany zapisywana jest jedna decyzja do przeglądu — akceptuj, odrzuć lub zaktualizuj baseline — a ta decyzja staje się częścią historii projektu. Nie ma cichego dryfu ani automatycznej akceptacji: baseline porusza się tylko wtedy, gdy uprawniona osoba tego zażąda.
Ten sam pipeline można uruchamiać z trzech punktów wejścia: przeciwko żywym URL-om (produkcja, staging, podglądy PR), przeciwko statycznej stronie lub zbudowanej paczce assetów, albo przeciwko podglądom komponentów w sandboksie w stylu Storybooka. Większość zespołów używa pierwszej drogi jako release gate, drugiej — do artefaktów wdrożenia, trzeciej — do pracy nad design systemem; wszystkie trzy zasilają ten sam magazyn baseline.
Ostatni zaakceptowany render dla tej strony, przeglądarki i viewportu. Zamrożony, dopóki reviewer nie zaktualizuje go jawnie.
Rejestracja z tego uruchomienia. Te same fixtury, te same hooki czasu, ten sam viewport — zmienił się jedynie kod pod testem.
Obszary podświetlone na bursztynowo pokazują, gdzie bieżący render odbiega od baseline powyżej skonfigurowanej tolerancji.
Dla kogo jest ScanU
ScanU jest zbudowany dla zespołów, których pracę ocenia się po tym, co widzi użytkownik. To szersza grupa, niż się wydaje — nie tylko designerki i inżynierowie frontend, lecz każdy, kogo decyzje wydawnicze zależą od tego, czy UI jest poprawne w określonej przeglądarce, na określonym viewporcie, w określony dzień.
Inżynierowie frontend i full-stack używają ScanU jako ostatniego etapu pipeline’u pull requestów: build jest zielony, testy jednostkowe przechodzą, suite end-to-end jest zadowolona — a wizualny diff potwierdza, że zmiana odpowiada intencji designerki, albo ujawnia regresję, której nikt nie wyłapałby, czytając patch. Efekt: mniej czasu na gaszenie pożarów po wdrożeniu i więcej czasu na pracę, która realnie pcha produkt do przodu.
Inżynierowie QA zyskują poziom testów, który skaluje się bez przepisywania selektorów. Dodanie nowej strony do suity wizualnej to URL i baseline — nie tydzień kruchego XPath. Warstwa, która łapie regresje UI, staje się pełnoprawnym członkiem piramidy testów, a nie post-factum wiadomością na Slacku od użytkownika.
Zespoły design system i zespoły platformowe uruchamiają ScanU przeciwko każdej sandboxie komponentu w swojej bibliotece. Gdy zmienia się token, każdy zależny od niego komponent automatycznie dostaje wizualny audyt. Gdy komponent jest refaktorowany, konsumenci poniżej dostają diff, który mogą przejrzeć, zanim nowa wersja się pojawi. W ten sposób design system unika narastania cichych regresji przez lata.
Liderzy produktu i inżynierii używają powierzchni przeglądu jako dowodu. Release notes mogą zawierać link do zaakceptowanego diffu wizualnego dla każdej wersji. Post-mortemy mogą odwołać się do tego, czy regresję wyłapano, przeoczono czy jawnie zaakceptowano. Z czasem platforma staje się zapisem ewolucji UI i tego, kto zatwierdzał każdy krok.
Zastosowania
Ta sama platforma obsługuje bardzo różne workflow. Wspólny mianownik: każdy z tych zespołów wydaje UI w rytmie, który liczy się dla jego klientów, i każdy potrzebuje wiedzieć — rzutem oka — czy UI dalej wygląda, jak powinno.
Niezależnie od kształtu zespołu, ScanU zwykle wchodzi z jednego z pięciu powodów: niedawny incydent produkcyjny, który wizualna regresja by wyłapała; migracja design systemu, której zasięgu nie da się zaudytować ręcznie; workflow CI/CD, który potrzebuje release gate bogatszego niż „testy zielone”; dostawa zorientowana na klienta, wymagająca dowodu przed/po; albo postawa compliance, która preferuje narzędzia testowe hostowane w UE. Wspólna integracja CI/CD stoi za wszystkimi pięcioma — ten sam pipeline wykonuje pracę, czy wyzwala go PR, merge, czy nocny harmonogram.
Co tydzień przekazuj klientom wizualną deltę dla serwisu. Dowód przed/po w każdym sprincie, w każdej przeglądarce wpisanej w kontrakt — w jednym raporcie.
Dodaj warstwę wizualną do piramidy testów. Nowe strony wchodzą do suity przez URL i baseline — bez kruchych selektorów i ręcznie pisanych skryptów do zrzutów.
Diffy zrzutów pojawiają się inline na pull requestach. Regresje układu są łapane w review, nie na produkcji ani w wątku na Slacku od klienta.
Poruszaj się szybko, nie psując strony głównej. Deterministyczna siatka bezpieczeństwa, która trzyma marketingowy serwis pikselowo stabilnym przez redesigny, testy A/B i migracje tokenów.
Pokrycie wizualne na każdej sandboxie komponentu. Zmiany tokenów, zmiany motywów i refaktoringi komponentów automatycznie dostają audyt, zanim biblioteka zostanie opublikowana.
Waliduj breakpointy mobile, tablet i desktop w tym samym uruchomieniu. Testy responsive przestają być harówką robienia zrzutów i stają się krokiem przeglądu.
CI/CD i pewność wydania
Pewność wydania to nie uczucie. To pipeline, który mówi prawdę o tym, co zaraz trafi do produkcji — również o częściach, do których test runner nie ma zdania. ScanU podpina się do tego pipeline’u jako status check, komentarz PR oraz przechowywany artefakt, do którego można odwołać się z dowolnego post-mortemu.
Model integracji jest celowo nudny: krok przechwytywania ScanU biegnie w tym samym jobie, który już odpala Państwa testy; raportuje pass, review-needed lub fail na PR-ze; a ten status traktowany jest jak każdy inny wymagany check. Zespoły i tak wiedzą, jak czytać zielone, żółte i czerwone w pipeline — check regresji wizualnej wpleciony w ten rytm dodaje nowy wymiar bezpieczeństwa, nie wymagając nowego modelu myślowego.
Pod maską ScanU jest zaprojektowany dla realiów nowoczesnego CI/CD:
Szczegółowy przewodnik integracji CI/CD krok po kroku opisuje podłączenie dla GitHub Actions, GitLab CI, Bitbucket Pipelines oraz self-hostowanych runnerów. Typowy przypadek to jeden dodatkowy job; przypadek zaawansowany to matryca środowisk promująca baseline przez wieloetapowe wydanie.
RODO · Hosting UE · Prywatność
Artefakty testowe to dane. Zrzuty ekranu mogą przy okazji utrwalić dane osobowe, które znalazły się na stronie — imię w pasku nawigacji, e-mail w menu profilu, numer zamówienia na ekranie potwierdzenia. Odpowiedzialna platforma testów wizualnych traktuje te artefakty z tą samą starannością co dane produkcyjne, które odwzorowują.
ScanU jest budowany i hostowany w Unii Europejskiej, z magazynowaniem i przetwarzaniem na infrastrukturze operowanej w UE. Dla zespołów ze zobowiązaniami co do lokalizacji danych — branży regulowanych, zamawiających publicznych, klientów B2B wrażliwych na prywatność — to często wymóg zakupowy, a nie preferencja. ScanU jest zaprojektowany, by ten wymóg spełniać bez kompromisów w możliwościach produktu.
Z tej postawy wynika kilka świadomych decyzji projektowych:
Pełna postawa prywatności — podprocesorzy, hosting regionalny, umowa powierzenia, okna retencji — znajduje się w dokumentacji RODO i przetwarzania danych. Dla większości zespołów liczy się wersja skrócona: Państwa zrzuty zostają w UE, a platforma jest zbudowana tak, aby tam pozostały.
Różnica
Visual testing to zatłoczona kategoria. Sporą część tego, co odróżnia ScanU, stanowi to, czego robić odmawia — skróty, których nie bierze, szum, którego nie przepycha do Państwa kolejki przeglądu, oraz opinie, jakie ma na temat przeglądania diffu.
Generyczne narzędzia do zrzutów dostarczane są zwykle jako biblioteka, którą przykleja się do test runnera, i zostaje Państwu szamotanie się z timingiem, czcionkami, animacjami oraz odwiecznym pytaniem, czy przesunięcie o jeden piksel jest prawdziwym bugiem, czy artefaktem zaokrąglenia. ScanU zajmuje stanowisko twardsze: jeśli platforma nie potrafi wytworzyć deterministycznej rejestracji, to problem platformy — nie Państwa. Dlatego sygnały gotowości, ładowanie czcionek, przypinanie animacji, scroll stitching, diff percepcyjny i maskowane obszary są wbudowane, a nie doklejone.
Cennik trzyma się tej samej logiki. Dla rozsądnego zespołu — kilkadziesiąt stron, trzy silniki, trzy viewporty, jeden pipeline — koszt wizualnego pokrycia nie powinien być pozycją, której trzeba bronić na budżetówce. Pełna strona cenowa jest napisana jasnymi liczbami: co dostajecie w każdym pakiecie, co liczy się jako run i gdzie leży górny pułap. Żadnych ofert szytych na miarę dla zespołów, które chcą po prostu wydać interfejs, który zaprojektowały.
Stabilizacja, gotowość czcionek, przypinanie animacji i scroll stitching są funkcjami platformy — a nie snippetami utrzymywanymi w Państwa własnym repo.
Silnik diffu rozumie anti-aliasing i renderowanie sub-pikselowe, dzięki czemu niewidzialne mikro-przesunięcia nie zagłuszają regresji, które naprawdę się liczą.
Baseline porusza się wyłącznie wtedy, gdy uprawniona osoba akceptuje zmianę. Każda aktualizacja jest audytowalna. Brak cichego dryfu.
Zrzuty, metadane i historia przeglądów żyją na infrastrukturze UE. Żadnego opt-inu dla zespołów, które muszą trzymać się tej postawy.
Co ScanU wyłapuje
Większość błędów, które łapie platforma regresji wizualnej, nie jest egzotyczna. To drobne, niedramatyczne, łatwe do przeoczenia pęknięcia, które przemykają obok reviewerów, bo żadna asercja na nie nie patrzy. Poniżej próbka kategorii, które ScanU jest celowo zbudowany ujawniać.
Błędy wizualne skupiają się w garstce powtarzalnych wzorców. Każdy w izolacji wygląda na banalny; każdy może dolecieć do produkcji bez ani jednego czerwonego testu. Wszystkie ujawniają się jako diff w kolejnym uruchomieniu ScanU — zanim PR zostanie zmergowany.
backdrop-filter. W Safari pasek nawigacji staje się nagle nieprzezroczysty tam, gdzie wcześniej rozmazywał tło.text-wrap: balance wygląda ostro w Chromie, ale pozostaje niezrównoważony w silnikach, które jeszcze go nie wydały. Bez sprawdzenia cross-browser na maszynie dewelopera jest to niewidoczne.Przegląd funkcji opisuje prymitywy wykrywania bardziej szczegółowo — tolerancje percepcyjne, maskowane obszary, przechwyt przy scrollu, branching baseline — i pokazuje, która prymitywa adresuje którą z kategorii powyżej. Dla większości zespołów krótka wersja brzmi: jeśli coś zmienia się wizualnie, ScanU to zauważa; jeśli jest to oczekiwane, akceptujecie jednym kliknięciem; jeśli nie — wyłapaliście to wcześniej niż ktokolwiek inny.
FAQ
Kolejne kroki
Najszybszy sposób, by zdecydować, czy testy regresji wizualnej mają miejsce w Państwa pipeline, to odpalić je raz na projekcie, który już Państwo wydają. ScanU można rozpocząć bezpłatnie, podłącza się do istniejącego joba CI w kilka minut, a pierwszy diff produkuje przy następnym commicie.
Większość zespołów zaczyna od jednej strony o dużym ruchu na trzech przeglądarkach i trzech viewportach. To wystarczy, by zobaczyć platformę w akcji, i wystarczy, by wyłapać kolejną realną regresję, którą obecna suita testów by przegapiła.
Stamtąd zakres rośnie wraz z pewnością zespołu: więcej stron, więcej breakpointów, pokrycie na poziomie komponentu design systemu, obowiązkowy status check na każdym pull requeście. Żadnej rozmowy do zarezerwowania, żadnego onboardingu szytego na miarę, żadnego minimalnego zobowiązania.