Enhet 6 / 12

Testautomation och kvalitetssäkring

Vinster:

  • Förmåga att producera enhets-, integrations- och kantfallstester med meningsfull påstående med AI
  • Förmåga att systematiskt extrahera testtäckning, gränsvärden och negativa scenarier med AI-stöd
  • Möjlighet att verifiera att testerna som produceras av AI faktiskt verifierar beteende och inte bara upprepar befintlig kod

Testning är den mekanism som bevisar att programvaran faktiskt beter sig som utlovat. En bra testsvit berättar på några sekunder om en förändring bryter något och ger ingenjören friheten att agera med tillförsikt. AI påskyndar den tråkigaste och mest överhoppade delen av testskrivning: genererar en mängd scenarier, brytpunkter och negativa fall. Men det finns en lömsk fälla här: AI kan skriva tester som verifierar kodens nuvarande (kanske felaktiga) beteende, inte dess förmodade beteende; eller så kan den producera tomma tester som alltid godkänns, utan att faktiskt kontrollera någonting. Värdet av ett test ligger inte i om det godkänns, utan i om det kontrollerar rätt sak och blir rött när det är fel.

I den här enheten kommer du att lära dig hur du producerar enhets-, integrations- och kantfallstester med meningsfulla påståenden; hur man systematiskt extraherar testtäckning, brytpunkter och downsidescenarier; och vi ska se hur du kan kontrollera att testerna som AI producerar faktiskt validerar beteende.

Koncept: Enhetstestning: Testar en enskild funktion/klass isolerat. Integrationstestning: Testar att flera delar fungerar korrekt tillsammans. Påstå: Ett påstående som kontrollerar att ett resultat är lika med det förväntade; Detta är kärnan i testet. Täckning: Hur mycket av koden körs av tester; Hög täckning garanterar inte kvalitet.

Att producera meningsfulla tester

Ett bra test gör tre saker tydligt: det etablerar ett tillstånd, det utför en handling, det hävdar resultatet. När du skriver ut tester till AI:n, ange vilket beteende du vill verifiera och vilka scenarier det ska täcka; Annars ger det ytliga tester som alltid blir godkända.

  1. Definiera beteendet som ska testas. "Vad räknas som rätt?" Svara tydligt på frågan.
  2. Fråga efter scenariotyper. Normal, limit, negativ, feltillstånd.
  3. Importera meningsfull påstående. Det "kastade inte bara ett fel", det "returerade rätt värde".
  4. Kontrollera testets noggrannhet. Blir testet rött när du bryter koden medvetet?

Omfattande prompt för testgenerering: "Skriv enhetstester för följande 'applydiscount(amount, coupon)'-funktion. Ha MINST ett scenario i följande kategorier: (1) normal giltig kupong, (2) brytpunkter (0 belopp, 100 % rabatt), (3) negativ (ogiltig kupong, negativt belopp), (4) testa varje kupongvärde (4) testa felet i varje fall. (inte bara 'fungerade'). Namnge testerna läsbara.

Uppmaning för extraktion av gränsvärde: "Utför en gränsvärdesanalys för ingångarna för denna funktion. För varje parameter, extrahera värdena 'just vid gränsen', 'strax under gränsen', 'strax ovanför gränsen' som en tabell. Lista sedan testscenarionerna som täcker dessa gränser. Skriv inte kod ännu, bara analys och scenariolista.]" Funktion: [signaturlista.]"

Varning: Hög testtäckning (t.ex. 90 %) bevisar inte att koden är korrekt. Täckningen mäter hur många rader som kördes; inte att de linjerna ger rätt resultat. Ett test utan meningsfull påstående ökar täckningen men garanterar ingenting. Innehållet i påståendet bestämmer kvaliteten, inte antalet påståenden.

Testa själva testet: mutationens logik

Det mest praktiska sättet att förstå om det AI-genererade testet faktiskt fungerar är att medvetet bryta koden (mutationstestningslogik). Vänd ett villkor, gör ett +-tecken -; Om inga test blir röda, upprätthåller dina tester inte det beteendet.

Sök uppmaning om test sårbarhet: "Berätta för mig vilka potentiella buggar i den här koden följande test KAN INTE fånga. Föreslå 5 små mutationer som kan göras i koden (t.ex. >= istället för >, - istället för +) och ange för var och en om befintliga test skulle fånga det. För de som inte fångas, föreslå ett test som bör läggas till. Kod: [kod]" Tester: [test]

Svag prompt / Stark prompt

