Stup

Testiranje i simulacije iza Craft11-a

Svaki kvar migracije koji smo ikad vidjeli u drugom softveru dolazi s istog mjesta: tretiranje “prvo počistite podatke” kao problema korisnika, a ne proizvoda. Nismo to htjeli graditi. Pa smo se rano sudarili sa stvarnim slučajem, i to nas je naučilo nešto što nismo očekivali: ponekad je pravi odgovor na “treba li ovo raditi AI” - ne.

Migracija koja nas je naučila razliku

Imali smo stvaran izvoz iz starog CRM-a za uvoz: 349 tvrtki, 491 bilješku, većinom povijest poziva pisanu na slovenskom, 393 kontakta. Očito rješenje bilo bi provesti to kroz Neo, naš AI-potpomognuti uvoz, isti onaj koji čita neurednu tablicu i predlaže čiste zapise iz nje.

Odlučili smo da ne. Izvorni podaci već su bili strukturirani, već riješeni, već točni. Provođenje kroz AI prolaz ne bi dodalo ništa osim rizika: model koji parafrazira ili sažima stvarne slovenske bilješke o pozivima, tiho gubeći preciznost u tekstu koji je trebao ostati točno onakav kakav je napisan. Zato smo izgradili drugu, odvojenu, namjerno AI-slobodnu putanju: točno, deterministično kopiranje, uparivanje po ID-u starog zapisa, čuvanje izvornih vremenskih oznaka, bez jezičnog modela igdje u tome.

Izgradnja te putanje otkrila je stvarne praznine koje inače ne bismo pronašli: polje forme koje je backend tiho ispuštao tko zna koliko dugo jer stupac u bazi podataka iza njega nikad nije postojao, kontakti koji su se gurali u slobodni tekst bilješki jer nisu imali pravo mjesto za život. Popravili smo oboje, trajno, ne samo za ovu jednu migraciju.

To je sada stvaran oblik Migration Enginea: Neo za iskren nered, bacite nam vašu najgoru tablicu i jasno ćemo vam reći što smo uspjeli, a što nismo razumjeti, i tiha, točna putanja kopiranja za podatke koji su već pouzdani i samo trebaju stići netaknuti. Dva različita problema. Prestali smo se pretvarati da su jedan.

Kako doći do nečega vrijednog testiranja uopće

Ništa od testiranja ispod nema smisla ako ispod toga nema ničeg stvarnog. Iskreno, dio toga kako smo došli dovde počeo je slučajno. Snimanje ekrana stalno se odgađalo, uglavnom obično nevoljkost da sjednemo i nešto pošteno snimimo, pa je stvarno rješenje bilo jednostavno gledati kako AI klika kroz aplikaciju uživo i zapisivati što se dogodilo. To se pokazalo jednom od najboljih metoda debugiranja na koje smo naišli u cijelom projektu, ne pametan plan, nego nusprodukt nevoljkosti da radimo nešto drugo. Nekoliko stvarnih značajki postoji danas jer je bug uhvaćen upravo na taj način.

Veća izgradnja slijedila je sličan oblik, manje po velikom planu, više po nužnosti: jedan stvaran dio odjednom, svaki testiran od početka do kraja prije nego što je počeo sljedeći, jer projekt ove veličine ne ostaje razuman ni na koji drugi način. Ono što nas je stvarno iznenadilo jest da je osnovni testni paket na kraju predviđao stvari koje ga nitko nije tražio da predviđa. Dodajte novu značajku mjesecima kasnije, i Velvet bi ponekad uhvatio da je neki susjedni dio cijelo vrijeme tiho sjedio dopola gotov, čekajući da ga netko primijeti. Ne zato što je itko uključen posebno oštrouman. Test koji stvarno klikne gumb i provjeri stvaran rezultat jednostavno ima način pronalaženja stvari koje osoba koja preleti kod ne bi.

Velvet

Negdje usput naš vlastiti end-to-end testni paket dobio je ime umjesto da ostane samo “testovi”. Zovemo je Velvet. Otprilike pet tisuća linija Playwrighta, kroz dvanaest imenovanih paketa, dim-testovi, regresija, Riznica, AI Selo, action-bus tokovi, tvrdi rubni slučajevi, stres, između ostalih, pokrenutih protiv pet odvojenih sintetičkih zasijanih tvrtki. Ona upravlja stvarnom, pokrenutom aplikacijom, backend i frontend oboje uživo, ne lažiranom zamjenom ni za jedno.

Unutar imenovanih regresijskih paketa, AI pozivi su lažirani na deterministične odgovore, namjerno, ne kao prečac. Pri stvarnom volumenu, pravi AI pozivi udaraju o ograničenja veza preglednika i proizvode kvarove koji nemaju veze s tim radi li proizvod uistinu. Lažiranje tu izolira jedno iskreno pitanje, radi li instalacija, od drugog, je li stvarni AI odgovor dobar, koje se testira odvojeno, stvarno.

Disciplina ispod svakog sloja

Pet pravila vrijedi posvuda gdje se u ovom projektu testira, ne samo u Velvetu:

Zapišite predviđanje prije pokretanja testa, tako da se prolaz kasnije tiho ne može redefinirati kao ono što se slučajno dogodilo. Test koji samo potvrđuje da gumb postoji nije test; mora kliknuti gumb, pričekati stvaran odgovor, uključujući stvarnu latenciju AI-ja, i provjeriti stvarno konačno stanje. Svaka značajka isprobava se onako kako bi trebala raditi, i onako kako bi je stvarna, ponekad nemarna, ponekad neprijateljski nastrojena osoba zapravo pogrešno koristila. Kad se “kvar” pokaže kao bug u testnoj skripti, a ne u proizvodu, i to se prijavljuje, ne tiho zakrpa i zaboravi. A popravak nije gotov kad se kod kompajlira; gotov je kad se točan scenarij koji je puknuo ponovno pokrene, stvarno, i prođe.

