Татбиқ, миқёс: таҷрибаи истифодаи санҷишҳои автоматӣ дар ВТБ

Шӯъбаи мо қубурҳои пурраи автоматиро барои роҳандозии версияҳои нави барномаҳо ба муҳити истеҳсолӣ месозад. Албатта, ин санҷишҳои автоматии функсионалӣ талаб мекунад. Дар поёни буриш ҳикоят дар бораи он аст, ки чӣ гуна мо аз санҷиши як ришта дар мошини маҳаллӣ сар карда, мо ба нуқтаи автотестест, ки дар Селеноид дар лӯлаи сохтмон бо гузориши Allure дар саҳифаҳои GitLab кор мекардем, расидем ва дар ниҳоят як абзори автоматикунонии олӣ гирифтем. ки одамони оянда аз дастахо истифода бурда метавонанд.

Татбиқ, миқёс: таҷрибаи истифодаи санҷишҳои автоматӣ дар ВТБ

Мо аз куҷо сар кардем?

Барои татбиқи автотестҳо ва ҳамгиро кардани онҳо ба қубур, ба мо чаҳорчӯбаи автоматикунонӣ лозим буд, ки метавонад ба таври фасеҳ ба ниёзҳои мо тағйир ёбад. Идеалӣ, ман мехостам як стандарти ягона барои муҳаррики санҷиши автоматӣ гирам, ки барои ворид кардани автотестҳо ба қубур мутобиқ карда шудааст. Барои татбиқ мо технологияҳои зеринро интихоб кардем:

  • Java,
  • Мавен,
  • Селен,
  • Бодиринг+ЮНИТ 4,
  • Ҷолиб,
  • ГитЛаб.

Татбиқ, миқёс: таҷрибаи истифодаи санҷишҳои автоматӣ дар ВТБ

Чаро ин маҷмӯи махсус? Java яке аз забонҳои маъмултарин барои санҷишҳои автоматӣ мебошад ва ҳамаи аъзоёни даста бо он ҳарф мезананд. Селен ҳалли равшан аст. Бодиринг, аз ҷумла, бояд эътимодро ба натиҷаҳои санҷишҳои автоматикунонидашудаи шӯъбаҳое, ки ба санҷиши дастӣ машғуланд, зиёд мекард.

Санҷишҳои риштаи ягона

Барои он ки чархро дубора ихтироъ накунем, мо таҳаввулотро аз анбори мухталифи GitHub ҳамчун асоси чаҳорчӯба гирифтем ва онҳоро барои худамон мутобиқ кардем. Мо барои китобхонаи асосӣ як репозиторий бо асоси чаҳорчӯбаи автотест ва репозиторий бо намунаи тиллоии татбиқи автотестҳо дар ядрои худ эҷод кардем. Ҳар як даста бояд тасвири тиллоиро гирифта, дар он санҷишҳо таҳия карда, онро ба лоиҳаи худ мутобиқ созанд. Мо онро дар бонки GitLab-CI ҷойгир кардем, ки дар он танзим кардем:

  • ҳаррӯзаи ҳама санҷишҳои хаттӣ барои ҳар як лоиҳа;
  • дар лӯлаи сохтмон ба кор медарояд.

Дар аввал озмоишҳо кам буданд ва онҳо дар як ҷараён гузаронида мешуданд. Давраи ягонаи ришта дар давандаи Windows GitLab ба мо хеле мувофиқ буд: санҷишҳо курсии санҷиширо хеле сабук бор карданд ва қариб ҳеҷ гуна захираҳоро истифода набурданд.

Бо мурури замон, шумораи автотестҳо торафт зиёд мешуд ва мо дар бораи он фикр мекардем, ки онҳо дар мувозӣ кор кунанд, вақте ки дави пурра тақрибан се соатро гирифт. Дигар мушкилот низ пайдо шуданд:

  • мо муътадил будани санҷишҳоро тасдиқ карда натавонистем;
  • озмоишҳо, ки дар як мошини маҳаллӣ якчанд маротиба дар як саф иҷро карда шуданд, баъзан дар CI садама.

