MÅ«su nodaļa veido pilnÄ«bÄ automÄtiskus cauruļvadus jaunu lietojumprogrammu versiju palaiÅ”anai ražoÅ”anas vidÄ. Protams, tas prasa automatizÄtas funkcionÄlÄs pÄrbaudes. Zem griezuma ir stÄsts par to, kÄ, sÄkot ar viena pavediena testÄÅ”anu vietÄjÄ datorÄ, mÄs sasniedzÄm vairÄku pavedienu automÄtisko testÄÅ”anu, kas darbojÄs Selenoid bÅ«vÄÅ”anas konveijerÄ ar Allure ziÅojumu GitLab lapÄs un galu galÄ ieguvÄm lielisku automatizÄcijas rÄ«ku. ka nÄkotnes cilvÄki var izmantot komandas.
Kur mÄs sÄkÄm?
Lai ieviestu automÄtiskos testus un integrÄtu tos cauruļvadÄ, mums bija nepiecieÅ”ama automatizÄcijas sistÄma, kuru varÄtu elastÄ«gi mainÄ«t atbilstoÅ”i mÅ«su vajadzÄ«bÄm. IdeÄlÄ gadÄ«jumÄ es gribÄju iegÅ«t vienotu automÄtiskÄs testÄÅ”anas dzinÄja standartu, kas pielÄgots automÄtisko testu iegulÅ”anai cauruļvadÄ. IevieÅ”anai mÄs izvÄlÄjÄmies Å”Ädas tehnoloÄ£ijas:
- Java,
- Maven,
- selÄns,
- GurÄ·is+JUNIT 4,
- Pievilcība,
- GitLab.
KÄpÄc Å”is konkrÄtais komplekts? Java ir viena no populÄrÄkajÄm automÄtisko testu valodÄm, un tajÄ runÄ visi komandas locekļi. SelÄns ir acÄ«mredzams risinÄjums. Cita starpÄ gurÄ·im bija jÄpalielina manuÄlajÄ testÄÅ”anÄ iesaistÄ«to departamentu uzticÄ«ba automatizÄto testu rezultÄtiem.
Viena vītnes testi
Lai neizgudrotu riteni no jauna, mÄs izmantojÄm dažÄdu GitHub krÄtuvju izstrÄdi kÄ ietvara pamatu un pielÄgojÄm tos sev. MÄs izveidojÄm galvenÄs bibliotÄkas repozitoriju ar automÄtiskÄs pÄrbaudes sistÄmas kodolu un repozitoriju ar zelta piemÄru automÄtisko testu ievieÅ”anai mÅ«su kodolÄ. Katrai komandai bija jÄÅem Zelta attÄls un jÄizstrÄdÄ tajÄ testi, pielÄgojot to savam projektam. MÄs to izvietojÄm GitLab-CI bankÄ, kurÄ konfigurÄjÄm:
- katra projekta visu rakstisko automÄtisko testu ikdienas palaiÅ”ana;
- tiek palaists bÅ«vniecÄ«bas cauruļvadÄ.
SÄkumÄ testu bija maz, un tie tika veikti vienÄ plÅ«smÄ. Viena pavediena darbÄ«ba Windows palaidÄjÄ GitLab mums bija diezgan piemÄrota: testi ļoti viegli noslogoja testa stendu un gandrÄ«z neizmantoja nekÄdus resursus.
Laika gaitÄ autotestu skaits kļuva arvien kuplÄks, un mÄs domÄjÄm par to palaiÅ”anu paralÄli, kad pilnais skrÄjiens sÄka aizÅemt apmÄram trÄ«s stundas. ParÄdÄ«jÄs arÄ« citas problÄmas:
- mÄs nevarÄjÄm pÄrbaudÄ«t, vai testi bija stabili;
- testi, kas tika izpildÄ«ti vairÄkas reizes pÄc kÄrtas vietÄjÄ maŔīnÄ, dažkÄrt avarÄja CI.
AutomÄtisko testu iestatÄ«Å”anas piemÄrs:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
<skipTests>${skipTests}</skipTests>
<testFailureIgnore>false</testFailureIgnore>
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
-Dcucumber.options="--tags ${TAGS} --plugin io.qameta.allure.cucumber2jvm.AllureCucumber2Jvm --plugin pretty"
</argLine>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-maven</artifactId>
<version>2.9</version>
</plugin>
</plugins>
Allure ziÅojuma piemÄrs
SkrÄjÄja slodze testu laikÄ (8 kodoli, 8 GB RAM, 1 pavediens)
Viena vītnes testu priekŔrocības:
- viegli uzstÄdÄ«t un palaist;
- palaiÅ”ana CI praktiski neatŔķiras no vietÄjÄm palaiÅ”anÄm;
- testi viens otru neietekmÄ;
- minimÄlÄs prasÄ«bas skrÄjÄja resursiem.
Viena vītnes testu trūkumi:
- aizpildÄ«Å”ana aizÅem ļoti ilgu laiku;
- ilgstoÅ”a testu stabilizÄcija;
- neefektÄ«va skrÄjÄja resursu izmantoÅ”ana, ÄrkÄrtÄ«gi zema izmantoÅ”ana.
Testi uz JVM dakÅ”Äm
TÄ kÄ, ievieÅ”ot pamata sistÄmu, mÄs nerÅ«pÄjÄmies par pavedienu droÅ”u kodu, visredzamÄkais veids, kÄ darboties paralÄli, bija
Selenoid serveris tika palaists maŔīnÄ ar 32 kodoliem un 24 GB RAM. Ierobežojums tika noteikts 48 pÄrlÅ«kprogrammÄs ā 1,5 pavedieni uz kodolu un aptuveni 400 MB RAM. RezultÄtÄ pÄrbaudes laiks tika samazinÄts no trim stundÄm lÄ«dz 40 minÅ«tÄm. DarbÄ«bu paÄtrinÄÅ”ana palÄ«dzÄja atrisinÄt stabilizÄcijas problÄmu: tagad mÄs varÄjÄm Ätri palaist jaunus automÄtiskos testus 20ā30 reizes, lÄ«dz bijÄm pÄrliecinÄti, ka tie darbojas uzticami.
Pirmais risinÄjuma trÅ«kums bija augstÄ skrÄjÄja resursu izmantoÅ”ana ar nelielu skaitu paralÄlu pavedienu: uz 4 kodoliem un 8 GB RAM testi darbojÄs stabili ar ne vairÄk kÄ 6 pavedieniem. Otrs trÅ«kums: spraudnis Ä£enerÄ skrÄjÄju klases katram scenÄrijam neatkarÄ«gi no tÄ, cik no tÄm tiek palaists.
SvarÄ«gi! Nenododiet mainÄ«go ar tagiem uz argLine, piemÄram, Å”Ädi:
<argLine>-Dcucumber.options="--tags ${TAGS} --plugin io.qameta.allure.cucumber2jvm.AllureCucumber2Jvm --plugin pretty"</argLine>
ā¦
Mvn āDTAGS="@smoke"
Ja jÅ«s Å”ÄdÄ veidÄ nodosit tagu, spraudnis Ä£enerÄs skrÄjÄjus visiem testiem, tas ir, tas mÄÄ£inÄs izpildÄ«t visus testus, izlaižot tos uzreiz pÄc palaiÅ”anas un izveidojot daudzus JVM dakÅ”as.
Ir pareizi iemest mainÄ«go ar tagu tagi spraudÅa iestatÄ«jumos, skatiet piemÄru zemÄk. CitÄm mÅ«su pÄrbaudÄ«tajÄm metodÄm ir problÄmas ar Allure spraudÅa pievienoÅ”anu.
DarbÄ«bas laika piemÄrs 6 Ä«siem testiem ar nepareiziem iestatÄ«jumiem:
[INFO] Total time: 03:17 min
Testa izpildes laika piemÄrs, ja tagu tieÅ”i pÄrsÅ«tÄt uz mvn... āDgurÄ·is.opcijas:
[INFO] Total time: 44.467 s
AutomÄtisko testu iestatÄ«Å”anas piemÄrs:
<profiles>
<profile>
<id>parallel</id>
<build>
<plugins>
<plugin>
<groupId>com.github.temyers</groupId>
<artifactId>cucumber-jvm-parallel-plugin</artifactId>
<version>5.0.0</version>
<executions>
<execution>
<id>generateRunners</id>
<phase>generate-test-sources</phase>
<goals>
<goal>generateRunners</goal>
</goals>
<configuration>
<tags>
<tag>${TAGS}</tag>
</tags>
<glue>
<package>stepdefs</package>
</glue>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<forkCount>12</forkCount>
<reuseForks>false</reuseForks>
<includes>**/*IT.class</includes>
<testFailureIgnore>false</testFailureIgnore>
<!--suppress UnresolvedMavenProperty -->
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" -Dcucumber.options="--plugin io.qameta.allure.cucumber2jvm.AllureCucumber2Jvm TagPFAllureReporter --plugin pretty"
</argLine>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
Allure pÄrskata piemÄrs (nestabilÄkais tests, 4 atkÄrtojumi)
SkrÄjÄja slodze testu laikÄ (8 kodoli, 8 GB RAM, 12 pavedieni)
Plusi:
- vienkÄrÅ”a iestatÄ«Å”ana - jums vienkÄrÅ”i jÄpievieno spraudnis;
- spÄja vienlaikus veikt lielu skaitu testu;
- testa stabilizÄcijas paÄtrinÄjums, pateicoties 1. darbÄ«bai.
MÄ«nusi:
- NepiecieÅ”amas vairÄkas OS/konteineri;
- liels resursu patÄriÅÅ” katrai dakÅ”ai;
- Spraudnis ir novecojis un vairs netiek atbalstīts.
KÄ pÄrvarÄt nestabilitÄti
Testu stendi nav ideÄli, tÄpat kÄ paÅ”i autotesti. Tas nav pÄrsteidzoÅ”i, ka mums ir vairÄki vÄji testi. NÄca palÄ«gÄ
AutomÄtisko testu iestatÄ«Å”anas piemÄrs:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
ā¦.
<rerunFailingTestsCount>2</rerunFailingTestsCount>
ā¦.
</configuration>
</plugin>
Vai startÄÅ”anas laikÄ: mvn ā¦ -Dsurefire.rerunFailingTestsCount=2 ā¦
KÄ opciju iestatiet Maven opcijas PowerShell skriptam (PS1):
Set-Item Env:MAVEN_OPTS "-Dfile.encoding=UTF-8 -Dsurefire.rerunFailingTestsCount=2"
Plusi:
- nav jÄtÄrÄ laiks, analizÄjot nestabilu testu, kad tas avarÄ;
- var mazinÄt testa stenda stabilitÄtes problÄmas.
MÄ«nusi:
- peldoÅ”os defektus var palaist garÄm;
- darbÄ«bas laiks palielinÄs.
ParalÄli testi ar gurÄ·u 4 bibliotÄku
PÄrbaužu skaits pieauga ar katru dienu. Atkal domÄjÄm par skrÄjienu paÄtrinÄÅ”anu. TurklÄt es vÄlÄjos lietojumprogrammu montÄžas konveijerÄ integrÄt pÄc iespÄjas vairÄk testu. Kritiskais faktors bija tas, ka skrÄjÄju Ä£enerÄÅ”ana aizÅÄma pÄrÄk ilgu laiku, skrienot paralÄli, izmantojot spraudni Maven.
TajÄ laikÄ Cucumber 4 jau bija izlaists, tÄpÄc mÄs nolÄmÄm pÄrrakstÄ«t kodolu Å”ai versijai. Izlaiduma piezÄ«mÄs mums tika solÄ«ts paralÄla palaiÅ”ana pavedienu lÄ«menÄ«. TeorÄtiski tam vajadzÄja bÅ«t:
- ievÄrojami paÄtrinÄt automÄtisko testu darbÄ«bu, palielinot pavedienu skaitu;
- novÄrst laika zudumu, Ä£enerÄjot skrÄjÄjus katram automÄtiskajam testam.
VairÄku vÄ«tÅu automÄtisko testu sistÄmas optimizÄÅ”ana izrÄdÄ«jÄs ne tik sarežģīta. Cucumber 4 katru atseviŔķo testu veic Ä«paÅ”Ä pavedienÄ no sÄkuma lÄ«dz beigÄm, tÄpÄc dažas parastÄs statiskÄs lietas tika vienkÄrÅ”i pÄrveidotas par ThreadLocal mainÄ«gajiem.
Galvenais, veicot konvertÄÅ”anu, izmantojot Idea refaktoringa rÄ«kus, ir pÄrbaudÄ«t vietas, kur tika salÄ«dzinÄts mainÄ«gais (piemÄram, pÄrbaudot, vai nav nulles). TurklÄt jums ir jÄpievieno Allure spraudnis Junit Runner klases anotÄcijai.
AutomÄtisko testu iestatÄ«Å”anas piemÄrs:
<profile>
<id>parallel</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<useFile>false</useFile>
<testFailureIgnore>false</testFailureIgnore>
<parallel>methods</parallel>
<threadCount>6</threadCount>
<perCoreThreadCount>true</perCoreThreadCount>
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
</argLine>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
Allure pÄrskata piemÄrs (nestabilÄkais tests, 5 atkÄrtojumi)
SkrÄjÄja slodze testu laikÄ (8 kodoli, 8 GB RAM, 24 pavedieni)
Plusi:
- zems resursu patÄriÅÅ”;
- vietÄjais atbalsts no Cucumber - nav nepiecieÅ”ami papildu rÄ«ki;
- spÄja darbinÄt vairÄk nekÄ 6 pavedienus vienÄ procesora kodolÄ.
MÄ«nusi:
- jums jÄpÄrliecinÄs, ka kods atbalsta vairÄku pavedienu izpildi;
- ieejas slieksnis palielinÄs.
Allure ziÅojumi GitLab lapÄs
PÄc vairÄku pavedienu izpildes ievieÅ”anas mÄs sÄkÄm tÄrÄt daudz vairÄk laika pÄrskatu analÄ«zei. Toreiz mums bija jÄaugÅ”upielÄdÄ katrs pÄrskats kÄ artefakts GitLab, pÄc tam tas jÄlejupielÄdÄ un jÄizpako. Tas nav Ä«paÅ”i Ärti un aizÅem daudz laika. Un, ja kÄds cits vÄlas skatÄ«t pÄrskatu pats, tad viÅam bÅ«s jÄveic tÄs paÅ”as darbÄ«bas. GribÄjÄm ÄtrÄk saÅemt atsauksmes, un atradÄm risinÄjumu ā GitLab lapas. Å Ä« ir iebÅ«vÄta funkcija, kas ir pieejama visÄs jaunÄkajÄs GitLab versijÄs. Ä»auj izvietot statiskas vietnes serverÄ« un piekļūt tÄm, izmantojot tieÅ”u saiti.
Visi Allure ziÅojumu ekrÄnuzÅÄmumi tika uzÅemti GitLab lapÄs. Skripts pÄrskata izvietoÅ”anai GitLab lapÄs - programmÄ Windows PowerShell (pirms tam jums ir jÄpalaiž automÄtiskÄs pÄrbaudes):
New-Item -ItemType directory -Path $testresulthistory | Out-Null
try {Invoke-WebRequest -Uri $hst -OutFile $outputhst}
Catch{echo "fail copy history"}
try {Invoke-WebRequest -Uri $hsttrend -OutFile $outputhsttrnd}
Catch{echo "fail copy history trend"}
mvn allure:report
#mvn assembly:single -PzipAllureReport
xcopy $buildlocationtargetsiteallure-maven-plugin* $buildlocationpublic /s /i /Y
KÄ rezultÄtÄ
TÄtad, ja jÅ«s domÄjÄt par to, vai jums ir nepiecieÅ”ams Thread droÅ”s kods Cucumber automÄtiskÄs pÄrbaudes ietvaros, tagad atbilde ir acÄ«mredzama - ar Cucumber 4 to ir viegli ieviest, tÄdÄjÄdi ievÄrojami palielinot vienlaikus palaisto pavedienu skaitu. Izmantojot Å”o testu veikÅ”anas metodi, tagad rodas jautÄjums par maŔīnas ar selenoÄ«du un testa stenda veiktspÄju.
Prakse ir parÄdÄ«jusi, ka automÄtisko testu veikÅ”ana pavedieniem ļauj samazinÄt resursu patÄriÅu lÄ«dz minimumam, nodroÅ”inot vislabÄko veiktspÄju. KÄ redzams no grafikiem, pavedienu dubultoÅ”ana neizraisa lÄ«dzÄ«gu paÄtrinÄjumu veiktspÄjas testos. TomÄr mÄs varÄjÄm lietojumprogrammas bÅ«vÄjumam pievienot vairÄk nekÄ 2 automatizÄtus testus, kas pat ar 200 atkÄrtotÄm palaiÅ”anas reizÄm tiek izpildÄ«ti aptuveni 5 minÅ«tÄs. Tas ļauj Ätri saÅemt atsauksmes no viÅiem un, ja nepiecieÅ”ams, veikt izmaiÅas un atkÄrtot procedÅ«ru vÄlreiz.
Avots: www.habr.com