Norėdami išbandyti sistemą, išskirkite šalutinį poveikį

Šalutinis poveikis yra vienas iš geriausių būdų sukurti išbandomą kodą

Dviejų kovotojų vyrų bokso rungtynių nuotrauka. Jų veidai yra už kadro. Kairėje pusėje esantis naikintuvas išsiuntė kairįjį kabliuką kovotojui dešinėje. Dešinėje pusėje esantis kovotojas vilki raudoną trumpą spalvą su mažu Sovietų Sąjungos simboliu.

„Nock“ yra garsi „JavaScript“ programa, naudinga atliekant tinklo užklausų vykdymą. Tai grąžina statinį testų atsakymą, kad jie galėtų veikti net tada, kai HTTP serverio nėra.

Tačiau tai taip pat yra kvapas.

Dėl duomenų šaltinio ir bandomos sistemos susiejimo išlaidos, kurios gali turėti įtakos kodų atkūrimui ir prižiūrimumui.

Štai kodėl.

Tarkime, kad yra serveris, kuris pateikia įrašų sąrašą, ir funkcija, kuri naudoja atsakymą iš to serverio, kad sukurtų įrašų pavadinimų sąrašą. Funkcijos testas naudoja Nock, kad sustabdytų serverio atsakymą:

Diagrama, rodanti bloką kairėje su antrašte „sukurti įrašų sąrašą“. Viena rodyklė nurodo bloką su antrašte „paskelbia atsakymą“. Kita rodyklė nurodo bloką su antrašte „iškelti“. Blokas su antrašte „atsisiųsti“ turi vieną rodyklę, nukreipiančią bloko su antrašte „HTTP serveris“ kryptimi. Paskutinė rodyklė pertraukiama su etikete „Nocked“.

Kodas yra tinkamai aprėptas. Tačiau yra keletas problemų.

Jei pakeisite atsakymo turinio tipą, turėsite pakeisti testus, net jei kodo elgsena išlieka ta pati:

Tas pats pasakytina ir apie URL, antraščių ar parametrų, kuriuos Nockas stringa, pakeitimus. Jūs turite pakeisti testus, net jei sistemos elgesys išlieka tas pats:

Funkcija „sukurti įrašų sąrašą“ yra bandoma sistema (SUT). HTTP skambučio duomenys yra duomenų šaltinis.

Kodą galite suprojektuoti taip, kad duomenų šaltinyje būtų bendra sąsaja, kurią galima prijungti prie SUT. Tokiu atveju galite naudotis logika, nereikia per daug sąrankos.

Diagrama, kurioje pavaizduotas blokas kairėje su antrašte „įrašų pavadinimų sąrašas“. Viena rodyklė nurodo bloką su antrašte „In-Memory Data Source“. Kita rodyklė nurodo bloką su antrašte „HTTP Server Data“. Šaltinis. “

Testavimo aplinkai galite įvesti „atminties duomenų šaltinį“. Gamyboje galite naudoti „HTTP serverio duomenų šaltinį“.

Ankstesniame „JSFiddle“ „bendra sąsaja“ yra metodas „rasti įrašų pavadinimą“. Nepaisant to, kaip kuriate sąsają, jūs galite valdyti visus skambinančiuosius. Todėl pokyčiai yra nesudėtingi. Martinas Fowleris tai vadina neskelbta sąsaja.

Kita vertus, jei serveris nutraukia paskelbtos sąsajos sutartį, tarkime, kad klasės požymis pasikeičia iš antraštės į straipsnio pavadinimą, turite pakeisti tik duomenų šaltinio įgyvendinimą. Jūs neturite visur daryti pakeitimų.

Svarbu išbandyti ir gauti išankstinį atsiliepimą apie testus, susijusius su elgesiu, o ne duomenis. Todėl labai svarbu suprojektuoti kodą, kad būtų sumažintos logikos pakeitimams reikalingos pastangos. Šiuo atveju logika yra įvesties iš Duomenų šaltinio transformacija į HTML netvarkingą sąrašą.

Pasirinkę naują dizainą, atskyrėte duomenų šaltinį nuo bandomos sistemos. Todėl galite pašalinti Nock.

Naujas dizainas taip pat sumažina darbą, reikalingą norint pridėti naują taisyklę sistemoje be kopijavimo / įklijavimo:

Vis dėlto „HTTP serverio duomenų šaltinis“ turi tam tikrą neišbandytą logiką privačios funkcijos „užklausos įrašų antraštės iš HTML“ viduje.

Norėdami tai išbandyti, galite pakartoti tą patį modelį. Paspauskite šalutinį poveikį ir padarykite „gaukite užklausos“ mechanizmą įjungiamą į „HTTP serverio duomenų šaltinį“. Tokiu būdu vis tiek galite išbandyti kodą, nereikia „Nock“:

Kadangi jau turite bandymų patvirtinti, kad „įrašų pavadinimo sąrašas“ veikia su „atmintyje esančiu duomenų šaltiniu“, galite nuspręsti išbandyti duomenų šaltinį atskirai, kad įsitikintumėte, jog jis pateikia teisingą rezultatą:

Jūs visiškai pašalinote šalutinį poveikį iš logikos. Tokiu atveju reali funkcija „gauti užklausą“ yra šalutinis poveikis. Dabar galite naudoti „Nock“ tam padengti.

Tačiau, atsižvelgiant į logiką „gauti užklausą“, kuri yra nereikšminga, ir „Nock“ kainuoja dideles išlaidas, prasminga turėti nedaug integracijos testų, galinčių vykdyti visą programą, įskaitant šalutinį poveikį. Galite naudoti „Nock“, kad išvengtumėte ryšio su tiesioginiu serveriu, ir vis tiek naudokite HTTP užklausas, kad patikrintumėte, ar programa pateikia pagrįstą atsakymą, kai visi kūriniai tinka.

„Nock“ naudinga nutraukti ryšį HTTP sluoksnyje ir pateikti statinį atsakymą. Tačiau naudokitės taupiai. Už kiekvieną jūsų bandymą jūs padidinate reikšmingą sujungimą ir pakeitimo kainą.

Jei Nock nebus naudojamas taupiai, Nock gali sukurti Nock Hell.

Problema, kurią norite išspręsti, yra sumažinti klaidų skaičių ir pokyčių kainą. Jei pakeisite kodo struktūrą nepakeisdami elgesio, testai neturėtų nutrūkti. Jei jie tai daro, tada nepavyko parašyti naudingų testų.

Jūsų tikslas turėtų būti patobulinti testo aprėptį pagal jums rūpimą logiką ir gauti išankstinį atsiliepimą. Visa tai nedaro įtakos jūsų galimybei atnaujinti kodą.

Išskirkite šalutinį poveikį ir ribokite tokių priemonių kaip „Nock“ naudojimą iki programos ribų.

Tai turėtų suteikti jums pakankamai pasitikėjimo, kad galėtumėte atlikti pakeitimus, o ne sugadinti dalykus.

Prisijunkite prie kovos, paspauskite šalutinį poveikį ir tada… Išmeskite.

Ačiū, kad perskaitėte. Jei turite atsiliepimų, susisiekite su manimi „Twitter“, „Facebook“ ar „Github“.

Ačiū Eduardo Slompo ir Guilherme J. Tramontina už įžvalgius atsiliepimus apie šį pranešimą.