Üksus-testid andmebaasides — kuidas me seda teeme Sportmasteris, osa ĂŒks

Tere, Habr!

Minu nimi on Maksim Ponomarenko ja ma olen arendaja Sportmasteris. Mul on 10-aastane kogemus IT-sektoris. Alustasin karjÀÀri manual testing valdkonnas, seejÀrel siirdusin andmebaaside arendusse. Viimased 4 aastat olen kogunud teadmisi, mis on saadud testimises ja arendamises, ja tegelen automaatse testimise automatiseerimisega andmebaasitasemel.

Sportmasteri meeskonnas olen olnud veidi ĂŒle aasta ja ĂŒhe suure projekti raames tegeletakse automaatse testimise arendamisega. Aprillis esinesime Sportmaster Labi poisikeste kĂ€est Konverentsil Krasnodaris, minu ettekande pealkiri oli "Üksus-testid andmebaasides" ja nĂŒĂŒd tahan jagada seda teiega. Teksti tuleb palju, seega otsustasin ettekande jagada kaheks postituseks. Esimeses rÀÀgime automaatsetest testidest ja testimisest ĂŒldiselt, teises peatun tĂ€psemalt meie ĂŒksus-testimise sĂŒsteemil ja selle rakendamise tulemustel.

Üksus-testid andmebaasides — kuidas me seda teeme Sportmasteris, osa ĂŒks

Alguses veidi igavat teooriat. Mis on automaatne testimine? See on testimine, mis viiakse lĂ€bi tarkvaraliste vahenditega, ja tĂ€napĂ€eva IT-s kasutatakse seda ĂŒha enam tarkvara arendamisel. See on seotud sellega, et ettevĂ”tted kasvavad, kasvavad nende info- ja sĂŒsteemid ning sellest tulenevalt suureneb ka testitava funktsionaalsuse hulk. Manual testimise lĂ€biviimine muutub jĂ€rjest keerulisemaks.

Olen töötanud ĂŒhes suures ettevĂ”ttes, mille vĂ€ljaanded toimuvad kord kahe kuu jooksul. Sel juhul kulus terve kuu selleks, et tosin testijat kĂ€sitsi funktsionaalsust kontrollis. TĂ€nu automatiseerimise rakendamisele vĂ€ikese arendajate meeskonnaga suudeti meil poolteise aastaga testimise aega vĂ€hendada kahe nĂ€dalani. Me mitte ainult ei suurendanud testimise kiirus, vaid parandasime ka selle kvaliteeti. Automaatne testid kĂ€ivitatakse regulaarselt ja nad lĂ€bivad alati kogu neid sisse kodeeritud kontrollide kursuse, st vĂ€listame inimfaktori.

TĂ€napĂ€eva IT-le on iseloomulik, et arendajalt vĂ”ib nĂ”uda mitte ainult toote koodi kirjutamist, vaid ka ĂŒksus-testide kirjutamist, mis seda koodi kontrollivad.

Aga mis siis, kui teie sĂŒsteem pĂ”hineb peamiselt serveriloogikal? Üksnes universaalse lahenduse ja parimatest praktikadest turul ei ole. Üldiselt lahendavad firmad selle probleemi, luues oma kohandatud testimissĂŒsteemi. Selline kohandatud automatiseeritud testimissĂŒsteem loodi ka meie projektis, millest rÀÀgin oma ettekandes.

Üksus-testid andmebaasides — kuidas me seda teeme Sportmasteris, osa ĂŒks

Testime lojaalsust

RÀÀgime kĂ”igepealt projektist, kus kĂ€ivitasime automatiseeritud testimissĂŒsteemi. Meie projekt on Spordimeistri lojaalsussĂŒsteem (ĂŒtleme siinkohal, et oleme sellest juba kirjutanud selles postituses).

Kui teie ettevĂ”te on piisavalt suur, siis teie lojaalsussĂŒsteem omab kolme standardset omadust:

  • Teie sĂŒsteem on kĂ”rge koormusega
  • Teie sĂŒsteem sisaldab keerulisi arvutusprotsesse
  • Teie sĂŒsteemi arendatakse pidevalt edasi.

Liigume jĂ€rjekorras edasi
 Kokku on Spordimeistri brĂ€ndide puhul Venemaal, Ukrainas, Hiinas, Kasahstanis ja Valgevenes rohkem kui 1000 poodi. Nendes poodides toimub igapĂ€evaselt umbes 300 000 ostu. See tĂ€hendab, et meie sĂŒsteemi jĂ”uab iga sekund 3-4 tĆĄekki. Loomulikult on meie lojaalsussĂŒsteem kĂ”rge koormusega. Ja kuna seda kasutatakse aktiivselt, peame tagama kĂ”ige kĂ”rgemad kvaliteedistandardid, sest iga tarkvara viga tĂ€hendab suuri rahalisi, maine ja muid kaotusi.

