Hej Habr!
Mitt namn Àr Maksim Ponomarenko och jag Àr utvecklare pÄ Sportmaster. Jag har 10 Ärs erfarenhet inom IT-omrÄdet. Jag började min karriÀr med manuell testning och bytte sedan till databasutveckling. Under de senaste fyra Ären har jag, utifrÄn mina kunskaper inom testning och utveckling, arbetat med testautomation pÄ DBMS-nivÄ.
Jag har varit en del av Sportmaster-teamet i drygt ett Är och jag utvecklar automatiserad testning pÄ ett av de stora projekten. I april talade jag och killarna frÄn Sportmaster Lab pÄ en konferens i Krasnodar. Min rapport hette "Enhetstester i DBMS", och nu vill jag dela den med er. Det kommer att bli mycket text, sÄ jag bestÀmde mig för att dela upp rapporten i tvÄ inlÀgg. I det första kommer vi att prata om automatiserade tester och testning i allmÀnhet, och i det andra kommer jag att fördjupa mig mer i detalj vid vÄrt enhetstestsystem och resultaten av dess tillÀmpning.
Först lite trÄkig teori. Vad Àr automatiserad testning? Det Àr testning som utförs med hjÀlp av programvaruverktyg, och inom modern IT anvÀnds det allt oftare i mjukvaruutveckling. Detta beror pÄ att företag vÀxer, deras informationssystem vÀxer och dÀrmed mÀngden funktionalitet som behöver testas vÀxer. Att genomföra manuell testning blir allt dyrare.
Jag arbetade för ett stort företag som slÀppte programvara varannan mÄnad. Samtidigt Àgnades en hel mÄnad Ät ett dussin testare som manuellt kontrollerade funktionaliteten. Tack vare implementeringen av automatisering av ett litet team av utvecklare lyckades vi minska testtiden till tvÄ veckor pÄ ett och ett halvt Är. Vi ökade inte bara testhastigheten, utan förbÀttrade ocksÄ kvaliteten. Automatiska tester lanseras regelbundet och de utför alltid hela kontrollförloppet som ingÄr i dem, det vill sÀga vi utesluter den mÀnskliga faktorn.
Ett karakteristiskt drag för modern IT Àr att en utvecklare kan vara skyldig att inte bara skriva produktkod, utan ocksÄ skriva enhetstester som kontrollerar denna kod.
Men tÀnk om ditt system huvudsakligen Àr baserat pÄ serverlogik? Det finns ingen universell lösning eller bÀsta praxis pÄ marknaden. Som regel löser företag detta problem genom att skapa sina egna egenskrivna testsystem. Detta egenskrivna automatiserade testsystem skapades i vÄrt projekt och jag kommer att prata om det i min rapport.