Iza Velveta: sedam slojeva, ne jedan

Velvet je jedan sloj od sedam. Stvarna, nelažirana AI provjera pokreće se odvojeno, jednokratna skripta protiv žive aplikacije sa stvarnim pozivima modelu, koja se zatim naknadno počisti, posebno da uhvati vrstu buga koji se pojavljuje samo zato što se odgovor stvarnog modela mijenja iz pokretanja u pokretanje. Simulacija dugog horizonta pokreće simuliranu poslovnu povijest, mjesec, godinu, pet godina, protiv stvarnih zakupaca sa živim AI pozivima cijelo vrijeme, postavljajući ista kanonska pitanja na više točaka kako bi provjerila jesu li odgovori doista postali oštriji kako se povijest gomilala, ne samo jesu li se uopće vratili. Namjeran suparnički sloj, osam neprijateljskih testova koje zovemo Poligon prepreka, pokušava izravno slomiti tvrdnje proizvoda o poštenju i sigurnosti: prompt injection, curenje podataka između zakupaca, proturječne upute, otpornost na brisanje, stvarno financijsko usklađivanje, rukovanje dupliciranim računima. Backend jedinični i integracijski testovi pokrivaju Svetu okosnicu i unos dokumenata od početka do kraja. Vođeni obilasci testiraju stvarno sučelje na stvarnim veličinama ekrana, desktop i pravi mobilni prikaz, sa snimkama zaslona kao dokazom, ne kvačicom na popisu. Čak su i prezentacijski promo videi poslužili kao sloj testiranja: svaki je stvaran scenarij koji pogađa pravu, živu aplikaciju, i svaki trenutak koji je pri pregledu izgledao pomalo čudno pojedinačno je istražen do stvarnog buga ili problema s vremenom snimanja, nikad pretpostavljeno bez provjere.

Kroz sve to, otprilike dvadeset i pet simuliranih godina poslovne aktivnosti, nekoliko industrija, preko devet tisuća stvarnih unosa u Riznicu generiranih usput, jedanaest stvarnih bugova pronađeno i popravljeno. Ukupna stvarna potrošnja na API za cijeli program: 9,57 dolara.

Što nećemo tvrditi

Nismo testirali razmjer poduzeća, tisuće istovremenih zakupaca odjednom. Nismo stres-testirali što se događa s troškom AI-ja pod istinski intenzivnim, otvorenim svakodnevnim razgovorom, za razliku od skriptirane poslovne aktivnosti oko koje je izgrađen većina ovog testiranja. Tijekom gornjeg rada otkrili smo stvaran rizik skaliranja u vlastitom naknadnom popunjavanju embeddinga, jednokratno dostizanje velike Riznice koje se neugodno približilo isteku vremena zahtjeva, i to vam govorimo umjesto da to tiho zakrpamo i ništa ne kažemo.

Ništa ovdje nije savršeno, jer ništa nije. Ono za što se doista možemo zauzeti jest da smo pažljivo pogledali vlastite tvrdnje prije nego što smo vam ih iznijeli, i da vam govorimo što smo pronašli u oba slučaja. To je cijela disciplina. Nastavit ćemo je primjenjivati.

Pitanja koja ljudi stvarno postavljaju

Koristi li Craft11 AI za migraciju starih podataka, ili je to rizično?

Oboje, ovisno o izvoru. Neuredni, nestrukturirani podaci, tablica bez zaglavlja, skenirani cjenik, prolaze kroz Neo, AI-potpomognuti Migration Engine, koji predlaže čiste zapise i iskreno kaže što nije uspio popuniti. Već strukturirani izvozi iz starih sustava dobivaju odvojenu, namjerno AI-slobodnu putanju: točno, deterministično kopiranje. Izgradili smo oba puta jer nas je jedna stvarna migracija naučila da to nisu isti problem.

Što je Velvet?

Naziv za naš vlastiti Playwright end-to-end testni paket, otprilike pet tisuća linija kroz dvanaest imenovanih paketa testova, pokretan protiv stvarnih zasijanih tvrtki, koji upravlja stvarnom, uživo pokrenutom aplikacijom, a ne njezinom lažiranom verzijom.

Je li ovo testiranje savršeno, ili potpuno dovršeno?

Ne, i radije bismo to jasno rekli nego pustili da velika brojka nagovijesti suprotno. Poslovanje u razmjeru poduzeća, tisuće istovremenih zakupaca, nije testirano. Stvarni trošak intenzivne, otvorene svakodnevne upotrebe AI-ja nije testiran na velikom volumenu. Otkrili smo stvaran rizik skaliranja u vlastitom procesu naknadnog popunjavanja embeddinga tijekom testiranja i prijavili ga umjesto da ga tiho popravimo i nastavimo dalje. Testiranje ovdje znači da smo temeljito provjerili i rekli istinu o rezultatu, ne da nema ništa više za pronaći.

Pridružite se Early Crew →← Natrag na sve tekstove

Recorded on a live database and a live screen, but run by automated scripts standing in for a human's clicks and typing, not performed live. When Stark answers faster than the script expects, the screen can hold still for a beat before the next step starts. That's left in on purpose. The goal was never a polished demo reel, it was proof the feature actually works. Dejan's own verdict, after watching the raw footage: rough, but the best demo video we've made.