Намунаи танзими санҷишҳои автоматӣ:

<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

 Татбиқ, миқёс: таҷрибаи истифодаи санҷишҳои автоматӣ дар ВТБ
Сарбории даванда ҳангоми санҷиш (8 ядро, 8 ГБ RAM, 1 ришта)
 
Бартариҳои санҷишҳои як ришта:

  • ба осонӣ насб кардан ва идора кардан;
  • парвозҳо дар CI амалан аз партобҳои маҳаллӣ фарқ намекунанд;
  • санҷишҳо ба ҳамдигар таъсир намерасонанд;
  • талаботи ҳадди ақал барои захираҳои давандагон.

Камбудиҳои санҷишҳои як ришта:

  • барои анҷом додан вақти хеле дароз лозим аст;
  • устувории дарозмуддати санҷишҳо;
  • бесамар истифода бурдани ресурсхои даванда, нихоят паст истифода бурда мешавад.

Санҷишҳо дар фардҳои JVM

Азбаски мо ҳангоми татбиқи чаҳорчӯбаи базавӣ ба рамзи бехатарии ришта аҳамият надодем, роҳи равшантарини кор дар баробари кор ин буд. бодиринг-jvm-плагини мувозӣ барои Maven. Конфигуратсияи плагин осон аст, аммо барои дуруст кор кардани параллел, санҷишҳои автоматӣ бояд дар браузерҳои алоҳида иҷро карда шаванд. Коре нест, ман бояд Selenoid-ро истифода кунам.

Сервери Selenoid дар мошини дорои 32 ядро ​​ва 24 ГБ хотираи оперативӣ ба кор андохта шуд. Маҳдудият дар 48 браузер муқаррар карда шуд - 1,5 ришта барои як ядро ​​​​ва тақрибан 400 МБ RAM. Дар натиҷа вақти санҷиш аз се соат ба 40 дақиқа кам карда шуд. Суръат додани давидан ба ҳалли мушкилоти устуворӣ кӯмак кард: акнун мо метавонем 20-30 маротиба зуд санҷишҳои навро иҷро кунем, то боварӣ ҳосил кунем, ки онҳо боэътимод иҷро шудаанд.
Камбудии аввалини ҳалли он истифодаи баланди захираҳои даванда бо шумораи ками риштаҳои параллелӣ буд: дар 4 ядро ​​​​ва 8 ГБ хотираи оперативӣ, санҷишҳо дар на бештар аз 6 ришта устувор буданд. Камбудии дуюм: плагин барои ҳар як сенария синфҳои давандаро тавлид мекунад, новобаста аз он ки чанде аз онҳо оғоз мешаванд.

Муҳимтарин! Тағирёбандаро бо барчаспҳо ба argLine, масалан, чунин:

<argLine>-Dcucumber.options="--tags ${TAGS} --plugin io.qameta.allure.cucumber2jvm.AllureCucumber2Jvm --plugin pretty"</argLine>
…
Mvn –DTAGS="@smoke"

Агар шумо тегро бо ин роҳ гузаронед, плагин барои ҳама санҷишҳо давандагон тавлид мекунад, яъне он кӯшиш мекунад, ки ҳама санҷишҳоро иҷро кунад ва фавран пас аз оғоз ба онҳо гузаред ва бисёр фардҳои JVM эҷод кунад.

Ба тағирёбанда бо тег партофтан дуруст аст барчаспҳои дар танзимоти плагин, ба мисоли зер нигаред. Усулҳои дигаре, ки мо санҷидаем, дар пайваст кардани плагини Allure мушкилот доранд.

Намунаи вақти кор барои 6 санҷиши кӯтоҳ бо танзимоти нодуруст:

[INFO] Total time: 03:17 min

Намунаи вақти санҷиш, агар шумо тегро мустақиман ба mvn... –Dumber.options:

[INFO] Total time: 44.467 s

Намунаи танзими санҷишҳои автоматӣ:

<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 (озмоиши ноустувортарин, 4 такрор)

