zisky:
- Schopnosť zabrániť umelej inteligencii akceptovať chybné správanie ako „správne“ vypočítaním očakávanej hodnoty v jednotkových testoch nezávisle od akceptačného pravidla
- Schopnosť tlačiť rýchle, nezávislé a opakovateľné testy použitím princípov AAA a FIRST a zosmiešňovaním externých závislostí
- Schopnosť testovať testy s mutáciou (prelomenie kódu) a rozpoznať ťažko testovateľný kód ako vôňu dizajnu
Najväčšou a najrýchlejšou vrstvou testovacej pyramídy je testovanie jednotiek – testovanie, ktoré overuje funkciu alebo malý kúsok kódu izolovane od všetkého ostatného. Tisíce testov jednotiek bežia za pár sekúnd a zachytia chybu, kým je kód stále na obrazovke vývojára. Umelá inteligencia (AI) je možno najdokonalejšia pri vytváraní jednotkových testov: keď jej dáte funkciu, AI vytvorí desiatky testov. Ale práve toto pohodlie vedie k najväčšej pasci: AI ľahko vytvára testy, ktoré „svietia na zeleno, ale nič neoverujú“ alebo akceptujú aktuálne (možno chybné) správanie kódu ako „správne“. V tejto lekcii sa naučíte, ako písať skutočne ochranné testy jednotiek s AI a vzťah medzi testovateľným kódom a AI.
Vlastnosti dobrého testu jednotky: PRVÁ
Dobré jednotkové testy sa riadia PRVÝMI princípmi: rýchle, nezávislé (testy by nemali byť na sebe závislé), opakovateľné (opakovateľné – rovnaký výsledok v akomkoľvek prostredí), samopotvrdenie (vymazanie vyhovuje/nevyhovuje), včasné (načas). Pamätajte na tieto princípy, keď necháte AI produkovať testy; konkrétne požiadajte, aby test nezávisel od vonkajšieho sveta (aktuálna databáza, sieť, hodiny), aby bol „nezávislý“ a „opakovateľný“.
AAA vzor a výrazové tvrdenie
Test pevných jednotiek sa riadi štruktúrou AAA: Usporiadať (pripraviť – nastaviť vstupy a závislosti), Act (vykonať – zavolať testovanú funkciu), Assert (overiť – porovnať výsledok s očakávanou hodnotou). Kritickým je tvrdenie. Najčastejšou chybou AI je odvodenie tvrdenia z výstupu testovaného kódu – logika „čokoľvek, čo kód vráti, je pravda“. To robí test bezvýznamným. Správny spôsob je určiť očakávanú hodnotu nezávisle (z akceptačných kritérií ju vypočítať ručne).
Upozornenie: Ak poviete AI „napíš test pre túto funkciu“, AI môže spustiť funkciu a zapísať jej výstup ako „očakávaný“. Tento test prejde, aj keď je funkcia nepravdivá. Namiesto toho povedzte „počítate očakávané výsledky podľa týchto pravidiel, neodvolávajte sa na aktuálny výstup funkcie“.
Výsmechy, útržky a závislosti
Testovanie jednotiek vyžaduje izoláciu. Ak vaša funkcia závisí od databázy alebo API, pri testovaní sú nahradené falošnými objektmi (napodobenina/pahýľ – riadená, falošná náhrada za skutočnú závislosť). Vďaka tomu je test rýchly, nezávislý a reprodukovateľný. AI môže vytvoriť falošnú inštaláciu; Dajte si však pozor na prílišné zosmiešňovanie: ak zosmiešňujete všetko, test overí iba to, „čo klam vracia“, nie skutočnú logiku. Rovnováha: napodobňujte vonkajší svet, vykonajte testovanú skutočnú logiku.
Testovateľnosť a AI
Existuje zaujímavá spätná väzba: kód, ktorý sa ťažko testuje, je často zle navrhnutý kód. Ak má AI problémy s písaním testov funkcie (príliš veľa závislostí, skrytý globálny stav, vedľajšie účinky), je to nepríjemný zápach. Spýtať sa AI „ako by ste refaktorovali tento kód, aby bol testovateľný“ vedie k lepšiemu testovaniu aj lepšiemu kódu.
Parametrizované testy a rozmanitosť údajov
Písanie samostatného testu zakaždým na overenie toho istého pravidla s rôznymi vstupmi je únavné a náročné na údržbu. Parametrizované testovanie – štruktúra, ktorá opakovane spúšťa rovnakú testovaciu logiku na zozname vstupov a očakávaných výsledkov – eliminuje toto opakovanie: jediné testovacie telo je napájané desiatkami vstupných párov. AI je veľmi efektívna pri vytváraní týchto tabuliek očakávaných výsledkov, keď jej dáte svoje pravidlá akceptácie; Najmä systematicky uvádza do tabuliek limitné hodnoty a triedy ekvivalencie.
Ale je tu aj pasca: AI má tendenciu odvodiť očakávané výsledky vo vygenerovanej tabuľke z testovaného kódu. Táto chyba je ešte nebezpečnejšia pri parametrizovanom testovaní, pretože jediná nesprávna logika znehodnotí desiatky riadkov. Preto si vždy nechajte nezávisle vypočítať stĺpec očakávaného výsledku podľa akceptačného pravidla a manuálne overte aspoň niekoľko riadkov. Požiadajte tiež o stĺpec popisu „čo predstavuje každý riadok“; takže keď sa riadok preruší, okamžite uvidíte, ktorý stav je prerušený.
Tip: Zámerne pridajte „riadok pasce“ do tabuľky s parametrami – to znamená, že výsledok vedome preklepte. Ak sa táto čiara pri spustení testu nezmení na červenú, váš test v skutočnosti túto situáciu neoveruje. Toto je rýchla simulovaná kontrola.
Slabá výzva / Silná výzva
Slabé: "Napíšte test jednotky pre túto funkciu."
Silný: Napíšte testy jednotiek [jazyk/rámec] pre funkciu "taxCalculate(suma, sadzba). Pravidlo prijatia: výsledok = suma * sadzba, zaokrúhlená na 2 desatinné miesta; záporná suma alebo sadzba vyhodí chybu; vráti 0, ak je sadzba 0. Použite štruktúru AAA. Ručne vypočítajte očakávané hodnoty podľa TÝCHTO pravidiel; neodkazujte na aktuálny výstup funkcie a zaokrúhlite na záporné veľké písmená. (0 pokryje veľké čísla). každého testu opísať pravidlo, ktoré overuje Externá závislosť "Nie."
Výkonná výzva; Poskytuje pravidlo prijatia, nezávislé očakávanie očakávanej hodnoty, štruktúru a okrajové prípady. Test sa tak stáva strážcom pravidla, nie zrkadlom kódu.
Tabuľka kvality testovania jednotiek
symptóm
Zlý test (falošná dôvera)
dobrý test
tvrdiť
Žiadne alebo „nie je null“
Očakávaná konkrétna hodnota
Očakávaný zdroj hodnoty
Výstup funkcie
Akceptačné pravidlo / manuálny výpočet
závislosť
Skutočná DB/sieť/hod
Izolované maketou/stub
okrajové puzdro
Len šťastná cesta
limit, zápor, chyba
Keď porušíte kód
zostáva zelená
zmení farbu na červenú
Meno
test1, testMetóda
popisuje pravidlo, ktoré potvrdzuje
Štyri kopírovateľné šablóny
1) Testovanie jednotiek riadených pravidlami:
Vaša rola: senior softvérový testovací inžinier.Napíšte jednotkový test pre nasledujúcu funkciu pomocou [jazyk/rámec]: [podpis]. Pravidlá prijatia: [pravidlá].- Použite štruktúru AAA.- Ručne vypočítajte očakávané hodnoty podľa TÝCHTO pravidiel; NEODKAZUJTE na aktuálny výstup funkcie. - Pokryte limit, negatív, chybu a šťastnú cestu samostatnými testami. - Nech každý názov testu popisuje pravidlo, ktoré overuje. - Zosmiešňovanie vonkajších závislostí; Aby skutočná logika fungovala.
2) Kontrola odolnosti voči mutácii:
Pozrite si tieto testy jednotiek. Uveďte 5 menších úprav, ktoré by som mohol vykonať v testovanom kóde (a - namiesto +, a >= namiesto >, posun hranice) a pri každom mi povedzte, KTORÝ z týchto testov sa zmení na červenú? Ak sa nič nevráti, test je nedostatočný.Kód + testy: [prilepiť]
3) Kontrola testovateľnosti:
Prečo je ťažké napísať unit test pre túto funkciu? Skrytá závislosť, globálny status, vedľajšie účinky, je tam veľa povinností? Navrhnite minimálne refaktorovanie, aby bolo testovateľné; nemeniť správanie. Kód: [prilepiť]
4) Neúplné dokončenie scenára:
Uvádzajú sa nasledujúce funkcie a dostupné testy. Uveďte, ktoré správanie/hraničný prípad nebolo NIKDY testované (medzera rozsahu) a pre každé pridajte test. Funkcia+testy: [prilepiť]
tri mini prípady
Prípad 1 – Test zrkadlenia kódu. Vývojár nechal AI napísať test funkcie zaokrúhľovania; 10 testov bolo zelených. V skutočnosti sa funkcia zaokrúhľovala nesprávnym smerom, ale AI prevzala očakávané hodnoty z výstupu funkcie, takže testy považovali chybu za „pravdivú“. Keď boli očakávané hodnoty manuálne vypočítané pomocou šablóny „riadenej pravidlami“, 4 testy sa zmenili na červenú a odhalila sa skutočná chyba.
Prípad 2 – Hodnota kontroly mutácie. Jeden tím sa spoliehal na 45 jednotkových testov. Vyskúšali sme 20 menších úprav kódu s „kontrolou robustnosti mutácií“; testy zachytili len 11 z nich. Zvyšných 9 prerušení prebehlo v tichosti. Tím posilnil slabé testy; Tieto vylepšené testy v ďalšom vydaní zachytili skutočnú chybu vo výpočte.
Prípad 3 – Netestovateľnosť je vôňa dizajnu. AI nemohla písať testy pre funkciu objednávania, neustále potrebovala skutočnú databázu. "Testability review" šablóna ukázala, že funkcia embedded databázy prístupu. Keď bola injekcia závislosti odstránená, mohli byť napísané testy a kód sa stal čistejším.
Časté chyby
- Odvodenie očakávanej hodnoty z kódu. AI akceptuje výstup funkcie ako „správny“; test, ktorý potvrdí chybný kód.
- Test bez tvrdenia alebo s triviálnym tvrdením. "Nehodil chybu, prešiel" logika; Nič to nepotvrdzuje.
- Extrémny výsmech. Posmievanie sa všetkému a testovanie len toho, čo podvodník vráti; skutočná logika nie je testovaná.
- Len šťastná cesta. Obchádzanie limitných, negatívnych a chybových stavov.
- Netestovať prelomením kódu. Dôverovať zelenej bez kontroly mutácie.
- Ignorovanie netestovateľnosti. Nerozpoznávanie a opravovanie zlého dizajnu namiesto usilovného testovania.
V súhrne
Jednotkové testy sú najrýchlejšou a najväčšou vrstvou testovacej pyramídy; Zachytí chybu v najlacnejšom momente. AI je veľmi schopná produkovať unit testy, no jej najväčším úskalím je písanie testov, ktoré predpokladajú nesprávne správanie ako „správne“ odvodením očakávanej hodnoty zo samotného kódu. Riešenie: zadajte pravidlá prijatia, nechajte si manuálne vypočítať očakávané hodnoty, presadzujte princípy AAA a FIRST, zosmiešňujte vonkajší svet a spustite skutočnú logiku a otestujte každý test mutáciou (prelomením kódu). Kód, ktorý sa ťažko testuje, je znakom dizajnu, ktorý je potrebné opraviť.
Aplikačná úloha
Vyberte funkciu, ktorá obsahuje obchodné pravidlo z vášho vlastného projektu. Napíšte pravidlá prijatia a nechajte AI napísať testy pomocou šablóny „testovanie jednotiek riadených pravidlami“; Nechajte si manuálne vypočítať očakávané hodnoty. Potom použite „kontrolu robustnosti mutácií“: urobte v kóde aspoň 5 malých prestávok a zmerajte, koľko testov sa zmení na červenú. Pridajte nový test na nezachytené korupcie. Nahláste, koľko prerušení bolo zachytených (napríklad skóre mutácií).
kontrolný zoznam
- [ ] Dal som akceptačné pravidlá a nechal som si manuálne vypočítať očakávané hodnoty.
- [ ] Uistil som sa, že testy neodvodzovali očakávanú hodnotu z kódu.
- [ ] Zaviedol som nezávislé testovanie podľa pokynov AAA a FIRST.
- [ ] Zosmiešnil som externé závislosti a spustil skutočnú logiku.
- [ ] Pokryl som limitné, negatívne a chybové prípady.
- [ ] Prelomením kódu (mutáciou) som dokázal, že testy skutočne chránia.