Eenheid 6 / 12

Testautomatisering en kwaliteitsborging

Winst:

  • Mogelijkheid om unit-, integratie- en edge case-tests te produceren met zinvolle beweringen met AI
  • Mogelijkheid om systematisch testdekking, grenswaarden en negatieve scenario's te extraheren met AI-ondersteuning
  • Mogelijkheid om te verifiëren dat de door de AI geproduceerde tests daadwerkelijk gedrag verifiëren en niet alleen maar bestaande code herhalen

Testen is het mechanisme dat bewijst dat de software zich daadwerkelijk gedraagt zoals beloofd. Een goede testsuite vertelt je binnen enkele seconden of een verandering iets kapot maakt en geeft de engineer de vrijheid om met vertrouwen te handelen. AI versnelt het meest vervelende en meest overgeslagen deel van het schrijven van tests: het genereren van een groot aantal scenario's, breekpunten en negatieve gevallen. Maar er schuilt hier een listige valstrik: AI kan tests schrijven die het huidige (misschien gebrekkige) gedrag van de code verifiëren, en niet het veronderstelde gedrag; of het kan lege tests opleveren die altijd slagen, zonder daadwerkelijk iets te controleren. De waarde van een test zit hem niet in de vraag of hij slaagt, maar in de vraag of hij controleert of het goed is en rood wordt als hij fout is.

In deze unit leer je hoe je unit-, integratie- en edge case-tests kunt maken met betekenisvolle beweringen; hoe je systematisch testdekking, breekpunten en neerwaartse scenario's kunt extraheren; en we zullen zien hoe je kunt controleren of de tests die de AI produceert, daadwerkelijk gedrag valideren.

Concepten: Unit testen: Test een enkele functie/klasse afzonderlijk. Integratietesten: Testen of meerdere onderdelen correct samenwerken. Assert: Een verklaring die controleert of een resultaat gelijk is aan wat werd verwacht; Dit is het hart van de proef. Dekking: hoeveel van de code wordt uitgevoerd door tests; Een hoge dekking garandeert geen kwaliteit.

Betekenisvolle tests produceren

Een goede test doet duidelijk drie dingen: hij vestigt een toestand, hij voert een actie uit, hij bevestigt het resultaat. Wanneer u tests afdrukt naar de AI, specificeer dan welk gedrag u wilt verifiëren en welke scenario's dit moet omvatten; Anders levert het oppervlakkige tests op die altijd slagen.

  1. Definieer het te testen gedrag. “Wat telt als juist?” Beantwoord de vraag duidelijk.
  2. Vraag naar scenariotypes. Normaal, limiet, negatief, fouttoestand.
  3. Importeer betekenisvolle beweringen. Het gaf niet alleen "een fout", het "retourneerde de juiste waarde".
  4. Controleer de nauwkeurigheid van de test. Wordt de test rood als je de code bewust overtreedt?

Uitgebreide prompt voor het genereren van tests: "Schrijf eenheidstests voor de volgende functie 'applydiscount(amount, coupon)'. Zorg voor TEN MINSTE één scenario in de volgende categorieën: (1) normale geldige coupon, (2) breekpunten (0 bedrag, 100% korting), (3) negatief (ongeldige coupon, negatief bedrag), (4) foutgeval (null coupon). Beweer de CONCRETE verwachte waarde in elke test (niet alleen 'gewerkt'). Geef de tests een leesbare naam. Code: [code]"

Vraag om grenswaarde te extraheren: "Voer een grenswaarde-analyse uit voor de invoer van deze functie. Extraheer voor elke parameter de waarden 'net op de grens', 'net onder de grens', 'net boven de grens' als een tabel. Maak vervolgens een lijst van de testscenario's die deze grenzen bestrijken. Schrijf nog geen code, alleen een analyse en een scenariolijst. Functie: [handtekening]"

Let op: Een hoge testdekking (bijvoorbeeld 90%) bewijst niet dat de code correct is. De dekking meet hoeveel rijen er zijn uitgevoerd; niet dat die lijnen het juiste resultaat opleveren. Een test zonder betekenisvolle bewering vergroot de dekking, maar garandeert niets. De inhoud van de bewering bepaalt de kwaliteit, niet het aantal beweringen.

De test zelf testen: de logica van mutatie

De meest praktische manier om te begrijpen of de door AI gegenereerde test echt werkt, is door de code opzettelijk te breken (logica voor het testen van mutaties). Draai een voorwaarde om, maak een + teken -; Als er geen enkele test rood wordt, houden uw tests dat gedrag niet daadwerkelijk in stand.

Test op zoek naar kwetsbaarheden: "Vertel me welke potentiële bugs in deze code de volgende tests NIET MAG vangen. Stel vijf kleine mutaties voor die in de code kunnen worden aangebracht (bijvoorbeeld >= in plaats van >, - in plaats van +) en geef voor elk aan of bestaande tests deze zouden kunnen onderscheppen. Voor degenen die niet worden ontdekt, stel voor dat er tests worden toegevoegd. Code: [code] Tests: [test]"

Zwakke prompt/sterke prompt