Татбиқ, миқёс: таҷрибаи истифодаи санҷишҳои автоматӣ дар ВТБСарбории даванда ҳангоми санҷиш (8 ядро, 8 ГБ RAM, 12 ришта)
 
Тарафдор:

  • насби осон - ба шумо танҳо як плагин илова кардан лозим аст;
  • қобилияти дар як вақт иҷро кардани шумораи зиёди санҷишҳо;
  • суръатбахшии устувории санҷиш ба туфайли қадами 1. 

Эзоҳ:

  • Якчанд OS/контейнер талаб карда мешавад;
  • истеъмоли зиёди захираҳо барои ҳар як фард;
  • Васлкунак кӯҳна шудааст ва дигар дастгирӣ намешавад. 

Ноустувориро чй тавр бартараф кардан мумкин аст 

Қуттиҳои санҷишӣ идеалӣ нестанд, ба монанди худи санҷишҳо. Тааҷҷубовар нест, ки мо як қатор санҷишҳои ноустувор дорем. Ба наҷот омад плагини боэътимоди maven, ки берун аз қуттӣ аз нав оғоз кардани санҷишҳои нокомро дастгирӣ мекунад. Ба шумо лозим аст, ки версияи плагинро ҳадди аққал 2.21 навсозӣ кунед ва як сатрро бо шумораи аз нав оғоз кардани файли pom нависед ё онро ҳамчун далел ба Maven гузаронед.

Намунаи танзими санҷишҳои автоматӣ:

   	
<plugin>
        	
<groupId>org.apache.maven.plugins</groupId>
  	
      <artifactId>maven-surefire-plugin</artifactId>
        	
<version>2.21.0</version>
        	
<configuration>
           	
….
            	
<rerunFailingTestsCount>2</rerunFailingTestsCount>
            	
….
            	
</configuration>
</plugin>

Ё ҳангоми оғозёбӣ: mvn … -Dsurefire.rerunFailingTestsCount=2 …
Ҳамчун интихоб, имконоти Maven-ро барои скрипти PowerShell (PS1) таъин кунед:

  
Set-Item Env:MAVEN_OPTS "-Dfile.encoding=UTF-8 -Dsurefire.rerunFailingTestsCount=2"

Тарафдор:

  • лозим нест, ки вақтро барои таҳлили санҷиши ноустувор ҳангоми садама сарф кунед;
  • мушкилоти устувории курсии санҷишӣ метавонад коҳиш дода шавад.

Эзоҳ:

  • камбудиҳои шинокунандаро аз даст додан мумкин аст;
  • вакти кор зиёд мешавад.

Санҷишҳои мувозӣ бо китобхонаи Бодрухин 4

Шумораи санҷишҳо рӯз аз рӯз зиёд мешуд. Мо боз дар бораи тезон-дани давидан фикр кардем. Илова бар ин, ман мехостам, ки ҳарчи бештар санҷишҳоро ба лӯлаи васлкунии барномаҳо ворид кунам. Омили муҳим ин буд, ки насли давандагон ҳангоми мувозӣ бо истифода аз плагини Maven давидан хеле тӯлонӣ буд.

Дар он вақт, Бодиринг 4 аллакай бароварда шуда буд, аз ин рӯ мо тасмим гирифтем, ки ядрои ин версияро аз нав нависем. Дар ёддоштҳои релиз ба мо ваъда дода буданд, ки дар сатҳи ришта оғоз кардани мувозӣ. Аз ҷиҳати назариявӣ ин бояд чунин бошад:

  • аз хисоби зиёд кардани риштахо суръати кори автотестхо хеле тезонда шавад;
  • талафоти вақт дар тавлиди давандагон барои ҳар як autotest бартараф.

Беҳтар кардани чаҳорчӯба барои санҷишҳои бисёрсоҳавӣ он қадар душвор набуд. Бодиринг 4 ҳар як санҷиши инфиродӣ дар риштаи махсус аз аввал то ба охир иҷро мешавад, аз ин рӯ баъзе чизҳои статикии умумӣ танҳо ба тағирёбандаҳои ThreadLocal табдил дода шуданд. 
Чизи асосӣ ҳангоми табдилдиҳӣ бо истифода аз абзорҳои рефактори Idea ин тафтиш кардани ҷойҳое мебошад, ки тағирёбанда муқоиса карда шудааст (масалан, санҷиши нул). Илова бар ин, шумо бояд плагини Allure -ро ба шарҳи синфи Junit Runner илова кунед.