Samuti töötab Spordimeistri juures korraga ĂŒle saja erineva kampaania. Kampaaniad on vĂ€ga erinevad: on tootekampaaniaid, nĂ€dalapĂ€evadega seotud kampaaniaid, teatud poodidega seotud kampaaniaid, tĆĄeki summale seotud kampaaniaid ja toote arvu pĂ”hjal kampaaniaid. ÜhesĂ”naga, ĂŒsna mitmekesine. Klientidel on boonused, on sooduskoodid, mida kasutatakse ostude ajal. KĂ”ik see teeb igasuguste tellimuste arvestamise ĂŒsna keeruliseks ĂŒlesandeks.

Tellimusprotsessi rakendav algoritm on tĂ”eliselt kohutav ja keeruline. Iga muutus sellesse algoritmi on piisavalt riskantne. Tunduvad, et kĂ”ige vĂ€iksemadki muutused vĂ”ivad tuua kaasa ettearvamatuid mĂ”ju. Just need keerulised arvutusprotsessid, eriti kriitilise funktsionaalsuse rakendamine, on parimad kandidaadid automatiseerimiseks. KĂŒmnete sarnaste juhtumite kĂ€sitsi kontrollimine on ajakulukas. Ja kuna protsessi sisenemiskoht jÀÀb muutumatuks, on vĂ”imalik selle korduv kirjeldamisega ĂŒsna kiiresti luua automaatsed testid ning olla kindel funktsionaalsuse töös.

Kuna meie sĂŒsteemi kasutatakse aktiivselt, soovib Ă€ri teilt midagi uut, et pĂŒsida ajaga samas tempos ja olla kliendikeskne. Meie lojaalsussĂŒsteemis ilmusid vĂ€rskendused iga kahe kuu tagant. See tĂ€hendab, et iga kahe kuu tagant peame lĂ€bi viima kogu sĂŒsteemi tĂ€ieliku regressiooni. Loomulikult ei lĂ€he arendus kohe arendaja poolt tootmisse. See sĂŒnnib arendaja keskkonnas, seejĂ€rel lĂ€bib jĂ€rk-jĂ€rgult testimise, vĂ€ljalaske ja vastuvĂ”tu etapid ning alles seejĂ€rel jĂ”uab tootmisse. Minimaalselt peame testimis- ja vĂ€ljalaskekeskkondades viima lĂ€bi kogu sĂŒsteemi tĂ€ieliku regressiooni.

Kirjeldatud omadused on standardseks peaaegu igas lojaalsussĂŒsteemis. RÀÀgime meie projekti eripĂ€radest.

Tehniliselt on 90% meie lojaalsussĂŒsteemi loogikast serveripoolne ja see on teostatud Oracle'is. Seal on kliendi rakendus Delphi pĂ”hjal, mis tĂ€idab administraatori APM-i funktsiooni. Samuti on olemas veebiteenused vĂ€listele rakendustele (nĂ€iteks veebileht). SeetĂ”ttu on tĂ€iesti loogiline, et kui me tahame rakendada automatiseeritud testimissĂŒsteemi, teeme seda Oracle'i keskkonnas.

Sportmasteri lojaalsussĂŒsteem on olnud toimimas ĂŒle 7 aasta ja selle loomine on olnud ĂŒksikute arendajate töö  Meie projekti keskmine arendajate arv selle 7 aasta jooksul oli 3-4 inimest. Kuid viimase aasta jooksul on meie meeskond oluliselt suurenenud, ja nĂŒĂŒd töötavad projekti kallal 10 inimest. See tĂ€hendab, et projekti tulevad inimesed, kes pole tuttavad tĂŒĂŒpiliste ĂŒlesannete, protsesside ja arhitektuuriga. Seega on olemas suurenenud risk, et me jĂ€tame vead tĂ€helepanuta.

Projektile on iseloomulik, et puuduvad spetsiaalsed testijad omaenese ametikohtadel. Testimine toimub kindlasti, kuid testimisega tegelevad analĂŒĂŒtikud, lisaks oma muudele pĂ”hiĂŒlesannetele: suhtlemine Ă€riklientidega, kasutajatega, sĂŒsteemi nĂ”udmiste töötlemine jne. Ja kuigi testimine toimub vĂ€ga kvaliteetselt (eriti sobib see mainida, sest mĂ”ni analĂŒĂŒtik vĂ”ib selle aruande silmade ette saada), ei saa eirata spetsialiseerumise ja ĂŒhele asjale keskendumise efektiivsust.