SWAG: "Skriv ett test för den här funktionen." (Resultat: vanligtvis ett lyckligt scenario, svagt påstående; missar fel.) STARK: "Skriv ett test till den här "lösenordStrong"-funktionen. Regel: minst 8 tecken, 1 versal, 1 siffra krävs. Täck följande scenarier som SEPARADE tester: exakt 8 tecken (gräns), 7 tecken (under gränsen), inga för stora tecken, inga stora bokstäver, inga stora bokstäver. (1000 tecken) Ange uttryckligen det förväntade sanna/falska värdet i varje test och namnge testet enligt vad det kontrollerar."

Kraftfull uppmaning ger regler och fullständiga gränsscenarier. Gränspar som "exakt 8/7 tecken" är de vanligaste ställena att göra misstag (förvirrande > med >=). Svag prompt går förbi dessa gränser och för med sig felet till produktionen.

Testtyper och var du ska använda

Testtyp

Vad bekräftar det?

AI-bidrag

Uppmärksamhet

enhet

Enkel funktion/klass

Genererar snabbt flera scenarier

Ett meningsfullt påstående krävs

integration

Delar som samverkar

Scenario och låtsasdatautkast

Riktigt beroendeframkallande beteende

avsluta/acceptera

Hela användarflödet

Steglista och förväntningar

benägen för sprödhet

regression

Det gamla felet kommer inte tillbaka

Felspecifik testning

Bör läggas till varje fix

Minifodral

Fall 1 — Testet som alltid blir godkänt. AI skriver 12 tester till en funktion och de klarar alla. Ingenjören blir misstänksam och förvränger medvetet funktionens returvärde; Endast 3 av testerna blir röda. De övriga 9 testerna innehåller inte meningsfulla påståenden. Testning stärks av mutationsjakt; verkligt skydd uppnås i 9 scenarier.

Fall 2 — Gränsfel. En åldersverifieringsfunktion ska säga "18 och äldre är giltig" men >18 skrivs, vilket betyder att 18 år avvisas. Felet dyker upp omedelbart vid testning eftersom AI:n genererar scenariot "exakt 18" genom brytpunktsanalys. Ett enda gränstest förhindrar några riktiga användarklagomål.

Fall 3 — Fixa nuvarande beteende. När AI:n blir tillsagd att "skriva ett test baserat på den här koden", producerar den ett test som accepterar ett avrundningsfel som redan finns i koden som "korrekt". När ingenjören skriver ut testet enligt kravet (förväntat korrekt värde) och inte koden, blir testet rött och det verkliga felet uppstår. Tester bör härledas från förväntan, inte från kod.

Vanliga misstag

  • Meningslöst påstående. "Kastade inget fel" räcker inte; Rätt värde måste verifieras.
  • Förvirrar omfattning med kvalitet. Hög täckning är ingen garanti för korrekta resultat.
  • Skriver ut testet med kod. Fixes the current error to "true"; Tester bör härröra från förväntningar.
  • Hoppa över gränsvärden. Att förväxla > med >= är det vanligaste misstaget; gränspar måste testas.
  • Reviderar inte själva testet. Ett test som inte blir rött när du bryter koden ger inget skydd.

Sammanfattningsvis

En bra testsvit är nyckeln till att göra förändringar med tillförsikt. AI genererar snabbt en mängd scenarier, gränser och negativa situationer; Men om den härleder tester från kod snarare än krav, kan den fixa befintliga buggar eller skriva meningslösa tester som alltid godkänns. Bekräfta det konkreta förväntade värdet i varje test, inkludera bundna par och verifiera att dina test faktiskt skyddar genom att avsiktligt bryta koden. The content of the assert, not the number of scopes, determines quality.

Applikationsuppgift

Välj en funktion och låt den generera tester i fyra kategorier (normal, limit, negativ, fel) med en omfattande prompt för testgenerering; Låt det konkreta förväntade värdet hävdas i varje test. Kör sedan sökprompten för testsårbarhet, föreslå 5 små mutationer i koden och kör testen för att kontrollera vilka de fångar. Lägg till ett nytt test för minst en mutation som inte fångades och visa att den nu är i minus.

checklista

  • [ ] Jag skrev ut testerna baserat på förväntat/korrekt beteende, inte koden.
  • [ ] Jag täckte normala, limit-, negativa och felscenarier.
  • [ ] Jag hävdade det konkreta förväntade värdet i varje test.
  • [ ] Jag testade kantpar (strax över-under / strax ovan-under).
  • [ ] Genom att medvetet bryta koden bekräftade jag att testerna blev röda.
  • [ ] Jag lade till ett nytt test för oupptäckta mutationer.