Testa lojalitet
LÄt oss först prata om projektet dÀr vi implementerade ett automatiserat testsystem. VÄrt projekt Àr Sportmasters lojalitetssystem (förresten, vi skrev redan om det i ).
Om ditt företag Àr tillrÀckligt stort kommer ditt lojalitetssystem att ha tre standardfunktioner:
- Ditt system kommer att vara högbelastat.
- Ditt system kommer att innehÄlla komplexa berÀkningsprocesser.
- Ditt system kommer att aktivt förbÀttras.
LÄt oss gÄ i ordning... Totalt sett, om vi betraktar alla Sportmaster-mÀrken, sÄ har vi mer Àn 1000 butiker i Ryssland, Ukraina, Kina, Kazakstan och Vitryssland. Cirka 300 000 köp görs i dessa butiker varje dag. Det vill sÀga 3-4 kvitton kommer in i vÄrt system varje sekund. Naturligtvis Àr vÄrt lojalitetssystem högbelastat. Och eftersom det anvÀnds aktivt mÄste vi tillhandahÄlla högsta möjliga kvalitetsstandard, eftersom alla fel i programvaran innebÀr stora monetÀra, anseendemÀssiga och andra förluster.
Det finns fler Àn hundra olika kampanjer som körs samtidigt pÄ Sportmaster. Kampanjerna Àr vÀldigt olika: det finns produktkampanjer, det finns kampanjer knutna till en veckodag, det finns kampanjer knutna till en specifik butik, det finns kampanjer baserade pÄ checkbeloppet, det finns kampanjer baserade pÄ antalet produkter. Generellt sett Àr det inte svagt. Kunder har bonusar, det finns kampanjkoder som anvÀnds vid köp. Allt detta leder till att det Àr en mycket enkel uppgift att berÀkna vilken bestÀllning som helst.
Algoritmen som implementerar orderhantering Àr verkligen fruktansvÀrd och komplex. Och alla Àndringar i denna algoritm Àr ganska riskabla. De mest till synes obetydliga Àndringarna kan leda till ganska oförutsÀgbara effekter. Men det Àr just sÄdana komplexa berÀkningsprocesser, sÀrskilt de som implementerar kritisk funktionalitet, som Àr de bÀsta kandidaterna för automatisering. Att manuellt kontrollera dussintals liknande fall Àr mycket dyrt i tidsmÀssigt avseende. Och eftersom ingÄngspunkten till processen Àr oförÀndrad, kan du, nÀr du vÀl har beskrivit den, snabbt utplÄna automatiska tester och vara sÀker pÄ funktionaliteten.
Eftersom vÄrt system anvÀnds aktivt kommer verksamheten att vilja ha nÄgot nytt frÄn dig, leva med tiden och vara kundorienterad. I vÄrt lojalitetssystem slÀpps releaser varannan mÄnad. Det innebÀr att vi varannan mÄnad behöver genomföra en fullstÀndig regression av hela systemet. Samtidigt gÄr utvecklingen naturligtvis, precis som inom all modern IT, inte direkt frÄn utvecklaren till produktion. Den börjar i utvecklarens krets, passerar sedan successivt teststÀllning, release, acceptans och hamnar först sedan i produktion. à tminstone i test- och releasekretsarna behöver vi genomföra en fullstÀndig regression av hela systemet.
De beskrivna egenskaperna Àr standard för nÀstan alla lojalitetssystem. LÄt oss prata om funktionerna i vÄrt projekt.
Tekniskt sett Àr 90 % av logiken i vÄrt lojalitetssystem serverbaserad och implementerad i Oracle. Det finns en klient i Delphi som utför funktionen av en ARM-administratör. Det finns webbtjÀnster för externa applikationer (till exempel en webbplats). DÀrför Àr det ganska logiskt att om vi driftsÀtter ett automatiserat testsystem, sÄ kommer vi att göra det i Oracle.
Lojalitetssystemet i Sportmaster har funnits i mer Àn 7 Är och skapades av enskilda utvecklare... Det genomsnittliga antalet utvecklare i vÄrt projekt under dessa 7 Är var 3-4 personer. Men under det senaste Äret har vÄrt team vuxit avsevÀrt, och nu arbetar 10 personer med projektet. Det vill sÀga personer som inte Àr bekanta med typiska uppgifter, processer och arkitektur kommer till projektet. Och det finns en ökad risk att vi missar fel.
Projektet kÀnnetecknas av avsaknaden av dedikerade testare som heltidsenheter. Testning finns naturligtvis, men analytiker utför testning, utöver sina andra huvudsakliga ansvarsomrÄden: att kommunicera med affÀrskunder, anvÀndare, utveckla systemkrav, etc., etc. Trots att testningen genomförs mycket vÀl (detta Àr sÀrskilt lÀmpligt att nÀmna, eftersom vissa av analytikerna kan stöta pÄ den hÀr rapporten), har effektiviteten av specialisering och koncentration pÄ en sak inte uteblivit.
Med tanke pÄ allt ovanstÄende, för att förbÀttra kvaliteten pÄ den levererade produkten och minska utvecklingstiden, verkar idén om automatiserad testning av projektet ganska logisk. Och i olika skeden av lojalitetssystemets existens anstrÀngde sig enskilda utvecklare för att tÀcka sin kod med enhetstester. Generellt sett var detta en ganska olikartad process, dÀr alla anvÀnde sin egen arkitektur och sina egna metoder. De slutliga resultaten var gemensamma för enhetstester: tester utvecklades, anvÀndes under en tid, lagrades i en versionerad fillagring, men vid nÄgon tidpunkt slutade de att köras och glömdes bort. Först och frÀmst hÀnde detta eftersom testerna var mer knutna till en specifik utförare, snarare Àn ett projekt.
utPLSQL kommer till undsÀttning

