IT Systems Integration Consultant
GraphQL testovanie má jednu zradnú vlastnosť: API ti pri chybe často odpovie HTTP 200 OK. Status kód nestačí – chyby sa skrývajú v tele odpovede. Na rozdiel od REST API nemá tento dopytovací jazyk desiatky endpointov, ale jeden jediný, do ktorého klient posiela vlastné queries. Tento návod ťa prevedie od základných konceptov, cez bezpečnostné riziká, až po praktické testovanie na reálnom API.

V článku sa dozvieš:
GraphQL je dopytovací jazyk (query language) pre API, ktorý vyvinul Facebook v roku 2015. Od roku 2018 je open-source projekt spravovaný GraphQL Foundation. Základná myšlienka je jednoduchá: klient si presne určuje, aké dáta chce získať – nie server.
Na rozdiel od klasického REST API, kde každý endpoint vracia pevne definované polia, GraphQL umožňuje v jednej požiadavke získať len tie údaje, ktoré skutočne potrebuješ. Ak chceš profil používateľa s menom a emailom, vráti presne tieto polia. Ak potrebuješ aj zoznam jeho príspevkov, zahrnúť ich môžeš do toho istého query. Tento prístup odstraňuje over-fetching (príliš veľa dát) aj under-fetching (nutnosť volať ďalšie endpointy).
Pre testerov je kľúčové, že všetky požiadavky prechádzajú jedným endpointom – zvyčajne /graphql. To zásadne ovplyvňuje celý prístup k plánovaniu a pokrytiu testovania.
…GraphQL pôvodne vznikol vo Facebooku v roku 2012 ako interné riešenie pre mobilnú aplikáciu? Vývojári potrebovali znížiť počet HTTP requestov a objem dát na pomalých sieťach. Public release prišiel v roku 2015 a v roku 2018 sa stal open-source projektom pod GraphQL Foundation.
Query language je jadro GraphQL – umožňuje klientom presne definovať, aké dáta chcú získať, a server vráti len tieto polia, nič viac, nič menej. V praxi to znamená, že jeden dopyt môže nahradiť viacero REST volaní, čo zvyšuje efektivitu prenosu dát a zjednodušuje testovanie.
Vnorené požiadavky sú ďalšou silnou stránkou: klient môže načítať súvisiace dáta naraz. Napríklad jedným dopytom je možné získať používateľa spolu s jeho príspevkami a komentármi, presne špecifikovať požadované polia a filtrovať to, čo nie je potrebné.
Takto vyzerá základné query v praxi:
query {
user(id: "1") {
id
name
email
posts {
id
title
}
}
}
Klient načíta používateľa s ID 1 a zároveň jeho príspevky. Server vráti len požadované polia – žiadny zbytočný prenos dát.
GraphQL rozlišuje tri typy operácií, pričom každá má jasne definované správanie a zodpovedajúcu sémantiku:
Takto vyzerá rovnaká operácia zapísaná ako query a ako mutation:
# Query – načítanie používateľa
query {
user(id: "1") {
id
name
email
}
}
# Mutation – zmena mena používateľa
mutation {
updateUser(id: "1", name: "Jana Nová") {
id
name
}
}
Schéma v GraphQL je kontrakt medzi klientom a serverom. Definuje, aké typy dát v API existujú, aké operácie sú dostupné a ako sú dáta navzájom prepojené. Na rozdiel od REST tu nie je dokumentácia zvonku – schéma je priamo súčasťou API a je vždy aktuálna.
Silné typovanie znamená, že každé pole má presne definovaný typ. Nástroje to využívajú na validáciu queries ešte pred odoslaním – ak sa pýtaš na pole, ktoré neexistuje, dostaneš chybu okamžite, nie až z produkcie.
Pre testerov je mimoriadne dôležitá vlastnosť nazývaná GraphQL introspection (schopnosť API opísať vlastnú schému). Nástroje ako GraphiQL alebo Postman ju využívajú na automatické zobrazenie všetkých dostupných operácií, parametrov a typov – vždy aktuálna dokumentácia priamo v testovacom prostredí, bez nutnosti spoliehať sa na Wiki alebo Confluence.
Väčšina porovnaní REST a GraphQL sa sústreďuje na perspektívu vývojára. Z pohľadu testovania sú však kľúčové konkrétne dôsledky pre overovanie a kontrolu dát. Porovnanie sa oplatí aj pri rozhodovaní o testovacej stratégii.
| Oblasť | REST API | GraphQL |
|---|---|---|
| Endpointy | Každý resource = vlastný endpoint (/users, /posts…) | Jeden endpoint pre celé API (/graphql) |
| HTTP stavové kódy | Chyby = HTTP 4xx / 5xx | Chyby = HTTP 200 + errors pole v tele odpovede |
| Štruktúra odpovede | Fixná, server určuje tvar odpovede | Flexibilná, klient definuje, aké polia chce |
| Verzie API | Explicitné verziovanie (/v1/, /v2/) | Bez verziovania, schéma sa rozširuje dopredne |
| Caching | Natívny HTTP caching (GET) | Zložitejší, vyžaduje knižnice (Apollo Client) |
| Dopad na testovanie | Testuješ konkrétny endpoint a metódu | Testuješ kombinácie polí, operácií a vnorení |
Testeri zvyknutí na REST sa pri prvom kontakte s GraphQL stretávajú s troma typickými pascami:
Najväčší dopad na to, ako pristupuješ k testovaniu, majú štyri rozdiely:
Voľba medzi REST a GraphQL závisí od charakteru dát a klientov. REST je vhodnejší pre jednoduché CRUD operácie a API s aktívnym HTTP cachingom. Tento prístup sa oplatí pri komplexných dátových modeloch, mobilných aplikáciách s obmedzenou šírkou pásma a rýchlo sa meniacich produktoch. Mnohé moderné systémy využívajú kombináciu oboch prístupov.
Testovanie tohto typu API si vyžaduje špecifický prístup, pretože všetky dopyty a mutácie prechádzajú jedným endpointom a odpovede sú flexibilné. Nižšie sú hlavné oblasti, ktoré by mali byť pokryté v každom testovacom pláne.
Základné funkčné testovanie GraphQL API zahŕňa overenie, že queries vracajú správne dáta a že mutations skutočne vykonávajú zmeny. Konkrétne treba pokryť:
Takto vyzerá chybová odpoveď GraphQL pri neplatnom query – HTTP status je 200, chyba je skrytá v tele:
# Neplatné query – pole neexistuje v schéme
query {
user(id: "1") {
id
nonExistentField
}
}
# Odpoveď servera (HTTP 200!)
{
"errors": [
{
"message": "Cannot query field 'nonExistentField' on type 'User'.",
"locations": [{ "line": 4, "column": 5 }]
}
],
"data": null
}
Základom celého GraphQL API a zároveň jeden z najdôležitejších predmetov testovania je schéma. Schema validácia odhaľuje tzv. breaking changes – zmeny, ktoré spôsobia, že existujúce queries prestanú fungovať. Ak vývojár premenuje alebo odstráni pole zo schémy, pokazia sa všetky klientské aplikácie, ktoré ho využívajú.
Praktický postup: Stiahni snapshot schémy cez introspection query pred nasadením a po ňom. Porovnaj oba snapshoty – akákoľvek nekompatibilná zmena by mala byť zachytená ako zlyhanie testu, nie až ako hlásenie z produkcie.
Tento krok sa dá plne automatizovať v CI/CD pipeline a odporúčame ho nasadiť čo najskôr – je to jedna z najefektívnejších poistiek proti neúmyselnému rozbitiu API pri nasadzovaní.
Oproti REST API prináša GraphQL špecifické bezpečnostné riziká, ktoré sú oveľa menej výrazné alebo neexistujú vôbec. Každý tester by mal poznať nasledujúce typy útokov a vedieť ich otestovať:
Variabilita GraphQL requestov znamená, že rôzne kombinácie polí môžu mať dramaticky odlišné časy odpovede. Jednoduchý query na meno užívateľa a komplexný query na celú sieť jeho vzťahov idú na ten istý endpoint, ale ich náročnosť je neporovnateľná.
Známa výkonnostná pasca je N+1 problém. Pri načítaní zoznamu 100 príspevkov server vykoná 100 samostatných requestov do databázy na načítanie autora každého z nich – výsledok je 101 databázových queries namiesto 2. Riešenie (DataLoader pattern) existuje, ale musíš otestovať, či je skutočne nasadené a či resolver zvláda efektívne agregovať dáta.
Pre výkonnostné testy GraphQL API odporúčame nástroje k6, JMeter alebo Artillery.
Výber nástroja závisí od fázy testovania – či ide o manuálne preskúmanie, automatizované regresné testy alebo záťažové testy. Tu je prehľad najpopulárnejších možností pre testovanie GraphQL:
| Nástroj | Popis | Typ testovania |
|---|---|---|
| GraphiQL | Vstavaný interaktívny editor v prehliadači. Autocomplete zo schémy, vstavaná dokumentácia, okamžité spustenie queries. | manuálne |
| GraphQL Playground | Rozšírená verzia GraphiQL s podporou viacerých endpointov a vizualizáciou schémy. Často vstavaný priamo do API. | manuálne |
| Postman | Podpora GraphQL od verzie 7.2+. Collections, pre-request skripty, prostredia, integrácia s CI/CD. | manuálne/auto |
| Altair GraphQL Client | Open-source, multiplatformový klient. Podpora subscriptions cez WebSocket, import/export schémy. | manuálne |
| Apollo Testing Utilities | MockedProvider pre unit testy React komponentov komunikujúcich cez GraphQL. | automatizované |
| EasyGraphQL | Automatické generovanie testov zo schémy. Fault injection – testovanie neplatných queries. | automatizované |
| k6 / JMeter / Artillery | Load a výkonnostné testy. Simulácia súbežných GraphQL queries, meranie latencií. | výkonnostné |
Pre tímové prostredie odporúčame začať s nástrojom Postman, ktorý väčšina testerov pozná z REST API testovania. Postman podporuje GraphQL natívne a umožňuje zdieľať kolekcie queries v tíme.
Ak testuješ aj SOAP API v projektoch, pozri sa na SoapUI návod. Pre správu API dokumentácie je relevantný aj Swagger pre QA – hoci sa primárne používa pre REST, kombinovaná znalosť oboch štandardov ti dá komplexnejší pohľad na API testovanie.
Nástroje ako Postman alebo Altair pokrývajú manuálne a základné automatizované testovanie. V praxi sa čoraz častejšie využívajú aj end-to-end nástroje – API testing v Cypress napríklad umožňuje testovať toto API nepriamo cez UI alebo priamo cez sieťové requesty.
Testovanie GraphQL API v praxi: hands-on tutoriál
Skôr než s GraphQL začneš, je dobré ho vnímať ako súčasť širšieho kontextu pre testovanie webových aplikácií, kde sa API testy kombinujú s UI a end-to-end scenármi. V kontexte full-stack testovanie pokrýva logiku a dátovú vrstvu backend testovanie. Najlepší spôsob, ako pochopiť toto testovanie, je vyskúšať si ho na reálnom API.
Na tento účel použijeme verejné GraphQLZero API (graphqlzero.almansi.me) – bezplatné, bez registrácie, ideálne pre učenie. Rovnaký postup funguje pre akékoľvek API v tvojich projektoch.
Otvor GraphQL Playground alebo GraphiQL na adrese GraphQLZero API. Klikni na tlačidlo Schema alebo Docs v pravom paneli – nástroj automaticky spustí introspection query a zobrazí všetky dostupné typy, operácie a parametre.
Hľadáš: zoznam dostupných query a mutation, parametre každej operácie, typy návratových hodnôt a to, či sú polia povinné alebo nepovinné. Toto je základ pre zostavenie testovacieho plánu.
Napíš jednoduchú query na konkrétneho užívateľa – požiadaj o jeho id, meno, email a adresu. Spusti query a skontroluj odpoveď. Over štyri veci: HTTP status je 200, pole data obsahuje objekt user, všetky požiadané polia majú hodnoty a pole errors v odpovedi neexistuje.
query {
user(id: "1") {
id
name
email
address {
city
zipcode
}
}
}
Teraz query úmyselne rozbi – opýtaj sa na pole, ktoré neexistuje. Odpoveď stále vráti HTTP 200, ale bude obsahovať pole errors s popisom chyby. Toto je základný reflex, ktorý si musíš vypestovať: vždy kontroluj telo odpovede, nielen status.
Vytvor nový záznam cez mutation – napríklad nový príspevok s názvom, body a ID autora. Over, že odpoveď obsahuje ID nového záznamu a že pole errors neexistuje.
mutation {
createPost(input: {
title: "Testovací príspevok",
body: "Obsah príspevku pre testovanie.",
userId: "1"
}) {
id
title
}
}
Potom pošli mutation s neplatným vstupom – napríklad bez povinného parametra. Odpoveď musí obsahovať errors pole s popisom toho, čo je neplatné. Každú mutation testuj s platným vstupom, neplatným vstupom aj hraničnými hodnotami (extrémne dlhý text, špeciálne znaky, null hodnoty).
Otestuj, či je introspection povolená – na produkčnom prostredí by mala byť vypnutá. Pošli nasledujúcu introspection query:
query {
__schema {
types {
name
}
}
}
# Na produkčnom prostredí by server mal odpovedať:
# { "errors": [{ "message": "GraphQL introspection is not allowed..." }] }
# Ak vráti zoznam typov, introspection je zapnutá – bezpečnostný nález!
Skús poslať aj extrémne hlboko vnorenú query – ak server neobmedzuje hĺbku, trvá dlho alebo sa zastaví, je to ďalší bezpečnostný problém na nahlásenie.
Pre hlbšie štúdium odporúčame oficiálnu GraphQL dokumentáciu a Apollo Server testing docs.
Využíva sa všade tam, kde rôzni klienti potrebujú rôzne pohľady na tie isté dáta. Mobilná aplikácia, webový dashboard a externé API môžu byť obsluhované jedným GraphQL endpointom. Populárne nasadenia zahŕňajú GitHub API v4, Shopify, Twitter a Airbnb. Vo firemných systémoch sa objavuje najmä v moderných SPA aplikáciách a mikroslužbách.
Nie je to otázka lepšieho alebo horšieho – sú to rôzne nástroje pre rôzne situácie. Je vhodnejší pre komplexné dátové modely, rýchlo sa meniace produkty a scenáre s rôznymi typmi klientov. REST je vhodnejší pre jednoduché CRUD operácie, verejné API s agresívnym cachingom a prípady, kde je simplicity kľúčová. V praxi mnohé systémy používajú obe technológie vedľa seba.
Má strmšiu učebnú krivku – vývojári aj testeri musia pochopiť nový spôsob myslenia. Caching je zložitejší, pretože tento štandard nepoužíva štandardný HTTP caching. Bezpečnostné nastavenie vyžaduje viac pozornosti (introspection, query complexity limity). Napriek tomu je záujem o GraphQL v enterprise segmente rastúci.
Sú to technológie pre úplne odlišné vrstvy, nemá zmysel ich priamo porovnávať. SQL je jazyk pre priamu komunikáciu s relačnou databázou. Je to API vrstva pre komunikáciu medzi klientom a serverom. V praxi resolver na pozadí volá SQL queries do databázy. Je to ako sa pýtať, či je lepší HTML alebo Oracle – každý rieši iný problém.
Toto testovanie zahŕňa manuálne preskúmanie schémy cez introspection, funkčné testy query a mutation, schema validáciu pre zachytenie breaking changes, bezpečnostné testy (introspection v produkcii, deep query attacks) a výkonnostné testy (N+1 problém). Na manuálne testovanie odporúčame začať s Postmanom alebo GraphiQL, pre automatizáciu Apollo Testing Utilities alebo EasyGraphQL.
GraphQL testovanie sa od RESTu líši hlavne tým, že namiesto viacerých endpointov pracuješ s jedným a klient si skladá vlastné queries. Chyby sa vracajú aj pri HTTP 200, takže nestačí sledovať len status kódy – vždy kontroluj telo odpovede. Navyše treba počítať s veľkým množstvom kombinácií dopytov a špecifickými bezpečnostnými rizikami.
Začni manuálnym preskúmaním schémy cez introspection a pár základnými funkčnými testami – pochopíš tak, ako API naozaj funguje. Potom si nastav automatickú validáciu schémy v CI/CD – je to najlacnejší spôsob, ako odhaliť breaking changes skôr, než sa dostanú do produkcie. Až keď máš pokrytý základ, má zmysel ísť hlbšie do bezpečnostných a výkonnostných testov.
Ak ťa téma chytila a uvažuješ o kariére v QA, pozri si kariérne príležitosti v msg life alebo články o tom, ako sa stať IT testerom a aké sú nároky na pozíciu IT testera.
Súvisiace články