Handmatige testen (IT)Handmatige QA Ingenieur

Wanneer je een **GraphQL** schema-migratie van een legacy **REST** API valideert die heterogene mobiele cliënten bedient met verschillende ondersteuning voor versies en levenscycli, welke systematische handmatige teststrategie zou je toepassen om backward compatibility te waarborgen terwijl je verifieert dat het gebruik van verouderde velden juiste mechanismen voor verfijnde degradatie activeert?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord op de vraag

Stel een systematische versie-matrixmethodologie op door eerst te documenteren welke specifieke velden elke mobiele clientversie gebruikte met behulp van Charles Proxy of Burp Suite om productie verkeer te onderscheppen, en een afhankelijkheidskaart te creëren die iOS en Android appversies verbindt met GraphQL schema-velden. Voer contract-gevalideerde exploratieve testen uit door handmatige queries op te stellen die legacy clientaanvragen nabootsen, opzettelijk null-waarden in verouderde velden in te voegen om te verifiëren dat mobiele clients ontbrekende gegevens afhandelen via foutgrenzen in plaats van te crashen. Implementeer schaduwtesten door parallelle REST en GraphQL verzoeken via Postman-verzamelingen uit te voeren, en vergelijk responspayloads op semantische gelijkwaardigheid terwijl je ervoor zorgt dat de verouderingsheaders en @deprecated-directieven client-side logging triggeren zonder de gebruikersinterface te breken.

Situatie uit het leven

Probleemomschrijving

Ons e-commerceplatform migreerde zijn productcatalogus van REST-eindpunten naar een uniform GraphQL-schema om een nieuwe aanbevelingsengine te ondersteunen, maar we ondersteunden iOS versies die teruggingen tot v12.4 (uitgebracht in 2019) en Android versies tot API-niveau 28 (Android 9), wat een matrix creëerde van meer dan 15 actieve appversies met verschillende GraphQL clientmogelijkheden. Het kritieke risico was dat iOS v14.2-clients afhankelijk waren van een verouderd veld productVariants dat werd vervangen door productOptions, en als dit veld onverwachte null-waarden in plaats van lege arrays terugstuurde tijdens het verouderingsvenster, zou de Swift parsinglogica de applicatie geforceerd laten crashen. Bovendien hanteerden Android clients die Apollo Client v2.5 gebruikten nullabiliteit anders dan de iOS Alamofire-implementaties, wat betekende dat dezelfde schemawijziging stille gegevenscorruptie op het ene platform kon veroorzaken terwijl het andere crasht.

Oplossing 1: Uitgebreide end-to-end regressietests

We overwoog het uitvoeren van volledige regressiesuites op fysieke apparaten voor elke ondersteunde OS-versie, handmatig navigeren door productcatalogusflows om visuele consistentie en gegevensintegriteit over alle platforms te verifiëren. Deze aanpak zou absolute zekerheid bieden dat gebruikersfunctionaliteit correct werkte en zou platformspecifieke UI-glitches gerelateerd aan GraphQL-gegevensbinding opvangen. Dit vereiste echter toegang tot meer dan 40 fysieke apparaten en ongeveer drie weken testtijd, wat onze migratietermijn van twee weken overschreed en geen garantie bood voor het detecteren van subtiele API-contractschendingen die alleen onder specifieke netwerkomstandigheden verschenen.

Oplossing 2: API-contracttesting met gemockte clientantwoorden

De tweede aanpak hield in dat we Postman en Mockoon gebruikten om de exacte querystructuren die werden verzonden door legacy mobiele cliënten te simuleren, waarbij we verifiëren dat het GraphQL-schema syntactisch correcte JSON-antwoorden retourneert die overeenkomen met historische REST-payloadstructuren. Deze methode was significant sneller, waardoor we alle versiecombinaties binnen drie dagen konden testen, en een nauwkeurige validatie van verouderingsheaders en veldnullabiliteit bood. Helaas miste deze puur synthetische test belangrijke platform-specifieke parsergedragingen, zoals het falen van de iOS Swift Codable protocol bij onverwachte null versus ontbrekende sleutels, die alleen in echte clientomgevingen tot uiting kwamen.