Vet du nÄgot om Stephen Feuerstein?
Det hÀr Àr en smart kille som har Àgnat en stor del av sin karriÀr Ät att arbeta med Oracle och PL/SQL, och har skrivit en hel del verk i Àmnet. En av hans berömda böcker heter: "Oracle PL/SQL. För proffs." Det var Stephen som utvecklade utPLSQL-lösningen, eller, som det stÄr för, Unit Testing framework för Oracle PL/SQL. utPLSQL-lösningen skapades 2016, men de fortsÀtter att aktivt arbeta med den och slÀppa nya versioner. Vid tidpunkten för rapporten Àr den senaste versionen daterad 24 mars 2019.
Vad Àr det? Det Àr ett separat projekt med öppen kÀllkod. Det vÀger ett par megabyte, inklusive exempel och dokumentation. Fysiskt sett Àr det ett separat schema i ORACLE-databasen med en uppsÀttning paket och tabeller för att organisera enhetstestning. Installationen tar nÄgra sekunder. Ett utmÀrkande drag för utPLSQL Àr dess anvÀndarvÀnlighet.
Globalt sett Àr utPLSQL en mekanism för att köra enhetstester, dÀr enhetstester förstÄs som vanliga Oracle-batchprocedurer, vars organisation motsvarar vissa regler. Förutom att köra lagrar utPLSQL en logg över alla dina testkörningar och har Àven ett internt rapporteringssystem.
LÄt oss titta pÄ ett exempel pÄ hur enhetstestkod ser ut nÀr den implementeras med den hÀr metoden.

SÄ, skÀrmen visar koden för en typisk specifikation av ett paket med enhetstester. Vilka Àr de obligatoriska kraven? Paketet mÄste ha prefixet "utp_". Alla procedurer med tester mÄste ha exakt samma prefix. Paketet mÄste nödvÀndigtvis innehÄlla tvÄ standardprocedurer: "utp_setup" och "utp_teardown". Den första proceduren anropas genom att starta om varje enhetstest, den andra - efter uppstart.
"utp_setup" förbereder vanligtvis vÄrt system för att köra ett enhetstest, till exempel skapar testdata. "utp_teardown" - tvÀrtom, ÄterstÀller allt till de ursprungliga instÀllningarna och ÄterstÀller resultaten av uppstarten.
HÀr Àr ett exempel pÄ det enklaste enhetstestet, som kontrollerar normaliseringen av det angivna kundens telefonnummer till standardformulÀret för vÄrt lojalitetssystem. Det finns inga obligatoriska standarder för att skriva procedurer med enhetstester. Som regel görs ett anrop till nÄgon metod i systemet som testas, och resultatet som returneras av denna metod jÀmförs med referensresultatet. Det Àr viktigt att jÀmförelsen av referensresultatet och det mottagna resultatet sker med hjÀlp av standard utPLSQL-metoder.
Ett enhetstest kan ha ett valfritt antal kontroller. Som du kan se i exemplet gör vi fyra pÄ varandra följande anrop till den testade metoden för att normalisera telefonnumret och utvÀrdera resultatet efter varje anrop. NÀr du utvecklar ett enhetstest mÄste du ta hÀnsyn till att det finns kontroller som inte pÄverkar systemet pÄ nÄgot sÀtt, och efter en viss tid mÄste du ÄterstÀlla systemets ursprungliga tillstÄnd.
Till exempel, i det presenterade enhetstestet formaterar vi helt enkelt det inmatade telefonnumret, vilket inte pÄverkar lojalitetssystemet pÄ nÄgot sÀtt.
Och om vi skriver enhetstester med metoden att skapa en ny klient, sÄ skapas en ny klient i systemet efter varje kontroll, vilket kan pÄverka den efterföljande lanseringen av testet.

