Copilot wypluł 40 testów w osiem minut. 31 się kompiluje. 22 przechodzi na CI. Pokrycie linii skoczyło z 41% do 58%. Change fail rate na produkcji nie drgnął. Asercja w połowie plików to assertNotNull(result). SAST w tym samym pipeline ma 180 findings, z czego dwanaście to prawdziwy CWE. Nikt nie ma biletu na triage.
To nie jest problem modelu. To jest problem wyroczni. Automatyzacja testów z AI bez bramki wygląda jak jakość kodu. Jest zielonym buildem na obecnym zachowaniu, w tym na błędzie. LLM nie wie, co miało się stać. Wie, co jest w repo.
Poniżej rozróżnienie, którego brakuje w briefach „szukamy testera z AI”: kiedy wynająć jednego SDET (body leasing QA automation), a kiedy piramida testów i SAST wymagają squada. Stawki godzinowe rozpisaliśmy osobno: ile kosztuje body leasing IT w 2026. Tu liczymy, czemu coverage z Copilota jest najdroższym sposobem na spokojny dashboard.
Jedno zdanie, którego nie ma na slajdzie „AI testing”
Test, który przechodzi, nic nie dowodzi. Dowodzi test, który potrafi oblać. Meta na Instagramie i Facebooku nie wrzucała outputu LLM do main. Wrzucała to, co przeszło filtr: build, stabilny pass, mierzalny wzrost pokrycia, akcept inżyniera. 25% wygenerowanych klas podniosło coverage. Reszta spadła na bramce. To jest produkt. Nie prompt.
1. Anatomia: zielony test, martwa wyrocznia
Typowy tydzień jakości w banku, telco albo fintechu nie wygląda jak tutorial Playwright. Wygląda jak trzy rozłączone pętle:
- Unit. Deweloper, JUnit albo pytest, Copilot w IDE. Artefakt: plik
*Test.java, którego nikt nie czyta, bo „przechodzi”. - E2E. QA klika staging albo nagrany Selenium. Flaky na CI, więc job jest
allow_failure: true. - „Bezpieczeństwo”. Sonar / Checkmarx w pipeline. Quality gate ustawiony tak, żeby nie blokował release’u. Findings gniotą się w „won’t fix”.
Trzy objawy, że macie generator, nie automatyzację testów:
- Wyrocznia sklonowana z SUT. Test woła ten sam helper co produkcja i porównuje wynik z wynikiem. Zaokrąglenie FX, rabat, VAT — bug jest w helperze, test go kanonizuje.
- Pokrycie linii bez mutation score. PIT albo Stryker zabiłby mutanta w trzy sekundy. Nikt nie odpala. KPI zespołu to % linii, nie liczba zabitych mutantów.
- SAST bez SLO. Krytyczny CWE w płatnościach wisi 120 dni, bo „false positive last time”. LLM testów tego nie złapie: SAST czyta wzorzec, test czyta zachowanie. To dwa różne alarmy.
Dlatego brief „tester, który umie Copilota” bez kontekstu wyroczni jest najdroższym sposobem na kolejny zielony build. Kompetencje, które faktycznie składają automatyzację testów, siedzą na landingach: testerzy i QA automation, JS/TS (Playwright, Cypress), Java, Python. SAST i Secure SDLC dokładają cybersecurity / DevSecOps. CI, w którym te joby w ogóle działają: DevOps / SRE.
2. Co mówią badania, nie decki „AI writes tests”
Nie potrzebujecie kolejnej definicji shift-left. Potrzebujecie progu, przy którym wygenerowany test ma prawo wejść do main — i prawa, żeby nie wchodził, gdy tylko się kompiluje.
- 75 / 57 / 25 — i dopiero potem człowiek. Alshahwan i in., Automated Unit Test Improvement using Large Language Models at Meta (FSE 2024, arXiv:2402.09171): TestGen-LLM poprawia istniejące testy napisane przez ludzi, nie pisze suity od zera. Na Reels i Stories (Instagram) 75% wygenerowanych testów się buduje, 57% przechodzi stabilnie, 25% podnosi pokrycie. Na test-a-thonach Instagrama i Facebooka narzędzie poprawiło 11,5% klas, do których je puszczono. 73% rekomendacji zaakceptowali inżynierowie Meta na produkcję. Filtr (kompilacja, brak flaków, delta pokrycia) jest po to, żeby halucynacja nie trafiła do main. Autorzy nazywają to Assured Offline LLMSE: output modelu to kandydat, nie kod.
- Pokrycie rośnie, gdy LLM dostaje lukę, nie cały plik. Pizzorno i Berger, CoverUp: Effective High Coverage Test Generation for Python (arXiv:2403.16218): pętla coverage → prompt na niepokryty fragment → test → pomiar. Mediana line+branch 80% versus 47% u CodaMosa; versus MuTAP 89% do 77% łącznie. To nie magia GPT. To feedback z instrumentacji w pętli, analogicznie do PSI w continuous training.
- Czysty ChatGPT psuje asercje. Yuan i in., No More Manual Tests? Evaluating and Improving ChatGPT for Unit Test Generation (arXiv:2305.04207): testy z ChatGPT padają na kompilacji i na złych asercjach. ChatTester (generator + iteracyjny refiner) daje 34,3% więcej testów kompilowalnych i 18,7% więcej z poprawną asercją. Nawet „self-repair” modelu nie zdejmuje wyroczni z człowieka: refiner poprawia składnię i assert, nie specyfikację biznesową.
- Nowszy model nie zastępuje bramki. Konstantinou, Degiovanni i Papadakis (arXiv:2601.09695, 2026) replikują HITS, SymPrompt, TestSpark i CoverUp na nowszych LLM: naiwny prompt bywa lepszy na pokryciu linii (+17,7%), gałęzi (+19,8%) i mutation score (+20,9%) niż starsze pipeline’y. Wniosek operacyjny jest odwrotny do slajdu „kupcie Copilota”: silniejszy model zwiększa volume kandydatów. Volume bez filtra to więcej zielonych testów do recenzji. Recenzja jest wąskim gardłem, nie token.
Kluczowy wniosek architektoniczny
Automatyzacja testów z AI zaczyna się od bramki, nie od licencji. Generator pisze kandydata. CI sprawdza: kompilacja, brak flaka, delta pokrycia albo mutation score, brak klonu wyroczni z SUT. SAST osobno: krytyczny CWE blokuje merge. Człowiek (SDET) akceptuje to, czego filtr nie umie: czy asercja opisuje kontrakt, czy dzisiejszy bug. Jeśli którykolwiek stopień jest „wklej z Copilota i merge”, nie macie jakości kodu. Macie prędkość.
3. Studium z produkcji: coverage 71%, bug w FX na prod
Z praktyki inżynieryjnej: od Copilota do mutation score
API płatności, Java 17 + Spring Boot, E2E w Playwright, SAST: SonarQube w GitLab CI. Zespół pracował tak:
- unit: deweloper + Copilot, JUnit 5, coverage gate 60% linii,
- E2E: QA, nagrane ścieżki happy-path, job zaznaczony jako opcjonalny,
- SAST: quality gate wyłączony na hotfix branchu „żeby zdążyć”,
- metryka sprintu: % pokrycia. Nie change fail rate. Nie liczba zabitych mutantów.
Problem: w sprincie coverage billing modułu poszło z 44% na 71%. Dwa tygodnie później na produkcji zaokrąglenie FX (grosze przy przewalutowaniu) zaniżyło kwotę. Testy wołały FxRounding.round(amount) — ten sam helper co produkcja — i porównywały z wynikiem helpera. Bug był w helperze. Suite go pieczętowała. Sonar oznaczał zduplikowaną logikę od czterech miesięcy. Ticket: won’t fix.
Zmiana: bramka jak u Meta, tylko na stacku Spring. Nowy test z LLM wchodzi, gdy: (1) kompiluje się, (2) przechodzi trzy razy z rzędu, (3) PIT pokazuje dodatnią deltę mutation score na klasie, (4) asercja nie woła SUT jako wyroczni — expected jest stałą, tabelą przypadków albo osobnym oracle w testdata, (5) SDET recenzuje PR. SAST: CWE w pakiecie payments blokuje merge, nie otwiera Slacka.
Pomiar: coverage spadło na papierze (wyrzucono tautologiczne testy). Mutation score na billing wzrosło. Kolejny hotfix FX złapał się na CI, nie u klienta. Czas recenzji PR z testami: minuty, nie „akceptujemy bo zielone”. To nie Copilot Enterprise. To właściciel wyroczni.
Liczby z papieru Meta nie przenoszą się 1:1 na Wasz billing. Przenosi się mechanika: 75% „się buduje” to jeszcze nie jakość. 25% z deltą pokrycia i 73% akceptu to już proces, który da się audytować przed komisją ryzyka — analogicznie do bramki PSI w usługach MLOps.
4. Tabela decyzyjna: jaki test, jaki skład
| Podejście | Złożoność | Sygnał jakości | Koszt CI / tokenów | Narzut na zespół | Kiedy stosować |
|---|---|---|---|---|---|
| Manual / eksploracja | Niska | Wysoki na UX i brzegach, zerowy na regresji | Niski | Wysoki przy każdym release | Nowa powierzchnia, brak kontraktu API, PoC |
| Nagrane E2E (Selenium IDE, codegen) | Niska | Happy-path; flaky przy CSS | Średni (minuty na job) | Średni (naprawa selektorów) | Demo, nie piramida; nie jako jedyna bramka |
| SDET + piramida (unit, API, wąskie Playwright) | Średnia | Regresja, kontrakt, p95 joba | Średni | Średni, spada gdy suite stoi | Produkt z CI, stały zespół, SLA na release |
| LLM dump (Copilot → commit, gate = coverage) | Niska | Fałszywy: linie rosną, mutanty żyją | Niski–średni (tokeny) | Ukryty (dług recenzji i prod) | Nigdy jako bramka merge. Ćwiczenie, nie proces |
| Assured LLMSE (filtr Meta: build, pass, delta, akcept) | Wysoka | Delta pokrycia / mutation score + recenzja | Średni–wysoki (pętla + tokeny) | Wysoki na starcie, spada gdy filtr stoi | Duży monolit, istniejąca suita, SDET na bramce |
| SAST z SLO (CWE w critical path blokuje) | Średnia | Wzorzec w kodzie, nie zachowanie | Niski–średni | Triage; bez właściciela = zero | Płatności, IAM, dane osobowe; obok testów, nie zamiast |
QA automation / SDET nie jest „tańszym deweloperem” i nie jest pentestem. Widełki 2026: specjalista 110–160 PLN/h, klient 160–240 PLN/h, 26–38 tys. B2B. Manualny tester schodzi istotnie niżej. Pentest i GRC siedzą na innym landingu. Marża 10–25%. Mapa, nie cennik — szczegóły w stawkach 2026.
5. Anty-wzorce, których nie ma w tutorialu Copilota
- Coverage jako KPI generatora. Zespół celebruje 71% linii. PIT zostawiłby 40% mutantów żywych. Meta publikuje 25% klas z deltą pokrycia nie dlatego, że model jest słaby. Dlatego, że filtr wyrzuca resztę. Wasz dashboard bez tego filtra kłamie w drugą stronę.
- Expected liczone tym samym kodem co produkcja. Klasyk w billingu, podatkach, FX, alokacji rabatów. Test „dokumentuje” bug. Wyrocznia to tabela przypadków, stała z księgowości albo osobny, recenzowany oracle. Nie
service.calc(x)versusservice.calc(x). - SAST w trybie informacyjnym na zawsze. 180 findings, zero ownera, quality gate wyłączony na hotfix. LLM testów nie zastąpi SAST: nie przeczyta CWE-89 w string concatenation, jeśli asercja sprawdza HTTP 200. Odwrotnie: SAST nie złapie błędnego zaokrąglenia grosza. Dwa alarmy. Dwóch właścicieli albo jeden SDET z DoD na oba.
- Brief „QA z AI” na rolę SDET. Dostaniecie kogoś, kto klika i wkleja. Nie dostaniecie człowieka, który odrzuci 75% outputu modelu. Rynek pękł tak samo jak przy MLOps: klasyczny tester ma podaż, SDET z wyrocznią i CI nie. Ogłoszenie ze złą etykietą zbiera CV w 48 h i zero kompetencji od mutation score.
- Fałszywy zespół jakości. Manual z vendora A, „ktoś od Cypressa” z B, SAST „w 10% z security”. Trzy onboardingi, zero wspólnego Definition of Done na merge. Anatomię tego błędu rozpisaliśmy w team leasing vs body leasing 2026. To nie staff augmentation. To podatek integracyjny.
6. Playbook: kogo wynająć i w jakiej kolejności
Nie zaczynajcie od licencji Copilota Enterprise. Zacznijcie od pytania, która pętla blokuje release: unit, E2E, SAST czy brak właściciela wyroczni.
- Jedna luka w istniejącej piramidzie. Macie JUnit/pytest, Playwright na krytycznej ścieżce, CI, kogoś kto recenzuje PR. Brakuje właściciela filtra LLM i triage SAST. To klasyczny body leasing testerów i SDET: jedna osoba, Wasz stand-up, Wasze DoD. Pierwsze profile w dniach, nie w kwartale — sourcujemy na żądanie, nie sprzedajemy imiennej ławki na jutro rano.
- Jedynym testem jest klik. Nie ma unitu, nie ma kontraktu API, Sonar stoi od pół roku. Jedna osoba tego nie zszyje. Skład 3–5: SDET (piramida, CI), QA eksploracyjny (to, czego generator nie wymyśli), DevOps jeśli joby nie istnieją. To bliżej team leasingu niż „dokupimy Copilota i juniora”.
- Dane testowe nie wychodzą z VPC. Fixtures płatności, PESEL, NDA. Kontraktor w Waszym IAM, Wasze środowisko, umowa T&M z NDA, powierzeniem i IP po stronie klienta. Zrzut prod na Colab „żeby Copilot lepiej zgadł testy” jest wyciekiem. Prompt z kodem pod NDA do chmury publicznego modelu — też.
- Ramp-up. Osoba do istniejącego zespołu: pierwsze CV 24–48 h, start po Waszych rozmowach i umowie. Squad od zera: tygodnie, nie sprint, bo zszywacie uprawnienia, dane testowe i DoD na merge. Kłamstwo „trzech seniorów SDET od poniedziałku” to CV albo ławka, której nie mamy — i nie będziemy udawać.
Commoditech od 2012 robi T&M i rekrutację stałą z Warszawy. 80+ specjalistów w sieci, nie idle bench. Brief T&M albo success fee da się złożyć z IDE przez MCP dla agentów AI, nie tylko z formularza. Kwoty na konkretny stack liczy człowiek; widełki są w artykule o stawkach, nie w JSON-ie agenta.
FAQ
Czy LLM zastąpi automatyzację testów i testerów QA?
Nie. LLM jest generatorem kandydatów. Meta TestGen-LLM: 75% testów się buduje, 57% przechodzi stabilnie, 25% podnosi pokrycie. 73% rekomendacji weszło na produkcję, bo filtr (kompilacja, pass, delta pokrycia) i recenzja inżyniera obcięły resztę. Bez bramki kupujecie zielone asercje na obecnym zachowaniu, w tym na błędzie. ChatTester pokazuje, że nawet self-repair modelu naprawia składnię, nie specyfikację.
Kiedy wynająć jednego SDET, a kiedy skład QA?
Jedną osobę, gdy piramida stoi (unit + API + wąskie E2E w CI), a brakuje właściciela bramki: mutation score, triage SAST, recenzja testów z Copilota. Skład 3–5 (SDET + QA eksploracyjny + ktoś od CI), gdy jedynym testem jest klik w stagingu, a Sonar od pół roku ma 200 findings w „won’t fix”. Sam SDET nie napisze wyroczni biznesowej za product ownera. Sam manual nie utrzyma joba w GitLabie. Jeśli nie macie komu recenzować PR-a od kontraktora, nie kupujcie body leasingu. Kupcie lead plus jedną rolę albo squad.
Ile kosztuje body leasing SDET / QA automation w Polsce w 2026?
QA automation / SDET: specjalista 110–160 PLN/h, klient 160–240 PLN/h, 26–38 tys. B2B. Manualny tester jest istotnie taniej; SDET nie. Pentest i NIS2 to inna stawka i inny landing. Marża dostawcy 10–25% — jeśli ktoś obiecuje 8% przy zastępstwie w 5 dni, doliczcie to w innej linii. To mapa rynku, nie oferta. Kwotę na brief liczy człowiek. Szczegóły w stawkach 2026.
Czym SAST różni się od testów generowanych przez LLM?
SAST czyta kod bez uruchamiania i szuka wzorców (SQLi, XSS, sekrety, CWE). LLM pisze test, który ma oblać złe zachowanie. SAST bez właściciela to dashboard false positive. LLM bez filtra to coverage vanity. Oba potrzebują SLO: krytyczny CWE nie może wisieć w „informational”, test z Copilota nie może wejść bez delty mutation score. To nie zamienniki. To dwa joby w jednym DoD na merge.
Źródła
- Alshahwan, N., Chheda, J., Finogenova, A., Gokkaya, B., Harman, M., Harper, I., Marginean, A., Sengupta, S., Wang, E. (2024). Automated Unit Test Improvement using Large Language Models at Meta. FSE 2024. arXiv:2402.09171. arxiv.org/abs/2402.09171
- Pizzorno, J. A., Berger, E. D. (2024). CoverUp: Effective High Coverage Test Generation for Python. arXiv:2403.16218. arxiv.org/abs/2403.16218
- Yuan, Z., Lou, Y., Liu, M., Ding, S., Wang, K., Chen, Y., Peng, X. (2023/2024). No More Manual Tests? Evaluating and Improving ChatGPT for Unit Test Generation. arXiv:2305.04207. arxiv.org/abs/2305.04207
- Konstantinou, M., Degiovanni, R., Papadakis, M. (2026). How well LLM-based test generation techniques perform with newer LLM versions? arXiv:2601.09695. arxiv.org/abs/2601.09695
- DORA / Google Cloud (2024). Accelerate State of DevOps Report.
- Commoditech — stawki body leasingu 2026, team leasing vs body leasing, wynajem testerów i SDET.