Oplossing 3: Risico-gebaseerd intercept testen met productanalytics

We kozen uiteindelijk voor een hybride strategie die Firebase Analytics-gegevens analyseerde om de top drie OS-versies per platform te identificeren die 85% van onze actieve gebruikersbasis vertegenwoordigden, vervolgens gebruikten we Charles Proxy om live verkeer te onderscheppen en REST-antwoorden om te zetten in GraphQL-queries terwijl we de stabiliteit van de client monitoren. Dit stelde ons in staat om echte querypatronen en netwerklatentieomstandigheden te testen, terwijl we de handmatige validatie-inspanning concentreerden op hoog-impact versiecombinaties, aangevuld door geautomatiseerde contracttests voor randgevallen. We kozen dit omdat het de risicobeheersing in balans hield met tijdsbeperkingen, en we hadden vertrouwen dat de migratie de meerderheid van de gebruikers niet zou beïnvloeden, terwijl we specifieke compatibiliteitsproblemen identificeerden zoals de iOS null-afhandelingsfout.

Gekozen oplossing en resultaat

We implementeerden Oplossing 3, met de nadruk op handmatige tests op iOS 14.2, 15.0 en 16.0 samen met Android 10, 11 en 12, gebruikmakend van Charles Proxy om de veroudering van het productVariants-veld te simuleren door null-waarden terug te geven en te monitoren op crashes. Tijdens de tests van iOS v14.2 ontdekten we dat wanneer het verouderde veld null retourneerde, de client-app crasht met een EXC_BAD_ACCESS-fout in plaats van de alternatieve UI weer te geven, wat onthulde dat de Swift foutgrens de GraphQL foutresponse onjuist parseerde. We documenteerden dit als een kritisch defect, implementeerden een server-side schemawijziging om lege arrays met verouderingswaarschuwingen in plaats van null-waarden te retourneren voor een periode van zes maanden, en stelden monitoringalerts in voor GraphQL foutpercentages gesegmenteerd per appversie; de migratie ging door met nul crashes op ondersteunde versies.

Wat kandidaten vaak missen

Hoe verifieer je dat GraphQL querydieptelimits en complexiteitsscores tijdens handmatig testen goed worden afgedwongen zonder toegang tot server-side logs of geautomatiseerde load testing tools?

Veel kandidaten gaan ervan uit dat het testen van GraphQL-beveiliging geautomatiseerde scripts vereist, maar handmatige testers kunnen geneste queries construeren met behulp van GraphiQL of Insomnia door opzettelijk cirkelreferenties of diep geneste objecten te creëren om DoS-beveiligingsmechanismen te triggeren. Je moet verifiëren dat de API specifieke foutcodes retourneert zoals GRAPHQL_VALIDATION_FAILED of QUERY_TOO_COMPLEX in plaats van generieke 500-fouten, en testen dat complexiteitsberekeningen correct rekening houden met veldvermenigvuldigers wanneer aliasen worden gebruikt om hetzelfde veld meerdere keren onder verschillende namen in één verzoek aan te vragen. Deze handmatige verificatie zorgt ervoor dat de complexiteitsanalyse van de server de gevraagde velden nauwkeurig telt en verzoeken afwijst die de geconfigureerde drempels overschrijden voordat ze databasebronnen verbruiken.

Bovendien vergeten kandidaten vaak te testen dat blijvende queries (toegestane query-whitelisting) willekeurige handmatige queries in productieomgevingen afwijzen, wat cruciaal is voor het voorkomen van aanvallen die de hulpbronnen uitputten. Je kunt dit verifiëren door te proberen ad-hoc queries uit te voeren via Postman die afwijken van de blijvende query-hash, en ervoor te zorgen dat de server een PersistedQueryNotFound-fout of gelijkwaardig retourneert in plaats van de query uit te voeren. Deze beveiligingsgrens voorkomt dat aanvallers middelen-intensieve queries kunnen opstellen die de systeemprestaties voor legitieme gebruikers kunnen verslechteren.