SÄ hÀr körs enhetstester. Det finns tvÄ möjliga körningsalternativ: att köra alla enhetstester frÄn ett specifikt paket, eller att köra ett specifikt enhetstest i ett specifikt paket.

SÄ hÀr ser ett exempel pÄ ett internt rapporteringssystem ut. Baserat pÄ resultaten frÄn enhetstestet bygger utPLSQL en liten rapport. I den ser vi resultatet för varje specifik kontroll och det övergripande resultatet av enhetstestets körning.
6 regler för autotest
Innan vi började skapa ett nytt automatiserat testsystem för lojalitetssystem, definierade vi tillsammans med ledningen de principer som vÄra framtida automatiserade tester ska följa.

- Automatiserade tester mÄste vara effektiva och anvÀndbara. Vi har fantastiska utvecklare, som mÄste nÀmnas eftersom nÄgra av dem förmodligen kommer att se detta föredrag, och de skriver bra kod. Men Àven deras bra kod Àr inte perfekt och har innehÄllit, innehÄller och kommer att innehÄlla fel. Automatiserade tester mÄste hitta dessa fel. Om sÄ inte Àr fallet, sÄ skriver vi antingen dÄliga automatiserade tester, eller sÄ har vi kommit in i ett dött omrÄde som i princip inte utvecklas. I bÄda fallen gör vi nÄgot fel, och vÄr metod Àr helt enkelt meningslös.
- Autotester bör anvÀndas. Det Àr meningslöst att lÀgga ner mycket tid och anstrÀngning pÄ att skriva en mjukvaruprodukt, lÀgga ihop dess repository och glömma bort det. Tester bör köras, och köras sÄ regelbundet som möjligt.
- Autotester mÄste fungera stabilt. Oavsett tid pÄ dygnet, uppskjutningsstÀllet och andra systeminstÀllningar mÄste testkörningar leda till samma resultat. Som regel sÀkerstÀlls detta genom att autotester arbetar med speciella testdata med fasta systeminstÀllningar.
- Autotester bör arbeta med en hastighet som Àr acceptabel för ditt projekt. Denna tid bestÀms individuellt för varje system. Vissa har rÄd att arbeta hela dagen, medan det för andra Àr avgörande att fÄ plats pÄ sekunder. Vilka hastighetsstandarder vi uppnÄdde i vÄrt projekt kommer jag att berÀtta lite senare.
- Utveckling av autotest bör vara flexibel. Det Àr inte tillrÄdligt att vÀgra testa nÄgon funktionalitet bara för att vi inte har gjort det Àn eller av andra skÀl. utPLSQL innebÀr inga begrÀnsningar för utveckling, och Oracle lÄter dig implementera en mÀngd olika saker. De flesta problem har en lösning, det Àr bara en frÄga om tid och anstrÀngning.
- Implementeringsbarhet. Vi har flera monter dÀr tester behöver köras. Datadumpen kan uppdateras nÀr som helst pÄ varje monter. Det Àr nödvÀndigt att hantera projektet med autotester pÄ ett sÄdant sÀtt att det ska vara möjligt att smÀrtfritt utföra dess fullstÀndiga eller delvisa installation.
Och i det andra inlÀgget om ett par dagar kommer jag att berÀtta vad vi gjorde och vilka resultat vi uppnÄdde.
KĂ€lla: will.com