ZWAK: "Schrijf een test naar deze functie." (Resultaat: meestal één gelukkig scenario, zwakke bewering; mist fouten.) STERK: "Schrijf een test naar deze 'passwordStrong'-functie. Regel: minimaal 8 tekens, 1 hoofdletter, 1 cijfer vereist. Behandel de volgende scenario's als AFZONDERLIJKE tests: precies 8 tekens (limiet), 7 tekens (onder limiet), geen hoofdletters, geen cijfers, lege tekenreeks, alleen spaties, te lang (1000 tekens) Beweer expliciet de verwachte waar/onwaar-waarde in elke test en geef de test een naam op basis van wat hij controleert."

Krachtige prompt geeft regels en volledige grensscenario's. Grensparen zoals "precies 8/7 tekens" zijn de meest voorkomende plaatsen waar fouten worden gemaakt (waarbij > met >= wordt verward). Een zwakke prompt omzeilt deze grenzen en brengt de fout over naar de productie.

Testtypen en waar te gebruiken

Testtype

Wat bevestigt het?

AI-bijdrage

Aandacht

eenheid

Enkele functie/klasse

Genereert snel meerdere scenario's

Een zinvolle bewering is vereist

integratie

Onderdelen die samenwerken

Scenario en proefgegevensconcept

Echt verslavend gedrag

beëindigen/accepteren

Volledige gebruikersstroom

Stappenlijst en verwachting

vatbaar voor broosheid

regressie

Oude fout komt niet terug

Foutspecifieke tests

Moet aan elke oplossing worden toegevoegd

Mini-hoesjes

Geval 1 – De test die altijd slaagt. AI schrijft 12 tests naar een functie en ze slagen allemaal. De ingenieur wordt achterdochtig en vervormt opzettelijk de geretourneerde waarde van de functie; Slechts 3 van de tests worden rood. De andere 9 tests bevatten geen zinvolle beweringen. Het testen wordt versterkt door het jagen op mutaties; echte bescherming wordt verkregen in 9 scenario’s.

Geval 2 — Grensfout. Een leeftijdsverificatiefunctie zou moeten zeggen "18 jaar en ouder is geldig", maar er staat >18, wat betekent dat leeftijd 18 wordt afgewezen. De fout komt meteen naar voren tijdens het testen, omdat de AI via breekpuntanalyse het ‘exact 18’-scenario genereert. Eén enkele limiettest voorkomt echte gebruikersklachten.

Geval 3 — Huidig ​​gedrag corrigeren. Wanneer de AI te horen krijgt dat hij "een test moet schrijven op basis van deze code", produceert hij een test die een afrondingsfout die al in de code voorkomt als "correct" accepteert. Wanneer de ingenieur de test afdrukt volgens de vereiste (verwachte juiste waarde) en niet de code, wordt de test rood en treedt de echte fout op. Tests moeten worden afgeleid van verwachtingen, niet van code.

Veel voorkomende fouten

  • Zinloze bewering. "Er is geen fout opgetreden" is niet voldoende; De juiste waarde moet worden geverifieerd.
  • Verwarring van reikwijdte met kwaliteit. Een hoge dekking is geen garantie voor nauwkeurige resultaten.
  • De test afdrukken met code. Herstelt de huidige fout naar "true"; Tests moeten voortkomen uit verwachting.
  • Grenswaarden overslaan. > verwarren met >= is de meest voorkomende fout; grensparen moeten worden getest.
  • Niet de test zelf controleren. Een test die niet rood kleurt als je de code breekt, biedt geen bescherming.

Samengevat

Een goed testpakket is de sleutel tot het met vertrouwen doorvoeren van veranderingen. AI genereert snel een groot aantal scenario’s, grenzen en negatieve situaties; Maar als het tests uit code haalt in plaats van uit vereisten, kan het bestaande bugs repareren of zinloze tests schrijven die altijd slagen. Bevestig de concrete verwachte waarde in elke test, neem gebonden paren op en verifieer dat uw tests daadwerkelijk bescherming bieden door opzettelijk de code te breken. De inhoud van de bewering, en niet het aantal scopes, bepaalt de kwaliteit.

Applicatie taak

Selecteer een functie en laat deze tests genereren in vier categorieën (normaal, limiet, negatief, fout) met een uitgebreide prompt voor het genereren van tests; Laat bij elke toets de concrete verwachtingswaarde gelden. Voer vervolgens de prompt voor het zoeken naar kwetsbaarheden uit, stel vijf kleine mutaties in de code voor en voer de tests uit om te controleren welke ze ontdekken. Voeg een nieuwe test toe voor minimaal één mutatie die niet is opgemerkt en laat zien dat deze nu in de rode cijfers staat.

controlelijst

  • [ ] Ik heb de tests afgedrukt op basis van het verwachte/juiste gedrag, niet op basis van de code.
  • [ ] Ik heb normale, limiet-, negatieve en foutscenario's besproken.
  • [ ] Bij elke toets heb ik de concrete verwachtingswaarde gesteld.
  • [ ] Ik heb grensparen getest (net boven-onder / net boven-onder).
  • [ ] Door opzettelijk de code te verbreken, bevestigde ik dat de tests rood kleurden.
  • [ ] Ik heb een nieuwe test toegevoegd voor niet-gedetecteerde mutaties.