Enhed 10 / 11

Falsk-tillidsrisiko, testkvalitet og mutationstest: Test af test

Gevinster:

  • Evne til at genkende de tre sider af pseudo-tillid (ikke-hævdende, selvhævdende, triviel påstand) og anvende modgift
  • Evne til at bruge mutationstest og mutationsscore som et mere præcist mål for kvalitet end procentvis dækning med værktøj eller hånd
  • Evne til at positionere AI som et rødt hold mod test og jage efter testsmuthuller uden at falde i rosfælden

Kernen i dette modul er en tilbagevendende advarsel: Et grønt lysende testpanel er ikke bevis på kvalitet. Hvis dine tests giver dig selvtillid, skal du vide, om denne tillid er ægte eller falsk. I en tidsalder med kunstig intelligens (AI) er dette spørgsmål mere kritisk end nogensinde, fordi AI er dygtig til at producere flydende, glatte, men hule tests. Falsk tillid — at tro, at softwaren er korrekt, fordi testene er grønne, mens testene faktisk ikke bekræfter noget — er det farligste, der kan ske for et QA-hold; fordi det ikke skjuler, at der ikke er fejl, men at du ikke kan se fejlene. Denne enhed samler valideringsfilosofien for hele modulet i én disciplin: at teste dine tests.

Guldstandarden for måling af kvaliteten af ​​test: mutationstest

Den mest kraftfulde måde at forstå, om en test faktisk beskytter eller ej, er mutationstest (mutationstest - en teknik, der producerer bevidste små forvrængninger/mutationer i kildekoden og måler, om testene detekterer disse forvrængninger). Logikken er enkel: Hvis du bevidst bryder koden (gør et + til -, et > til >=, et sandt til falsk), bør en god testpakke fange den korruption og blive rød. Hvis den ikke gør det, er den forstyrrelse en overlevet mutant - så dine tests bevarer faktisk ikke den adfærd.

Mutationsscore = mutation dræbt / total mutation. En pakke med 90 % linjedækning kan have en mutationsscore på 40 %; Dette indikerer, at linjerne fungerer, men adfærden er ikke verificeret. Mutationsscore er et meget mere ærligt mål for kvalitet end procentvis dækning.

Tip: Der er automatiske mutationsværktøjer (PIT/Pitest til Java, Stryker til JavaScript/TypeScript, Stryker.NET til .NET, mutmut til Python). Disse genererer og tester automatisk hundredvis af mutationer. Hvis du ikke har et værktøj, er selv den manuelle "brud koden test" metode uvurderlig for kritiske funktioner.

Pseudo-tillidens tre ansigter og dens modgift

Pseudo-tillid form

symptom

modgift

Test uden påstand

Koden virker, intet er valideret

Sand påstand i hver test; test med mutation

selvbekræftende test

Forventet = output af kode

Beregn forventet værdi uafhængigt

Triviel påstand

"ikke null", "200 returneret"

Valider forretningsregel/faktisk resultat

Fejlslutning i høj omfang

90% linjer, lav beskyttelse

Se på mutationsresultatet

Skrøbelig testtolerance

"Sidder fast igen, bestå"

Grundårsag + deterministisk test

Brug af AI som et "rødt hold"

AI kan både generere pseudo-tillid og være en stærk allieret i at jage den ned. Brug AI som et rødt hold mod dine egne tests: spørg "skriv kode, der består disse test, men er forkert" eller "find en undergravning, der vil narre disse test." Hvis AI finder smuthuller i dine tests, er disse smuthuller reelle risici.

Forsigtig: Spørg ikke AI "Er min testkvalitet god?" og tag svaret "ja, fantastisk" som sikkerhed. AI plejer at være venlig. Udfordr i stedet AI til en konkret opgave: "frembring en fejl, der består disse tests." Hvis det kan producere det, er dine test blinde for den fejl.

Tilsvarende mutationer og grænser for scoren

Mutationstest er kraftfuldt, men det har en fangst: nogle mutationer ændrer slet ikke kodens adfærd. Disse kaldes ækvivalente mutationer (ækvivalent mutant - korrupt kode, mutation, der giver nøjagtig det samme resultat som originalen). For eksempel, at ændre startværdien af ​​en variabel, der aldrig bruges, påvirker ikke outputtet; Ingen test kan og bør ikke fange dette. Derfor er en 100 % mutationsscore ofte uopnåelig i praksis og er ikke målet. At luge tilsvarende mutationer ud i hånden er arbejdskrævende; Så læs ikke mutationsresultatet som en absolut eksamensscore, men som en ærlig indikator for "beskytter mine tests virkelig?"

Den praktiske tilgang er denne: I stedet for konstant at køre mutationstest på tværs af hele kodebasen, så kør den på de moduler, der indeholder den højeste risiko og mest komplekse forretningsregler. Undersøg de overlevende mutationer i disse moduler én efter én; Hvis det er et rigtigt hul, så tilføj en test; hvis det er en tilsvarende mutation, marker den med begrundelse og bestå. AI kan udføre indledende screening for at vurdere, om en overlevende mutation er ækvivalent; men den endelige beslutning træffes af dig, der ved, hvad koden gør.

Forsigtig: Mutationstest er beregningsmæssigt dyrt (alle relevante test køres igen for hver mutation). Så en almindelig og rimelig strategi er at planlægge det som en ugentlig eller pre-release dyb kontrol for kritiske moduler, snarere end hver fusion.

Svag prompt / Stærk prompt