Arvestades eeltoodut, nĂ€ib projekti testimise automatiseerimise idee kvaliteedi tĂ”stmiseks ja arendamise ajakava lĂŒhendamiseks tĂ€iesti loogiline. Ja sĂŒsteemi lojaalsuse erinevatel arenguetappidel on erinevad arendajad teinud jĂ”upingutusi, et katta oma kood ĂŒksustestidega. See oli ĂŒldiselt piisavalt killustunud protsess, kus igaĂŒhel oli oma arhitektuur ja meetodid. Üksustestide osas olid ĂŒhisteks tulemusteks: testid töötati vĂ€lja, kas kasutati mĂ”nda aega, pandi versioonihaldusfailide varamusse, kuid mingil hetkel peatus nende kĂ€itamine ja need unustati. Peamiselt juhtus see, et testid olid rohkem seotud konkreetse tĂ€itjaga, mitte projektiga.

Appi tuleb utPLSQL

Üksus-testid andmebaasides — kuidas me seda teeme Sportmasteris, osa ĂŒks

Kas tead midagi Steven Feuersteini kohta?

See on nutikas mees, kes on suure osa oma karjÀÀrist pĂŒhendanud Oracle'i ja PL/SQL-iga töötamisele, kirjutades selle teemal piisavalt palju teoseid. Üks tuntud raamat kannab nime: „Oracle PL/SQL. Professionaalidele”. Just Stephenile kuulub lahenduse utPLSQL vĂ€ljatöötamine, mis tĂ€hendab Unit Testing framework for Oracle PL/SQL. Lahendus utPLSQL loodi 2016. aastal, kuid selle kallal töötatakse endiselt aktiivselt ja vĂ€lja antakse uusi versioone. Eesoleva ettekande ajal oli viimane versioon dateeritud 24. mĂ€rtsiks 2019.
Mis see siis on? See on eraldi avatud lĂ€htekoodi projekt. Kaalub paar megabaiti koos nĂ€idiste ja dokumentatsiooniga. FĂŒĂŒsiliselt esindab see eraldi skeemi andmebaasis ORACLE koos pakettide ja tabelitega, et korraldada unit-teste. Paigaldamine vĂ”tab paar sekundit. UtPLSQL'i eripĂ€ra on lihtne kasutamine.
Globaalset vaadates esindab utPLSQL mehhanismi unit-testide kĂ€ivitamiseks, kus unit-test on tavalised Oracle'i pakettprotseduurid, mille korraldus vastab teatud reeglitele. Lisaks kĂ€ivitamisele salvestab utPLSQL logi kĂ”igist teie testide kĂ€ivitamistest ning seal on ka sisemine aruandlussĂŒsteem.

Vaatame nÀitena, milline on unit-testi kood, mis on rakendatud vastavalt sellele meetodile.

Üksus-testid andmebaasides — kuidas me seda teeme Sportmasteris, osa ĂŒks

Nii et ekraanil on esitatud tĂŒĂŒpilise paketi spetsifikatsiooni kood koos unit-testidega. Millised on kohustuslikud nĂ”uded? Paketil peab olema etteantud „utp_” eesliide. TĂ€pselt sama eesliide peavad kandma kĂ”ik testide protseduurid. Paketis peavad olema kaks standardset protseduuri: „utp_setup” ja „utp_teardown”. Esimene protseduur kĂ€ivitatakse iga unit-testi kĂ€ivitamisel, teine — pĂ€rast kĂ€ivitamist.

„utp_setup” valmistab tavaliselt meie sĂŒsteemi valmistama unit-testi kĂ€ivitamiseks, nĂ€iteks luues testandmed. „utp_teardown” tagastab kĂ”ik vastupidiselt algsetele seadetele ja nullib kĂ€ivitamise tulemused.

Siin on nĂ€ide kĂ”ige lihtsamast unit-testist, mis kontrollib kliendi sisestatud telefoninumbri normaliseerimist meie lojaalsussĂŒsteemi standardkuju vastavusse. Kohustuslikke standardeid unit-testide protseduuride kirjutamiseks ei ole. Üldiselt kutsutakse esile mingi meetod testitavas sĂŒsteemis ning selle meetodi tagastatud tulemust vĂ”rreldakse etaloniga. On oluline, et etalonitulemuse ja saadud tulemuse vĂ”rdlemine toimuks standardsete utPLSQL meetodite kaudu.