Намунаи танзими санҷишҳои автоматӣ:

 
<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 (озмоиши ноустувортарин, 5 такрор)

Татбиқ, миқёс: таҷрибаи истифодаи санҷишҳои автоматӣ дар ВТБСарбории даванда ҳангоми санҷиш (8 ядро, 8 ГБ RAM, 24 ришта)

Тарафдор:

  • истеъмоли ками захираҳо;
  • дастгирии модарӣ аз Бодрухин - ягон асбоби иловагӣ талаб карда намешавад;
  • қобилияти иҷро кардани зиёда аз 6 ришта дар як ядрои протсессор.

Эзоҳ:

  • шумо бояд боварӣ ҳосил кунед, ки код иҷрои чанд риштаро дастгирӣ мекунад;
  • хадди дохилшавй зиёд мешавад.

Ҳисоботи Allure дар саҳифаҳои GitLab

Пас аз ҷорӣ кардани иҷрои чанд ришта, мо ба таҳлили гузоришҳо вақти бештар сарф кардем. Он вақт мо маҷбур будем, ки ҳар як гузоришро ҳамчун артефакт ба GitLab бор кунем ва сипас онро зеркашӣ ва кушоем. Ин чандон қулай нест ва вақти зиёдро мегирад. Ва агар ягон каси дигар мехоҳад гузоришро барои худ бубинад, пас онҳо бояд ҳамон амалҳоро иҷро кунанд. Мо мехостем, ки фикру мулоҳизаҳоро зудтар қабул кунем ва мо роҳи ҳалли худро ёфтем - саҳифаҳои GitLab. Ин хусусияти дарунсохтест, ки дар ҳама версияҳои охирини GitLab дастрас аст. Ба шумо имкон медиҳад, ки сайтҳои статикиро дар сервери худ ҷойгир кунед ва ба онҳо тавассути истиноди мустақим дастрасӣ пайдо кунед.

Ҳама скриншотҳои гузоришҳои Allure дар саҳифаҳои GitLab гирифта шудаанд. Скрипт барои ҷойгиркунии ҳисобот дар саҳифаҳои GitLab - дар Windows PowerShell (пеш аз ин ба шумо лозим аст, ки санҷишҳои автоматиро иҷро кунед):

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

Чӣ дар охир 

Ҳамин тавр, агар шумо дар бораи он фикр мекардед, ки оё ба шумо рамзи бехатарии Thread дар чаҳорчӯбаи автотестҳои Бодрухин лозим аст, ҳоло ҷавоб аён аст - бо Бодрухин 4 татбиқ кардан осон аст ва ба ин васила шумораи риштаҳои ҳамзамон ба таври назаррас афзоиш меёбад. Бо ин усули гузаронидани санҷишҳо, савол дар бораи кори мошин бо Selenoid ва курсии санҷиш аст.

Амалия нишон дод, ки гузаронидани автотестҳо дар риштаҳо ба шумо имкон медиҳад, ки истеъмоли захираҳоро то ҳадди ақал бо иҷрои беҳтарин кам кунед. Тавре ки аз графикҳо дида мешавад, дучандшавии риштаҳо ба суръатбахшии шабеҳ дар санҷишҳои иҷроиш оварда намерасонад. Бо вуҷуди ин, мо тавонистем беш аз 2 санҷиши автоматиро ба сохтани барнома илова кунем, ки ҳатто бо 200 такрори такрорӣ дар тӯли 5 дақиқа иҷро мешаванд. Ин ба шумо имкон медиҳад, ки фикру мулоҳизаҳои зудро аз онҳо гиред ва дар ҳолати зарурӣ тағирот ворид кунед ва тартибро дубора такрор кунед.

Манбаъ: will.com

Илова Эзоҳ