Svag: "Er mine prøver tilstrækkelige?"
Stærk: "Aktivér som et rødt team for denne funktion og testsuite. (1) Generer 8 mutationer i koden, der kan dræbes (operatorsubstitution, grænseskift, betingelsesomvending, returværdisubstitution). (2) Angiv for hver mutation, hvilken af de eksisterende tests, der vil fange den, og hvilke der IKKE vil. (3) For hver mutation, der overlever, skal du skrive en ny test, der kan bestå alle disse, hvis du kan bestå en kode. tester, men overtræder forretningsreglen Kode+test: [indsæt]"

Kraftig prompt; Det positionerer AI som en test-breaking eksaminator, ikke en ros maskine.

Fire kopierbare skabeloner

1) Manuel mutationskontrol:

Generer 8 signifikante mutationer (mindre bevidste forstyrrelser) for denne kode: aritmetisk operatorsubstitution, sammenligningsgrænse (> vs >=), logisk inversion, returnering/konstant substitution, betingelsesspring. For hver mutation skal du forudsige, hvilken af ​​de tilgængelige test der vil fange den eller ej. Kode+test: [indsæt]

2) Dræber den overlevende mutation:

Følgende mutationstestrapport indeholder overlevende (ufangede) mutationer: [liste/rapport]. For hver skal du skrive en minimal test, der vil dræbe den mutation (koden bliver rød, når den brydes på den måde). Kommenter hvilken adfærd testen bekræfter.

3) Rødt hold - blodprøven:

Kan du skrive kode, der BESTÅR ALLE følgende test, men overtræder følgende forretningsregel: [forretningsregel]. Hvis ja, hvilket smuthul i disse test tillader dette? Tilføj testen, der lukker det smuthul. Tests: [indsæt]

4) Test kvalitetsinspektion:

Tjek denne testpakke for kvalitet. Sæt kryds for hver test:- Er der en sand påstand eller er det rekvisitter?- Er den forventede værdi uafhængig, afledt af kode?- Verificerer den forretningsreglen eller noget trivielt? Giv endelig en estimeret "true assert score" og de 3 svageste tests. Tests: [indsæt]

tre minisager

Tilfælde 1 — Dækning 92 %, mutationsscore 38 %. Et hold stolede på høj dækning. Når mutationstest blev kørt med Stryker, var scoren 38 %: de fleste af de producerede mutationer overlevede. Dette var et bevis på, at testene ikke kørte linjerne og verificerede adfærden. Holdet investerede tre uger i at teste kvalitet; Mutationsscoren steg til 81 %, og to reelle regnefejl blev fanget af disse forstærkede tests i den næste udgivelse.

Case 2 - AI narrede testen. Med en "rødt team"-skabelon bad en ekspert AI om kode, der bestod eksisterende test, men overtrådte rabatreglen. AI'en skrev en kode, der altid returnerede en rabat på nul - og alle test forblev grønne, fordi ingen test bekræftede den faktiske rabatværdi. Gab set, reelle hævder tilføjet.

Case 3 - Rosfælden. En junior tester spurgte AI: "Er mine tests gode?" og var lettet over at høre svaret: "Meget omfattende." Hans seniorkollega fik de samme tests revideret ved hjælp af skabelonen "testkvalitetsaudit"; Det viste sig, at 12 ud af 20 tests var indretning (uden påstand eller skrammel). Det rigtige spørgsmål gav det rigtige svar.

Almindelige fejl

  • At tage fejl af muligheden for kvalitet. Stoler på høj rækkedækning og ser slet ikke på mutationsscoren.
  • Stoler på AI's ros. Spørger "Er dine prøver gode?" og betragter det positive svar som sikkerhed.
  • Udledning af den forventede værdi fra kode. Selvbekræftende test, der bekræfter fejlkode.
  • Vær tilfreds med trivielle påstande. Kontrol, der ikke validerer den faktiske regel, såsom "ikke null", "200 returneret".
  • Ignorerer overlevende mutationer. Ignorerer det, der ikke var fanget i mutationsrapporten.
  • Ikke engang forsøger at manuelt mutere kritisk kode. Spring over trinnet "knæk koden og test", hvis værktøjet ikke er tilgængeligt.

Sammenfattende

Pseudo-trust tror på, at software er korrekt, fordi testene er grønne; hvorimod testene muligvis ikke bekræfter noget. Guldstandarden for måling af dette er mutationstest: bevidst bryde koden og måle, om testene fanger den. Mutationsscore er et meget mere ærligt mål for kvalitet end procentvis dækning. AI både producerer pseudo-tillid og bliver et stærkt rødt hold i at jage det - spørg "frembring en fejl, der består disse tests." Test dine tests: ægte påstand, uafhængig forventet værdi, validering af forretningsregler og dræbte mutationer.

Ansøgningsopgave

Importer en funktion, der indeholder en forretningsregel og dens tests fra dit eget projekt. Kør om muligt et mutationsværktøj (Stryker/Pitest/mutmut) og mål mutationsresultatet; Hvis der ikke er noget værktøj, skal du generere mindst 8 mutationer med skabelonen "manuel mutationskontrol" og prøve dem manuelt. For hver overlevende mutation skal du skrive en ny test med skabelonen "dræb overlevende mutation". Til sidst, med det "røde hold"-mønster, se, om AI kan producere kode, der narrer dine tests. Rapporter din start- og slutmutationsscore (eller fanget/samlet mutationshastighed).

tjekliste

  • [ ] Jeg vurderede testkvalitet ved mutationsscore, ikke dækning.
  • [ ] Jeg kørte mutationstest (enten med værktøj eller manuelt) for kritisk kode.
  • [ ] Jeg skrev nye tests for hver overlevende mutation.
  • [ ] Jeg brugte AI som det røde hold og søgte efter smuthuller i mine tests.
  • [ ] Jeg tog ikke AI's "dine tests er gode"-ros som en tryghed.
  • [ ] Jeg kontrollerede, at hver test verificerer den faktiske påstand, uafhængig forventet værdi og forretningsregel.