Wat is de systematische aanpak voor het testen van GraphQL schema stitching of federatie wanneer meerdere microservices velden aan hetzelfde entiteitstype bijdragen, met name met betrekking tot foutpropagatie wanneer één service is verstoord?

In Apollo Federation of schema stitching-architecturen testen beginners vaak elke service in isolatie en missen ze het testen van gedeeltelijke storingen waarbij het User type velden kan combineren van de Authentication Service (kritisch) en de Preferences Service (niet-kritisch). Je moet opzettelijk storingen in downstream-services activeren met behulp van Chaos Monkey-technieken of door specifieke eindpunten te blokkeren met Charles Proxy, en vervolgens verifiëren dat de Gateway gedeeltelijke gegevens retourneert met null-velden en specifieke foutpaden in de errors array, in plaats van de hele query te laten falen en een volledige pagina-fout te veroorzaken. Deze aanpak valideert de veerkracht van de federatielaag en zorgt ervoor dat kritieke gebruikersreizen functioneel blijven, zelfs wanneer niet-essentiële services storingen ondervinden.

De belangrijkste inzicht is het valideren dat de @defer-directive en @stream-directives correct omgaan met langzaam oplosbare velden zonder de hele UI te blokkeren, en dat de client handzame foutmetadata ontvangt om alternatieve inhoud weer te geven voor specifieke componenten terwijl beschikbare gegevens van gezonde services worden weergegeven. Testers moeten verifiëren dat het extensions-gedeelte van de GraphQL-response nauwkeurige service-traceringinformatie bevat die aangeeft welke specifieke microservice is mislukte, waardoor de frontend intelligente beslissingen kan nemen over wat inhoud te verbergen of weer te geven in een verstoorde staat. Juiste foutpropagatietests zorgen ervoor dat gebruikers nog steeds kerntransacties kunnen voltooien, zelfs wanneer aanvullende functies zoals aanbevelingen of analytics tijdelijk niet beschikbaar zijn.

Hoe onderscheid je tussen bedoelde GraphQL nullabiliteit (velden die legitiem null kunnen zijn) en werkelijke defecten bij het testen van applicaties die gebruikmaken van codegeneratietools zoals Apollo Codegen of GraphQL Codegen?

Kandidaten hebben vaak moeite met gegenereerde TypeScript of Swift types die velden als optioneel (nullabel) markeren wanneer de bedrijfslogica daadwerkelijk vereist dat ze aanwezig zijn, wat leidt tot verwarring over of een null-waarde een bug of een geldig lege staat vertegenwoordigt. Je moet de uitroeptekens (!) van het schema versus de gegenereerde clienttypes onderzoeken, randvoorwaarden testen door handmatig JSON-antwoorden in Charles Proxy te manipuleren om null-waarden in niet-nullabele schema-velden in te voegen om te verifiëren dat de server gegevens correct valideert voordat deze antwoorden naar de client verzendt. Deze onderscheid is cruciaal omdat een null in een niet-nullabel schema-veld een defect aan de serverzijde aangeeft, terwijl een null in een nullabel veld misschien een legitieme afwezigheid van gegevens vertegenwoordigt.

Bovendien moet je verifiëren dat de clientapplicatie schema-gedreven nullabiliteit correct afhandelt door te controleren dat de TypeScript strikte moduscompilatie slaagt wanneer er toegang wordt verkregen tot mogelijk null-velden, en ervoor zorgen dat de gegenereerde types daadwerkelijk beschermen tegen runtime nullpointer-excepties in plaats van alleen oppervlakkig aan het schema te voldoen. Dit vereist begrip dat GraphQL niet-nullabele velden nooit null vanuit de server mogen retourneren, terwijl nullabele velden altijd moeten worden afgehandeld met optionele chaining of null-controles in de clientcode, ongeacht de aannames van de bedrijfslogica over gegevens die altijd aanwezig moeten zijn. Ontwikkelaars vergeten vaak deze defensieve controles toe te voegen wanneer de bedrijfslogica suggereert dat gegevens altijd moeten bestaan, dus rigoureus handmatig testen van null-injectie helpt potentiële crashes op te vangen voordat ze de productiegebruikers bereiken.