Unit-testis vĂ”ib olla ĂŒkskĂ”ik kui palju kontrollimisi. Nagu nĂ€ha nĂ€ites, teeme neli jĂ€rjestikust kutsumist testitavale meetodile telefoninumbri normaliseerimiseks ja pĂ€rast iga kutsumist hindame tulemust. Unit-testi arendamisel tuleb arvestada, et on olemas kontrolle, mis ei mĂ”juta sĂŒsteemi, ja pĂ€rast mĂ”ningaid tuleb sĂŒsteem tagasi algsesse olekusse viia.
NĂ€iteks esitatud unit-testis lihtsalt vormindame sisestatud telefoninumbri, mis ei mĂ”juta lojaalsussĂŒsteemi.

Ja kui kirjutame unit-teste uue kliendi loomise meetodi jaoks, siis pĂ€rast iga kontrolli luuakse sĂŒsteemis uus klient, mis vĂ”ib mĂ”jutada katse jĂ€rgnevat kĂ€ivitamist.

Üksus-testid andmebaasides — kuidas me seda teeme Sportmasteris, osa ĂŒks

Nii kÀivituvad unit-testid. Lubatud on kaks kÀivitamise varianti: kÔigi unit-testide kÀivitamine konkreetsest paketist vÔi konkreetse unit-testi kÀivitamine konkreetses paketis.

Üksus-testid andmebaasides — kuidas me seda teeme Sportmasteris, osa ĂŒks

Nii nĂ€eb vĂ€lja nĂ€ide sisemisest aruandlussĂŒsteemist. Unit-testi tulemuste pĂ”hjal koostab utPLSQL vĂ€ikese aruande. Selles nĂ€eme iga konkreetse kontrolli tulemusi ja unit-testi ĂŒldist tulemuse.

6 automaattestimise reeglit

Enne automaattestimise sĂŒsteemi loomisega alustamist mÀÀrasime koos juhtimisega pĂ”himĂ”tted, millele meie tulevased automaattestid peavad vastama.

Üksus-testid andmebaasides — kuidas me seda teeme Sportmasteris, osa ĂŒks

  1. Autotestid peavad olema tÔhusad ja need peavad tooma kasu. Meil on suurepÀrased arendajad, kellest on kindlasti vaja rÀÀkida, sest keegi neist nÀeb tÔenÀoliselt seda ettekannet ja nad kirjutavad suurepÀrast koodi. Kuid isegi nende suurepÀrane kood ei ole ideaalne ning sisaldas, sisaldab ja sisaldab ka edaspidi vigu. Autotestid peavad need vead leidma. Kui see ei ole nii, siis kas kirjutame me halbu autoteste vÔi oleme jÔudnud surnud piirkonda, mida lihtsalt ei arendata. MÔlemal juhul teeme me midagi valesti ja meie lÀhenemine on mÔttetu.
  2. Autoteste peab kasutama. Pole mÔtet kulutada kuhjaga aega ja vaeva tarkvaratoote kirjutamisele, selle hoidla kokku panemisele ja siis unustada see. Testid peavad kÀivituma ja kÀivituma vÔimalikult regulaarselt.
  3. Autotestid peavad töötama stabiilselt. ÜkskĂ”ik millal testid kĂ€ivitatakse, olgu see öö vĂ”i pĂ€ev, sĂŒsteemi seadistused vĂ”i muud seaded, peavad testide kĂ€ivitamised andma sama tulemuse. Reeglina tagab selle, et autotestid töötavad spetsiaalsete testandmete ja fikseeritud sĂŒsteemi seadistustega.
  4. Autotestid peavad töötama teie projekti jaoks vastuvĂ”etava kiirusena. See aeg mÀÀratakse individuaalselt iga sĂŒsteemi jaoks. Kes suudab töötada terve pĂ€eva, kuid kellelegi on kriitiline ajas sekunditesse mahtuda. Milliseid kiirusstandardeid oleme oma projektis saavutanud, rÀÀgin ma veidi hiljem.
  5. Autotestide arendamine peab olema paindlik. Ei ole soovitatav loobuda mingi funktsionaalsuse kontrollimisest lihtsalt seetĂ”ttu, et me pole seda varem teinud vĂ”i mingite muude veendumuste tĂ”ttu. utPLSQL ei sea arendusele mingeid piiranguid ja Oracle vĂ”imaldab ĂŒldiselt ellu viia kĂ”ige erinevamaid asju. Enamiku ĂŒlesannete jaoks on lahendused olemas, kĂŒsimus on ainult ajas ja tehtud pingutustes.
  6. KÀivituvus. Meil on mitmeid keskkondi, kus testide kÀivitamine on vajalik. Igas keskkonnas vÔib igal ajal andmete dump olla uuendatud. Projekti autotestide arendamisega tuleb juhtida selliselt, et oleks vÔimalik teostada selle tÀis- vÔi osaline installatsioon valutult.

Ja teises postituses paar pÀeva hiljem rÀÀgin, mida me saavutasime ja milliseid tulemusi me vÀlja töötasime.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster