Jednotka 10 / 11

Riziko falošnej dôvery, kvalita testov a testovanie mutácií: testovacie testy

zisky:

  • Schopnosť rozpoznať tri tváre pseudodôvery (neasertívna, sebapresadzujúca sa, triviálne tvrdenie) a aplikovať protijedy
  • Schopnosť používať testovanie mutácií a skóre mutácií ako presnejšie meradlo kvality ako percentuálne pokrytie nástrojom alebo rukou
  • Schopnosť postaviť AI ako červený tím proti testovaniu a hľadať medzery v testovaní bez toho, aby ste sa dostali do pasce chvály

Srdcom tohto modulu je opakujúce sa varovanie: zelený svietiaci testovací panel nie je dôkazom kvality. Ak vám vaše testy dajú dôveru, musíte vedieť, či je táto dôvera skutočná alebo falošná. Vo veku umelej inteligencie (AI) je táto otázka kritickejšia ako kedykoľvek predtým, pretože AI je zbehlá vo vytváraní tekutých, hladko vyzerajúcich, ale dutých testov. Falošná dôvera – veriť, že softvér je správny, pretože testy sú zelené, hoci testy v skutočnosti nič neoverujú – je najnebezpečnejšia vec, ktorá sa môže tímu QA stať; pretože skrýva nie to, že neexistujú žiadne chyby, ale to, že chyby nevidíte. Táto jednotka spája filozofiu validácie celého modulu do jednej disciplíny: testovanie vašich testov.

Zlatý štandard na meranie kvality testovania: testovanie mutácií

Najsilnejším spôsobom, ako pochopiť, či test skutočne chráni alebo nie, je testovanie mutácií (testovanie mutácií – technika, ktorá vytvára zámerné malé skreslenia/mutácie v zdrojovom kóde a meria, či testy tieto skreslenia detegujú). Logika je jednoduchá: ak úmyselne rozbijete kód (z + urobíte -, > z >=, z true na nepravdu), dobrý testovací balík by mal zachytiť toto poškodenie a sfarbiť sa na červeno. Ak nie, toto narušenie je prežitý mutant – takže vaše testy v skutočnosti toto správanie nezachovávajú.

Skóre mutácie = zabitá mutácia / celková mutácia. Balík s 90 % pokrytím linky môže mať skóre mutácie 40 %; To znamená, že linky fungujú, ale správanie nie je overené. Mutačné skóre je oveľa poctivejším meradlom kvality ako percentuálne pokrytie.

Tip: Existujú nástroje na automatické mutácie (PIT/Pitest pre Javu, Stryker pre JavaScript/TypeScript, Stryker.NET pre .NET, mutmut pre Python). Tieto automaticky generujú a testujú stovky mutácií. Ak nemáte nástroj, dokonca aj manuálna metóda „prelomiť test kódu“ je pre kritické funkcie neoceniteľná.

Tri tváre pseudodôvery a jej protijed

Forma pseudodôvery

symptóm

protijed

Test bez tvrdenia

Kód funguje, nič nie je overené

Pravdivé tvrdenie v každom teste; test s mutáciou

sebapotvrdzujúci test

Očakávané = výstup kódu

Nezávisle vypočítajte očakávanú hodnotu

Triviálne tvrdenie

"nie je null", "200 vrátených"

Overiť obchodné pravidlo/skutočný výsledok

Chyba veľkého rozsahu

90% liniek, nízka ochrana

Pozrite sa na skóre mutácií

Krehká tolerancia testu

"Znova zaseknutý, prejsť"

Hlavná príčina + deterministické testovanie

Používanie AI ako „červeného tímu“

Umelá inteligencia môže vytvárať pseudodôveru a zároveň byť silným spojencom pri jej hľadaní. Použite AI ako červený tím proti svojim vlastným testom: opýtajte sa „napíšte kód, ktorý prejde týmito testami, ale je nesprávny“ alebo „nájdite podvrh, ktorý tieto testy oklame“. Ak AI nájde medzery vo vašich testoch, tieto medzery sú skutočnými rizikami.

Upozornenie: Nepýtajte sa AI ​​"Je kvalita môjho testu dobrá?" a odpoveď „áno, skvelé“ berte ako istotu. AI má tendenciu byť láskavá. Namiesto toho vyzvite AI na konkrétnu úlohu: „vyrobte chybu, ktorá prejde týmito testami“. Ak to dokáže vyrobiť, vaše testy sú slepé voči tejto chybe.

Ekvivalentné mutácie a limity skóre

Testovanie mutácií je silné, ale má to háčik: niektoré mutácie vôbec nemenia správanie kódu. Nazývajú sa ekvivalentné mutácie (ekvivalentný mutant — poškodený kód, mutácia, ktorá dáva presne rovnaký výsledok ako originál). Napríklad zmena počiatočnej hodnoty premennej, ktorá sa nikdy nepoužije, neovplyvní výstup; Žiadny test to nemôže a nemal by zachytiť. Preto je 100% skóre mutácie v praxi často nedosiahnuteľné a nie je cieľom. Ručné odstraňovanie ekvivalentných mutácií je náročné na prácu; Nečítajte teda skóre mutácií ako absolútny výsledok skúšky, ale ako úprimný indikátor „naozaj moje testy chránia?“.

Praktický prístup je takýto: namiesto neustáleho testovania mutácií v celej kódovej základni ho spúšťajte na moduloch, ktoré obsahujú najvyššie riziko a najkomplexnejšie obchodné pravidlá. Preskúmajte prežívajúce mutácie v týchto moduloch jednu po druhej; Ak ide o skutočnú medzeru, pridajte test; ak ide o ekvivalentnú mutáciu, označte ju odôvodnením a vyhovie. AI môže vykonať počiatočný skríning pri hodnotení, či je prežívajúca mutácia ekvivalentná; ale konečné rozhodnutie urobíte vy, ktorí viete, čo kód robí.

Upozornenie: Testovanie mutácií je výpočtovo nákladné (všetky relevantné testy sa opakujú pre každú mutáciu). Takže bežnou a rozumnou stratégiou je naplánovať to ako týždennú alebo pred vydaním hĺbkovú kontrolu kritických modulov, a nie každé zlúčenie.

Slabá výzva / Silná výzva

Slabý: "Sú moje testy dostatočné?"
Strong: "Správajte sa ako červený tím pre túto funkciu a testovaciu sadu. (1) Vygenerujte 8 mutácií v kóde, ktoré je možné zabiť (náhrada operátora, posun hranice, inverzia podmienky, náhrada návratovej hodnoty). (2) Pre každú mutáciu označte, ktorý z existujúcich testov ju zachytí a ktorý NIE. (3) Pre každú mutáciu, ktorá prežije, napíšte nový test, ktorý ukáže, že všetky tieto testy prebehnú, ale poruší aj Vás. (4) obchodné pravidlo Kód+testy: [prilepiť]“.

Výkonná výzva; Stavia AI ako skúšajúceho, ktorý prelomuje testy, nie ako stroj na chválu.

Štyri kopírovateľné šablóny

1) Manuálna kontrola mutácií:

Vygenerujte 8 významných mutácií (menších úmyselných prerušení) pre tento kód: substitúcia aritmetickým operátorom, limit porovnania (> vs >=), logická inverzia, návrat/konštantná substitúcia, preskočenie podmienky. Pre každú mutáciu predpovedajte, ktorý z dostupných testov ju zachytí alebo nie. Kód+testy: [prilepiť]

2) Zabitie prežívajúcej mutácie:

Nasledujúca správa o teste mutácií obsahuje prežívajúce (nezachytené) mutácie: [zoznam/správa]. Pre každý napíšte minimálny test, ktorý túto mutáciu zabije (kód sa zmení na červený, keď sa zlomí týmto spôsobom). Komentujte, aké správanie test potvrdzuje.

3) Červený tím – krvný test:

Môžete napísať kód, ktorý VYHOVUJE VŠETKÝM z nasledujúcich testov, ale porušuje nasledujúce obchodné pravidlo: [obchodné pravidlo]. Ak áno, aká medzera v týchto testoch to umožňuje? Pridajte test, ktorý túto medzeru uzavrie. Testy: [prilepiť]

4) Kontrola kvality testu:

Skontrolujte kvalitu tohto testovacieho balíka. Zaškrtnite pri každom teste:- Existuje pravdivé tvrdenie alebo ide o rekvizity?- Je očakávaná hodnota nezávislá, odvodená od kódu?- Overuje obchodné pravidlo alebo niečo triviálne? Nakoniec uveďte odhadované „skutočné skóre tvrdenia“ a 3 najslabšie testy. Testy: [prilepiť]

tri mini prípady

Prípad 1 — Pokrytie 92 %, skóre mutácie 38 %. Jeden tím sa spoliehal na vysoké pokrytie. Keď sa testovanie mutácií uskutočnilo so Strykerom, skóre bolo 38 %: väčšina vytvorených mutácií prežila. To bol dôkaz, že testy nespúšťali linky a neoverovali správanie. Tím investoval tri týždne do testovania kvality; Skóre mutácie sa zvýšilo na 81 % a tieto vylepšené testy v ďalšom vydaní zachytili dve skutočné chyby vo výpočtoch.

Prípad 2 – AI oklamala test. Pomocou šablóny „červeného tímu“ expert požiadal AI o kód, ktorý prešiel existujúcimi testami, ale porušil pravidlo zľavy. AI ​​napísala kód, ktorý vždy vrátil zľavu nula – a všetky testy zostali zelené, pretože žiadne testy neoverovali skutočnú hodnotu zľavy. Viditeľná medzera, pridané skutočné tvrdenia.

Prípad 3 – Pasca chvály. Mladý tester sa spýtal AI: "Sú moje testy dobré?" a uľavilo sa mu, keď som počul odpoveď: "Veľmi obsiahle." Jeho starší kolega nechal preveriť rovnaké testy pomocou šablóny „audit kvality testu“; Ukázalo sa, že 12 z 20 testov bolo dekoračných (bez tvrdenia alebo odpadu). Správna otázka priniesla správnu odpoveď.

Časté chyby

  • Chybný priestor pre kvalitu. Spoliehať sa na vysoké pokrytie riadkov a vôbec sa nepozerať na skóre mutácie.
  • Dôverovať chvále AI. Otázka "Sú vaše testy dobré?" a považovať kladnú odpoveď za uistenie.
  • Odvodenie očakávanej hodnoty z kódu. Samooverovacie testy, ktoré potvrdzujú chybný kód.
  • Uspokojte sa s triviálnymi tvrdeniami. Kontroly, ktoré neoverujú skutočné pravidlo, ako napríklad "nie je null", "200 vrátených".
  • Ignorovanie prežívajúcich mutácií. Ignorovanie toho, čo nebolo zachytené v správe o mutácii.
  • Dokonca sa ani nepokúšajte manuálne mutovať kritický kód. Ak nástroj nie je k dispozícii, preskočte krok „prelomiť kód a otestovať“.

V súhrne

Pseudodôvera je viera, že softvér je správny, pretože testy sú zelené; pričom testy nemusia nič potvrdiť. Zlatým štandardom na meranie tohto je testovanie mutácií: zámerné prelomenie kódu a meranie, či ho testy zachytia. Mutačné skóre je oveľa poctivejším meradlom kvality ako percentuálne pokrytie. Umelá inteligencia vytvára pseudodôveru a zároveň sa stáva silným červeným tímom, ktorý ju hľadá – opýtajte sa „vyrobte chybu, ktorá prejde týmito testami“. Otestujte svoje testy: pravdivé tvrdenie, nezávislá očakávaná hodnota, overenie obchodných pravidiel a zabité mutácie.

Aplikačná úloha

Importujte funkciu obsahujúcu obchodné pravidlo a jeho testy z vášho vlastného projektu. Ak je to možné, spustite mutačný nástroj (Stryker/Pitest/mutmut) a zmerajte skóre mutácie; Ak nie je k dispozícii žiadny nástroj, vygenerujte aspoň 8 mutácií pomocou šablóny „manuálna kontrola mutácií“ a vyskúšajte ich manuálne. Pre každú prežívajúcu mutáciu napíšte nový test so šablónou „zabiť prežívajúcu mutáciu“. Nakoniec pomocou vzoru „červeného tímu“ zistite, či AI dokáže vytvoriť kód, ktorý oklame vaše testy. Nahláste svoje počiatočné a konečné skóre mutácie (alebo zachytenú/celkovú mieru mutácií).

kontrolný zoznam

  • [ ] Kvalitu testu som hodnotil podľa skóre mutácie, nie pokrytia.
  • [ ] Spustil som testovanie mutácií (buď pomocou nástroja alebo manuálne) pre kritický kód.
  • [ ] Napísal som nové testy pre každú prežívajúcu mutáciu.
  • [ ] Použil som AI ako červený tím a hľadal som medzery v testoch.
  • [ ] Chválu AI „vaše testy sú dobré“ som nebral ako uistenie.
  • [ ] Skontroloval som, či každý test overuje skutočné tvrdenie, nezávislú očakávanú hodnotu a obchodné pravidlo.