Іске асыру, масштабтау: ВТБ автоматтандырылған сынақтарды қолдану тәжірибесі

Біздің бөлімше қосымшалардың жаңа нұсқаларын өндірістік ортаға енгізу үшін толық автоматты құбыр желілерін жасайды. Әрине, бұл үшін автоматтандырылған функционалдық сынақтар қажет. Кесудің астында жергілікті машинада бір ағынды тестілеуден бастап, GitLab беттеріндегі Allure есебімен құрастыру құбырында Selenoid-де жұмыс істейтін көп ағынды автотест нүктесіне қалай жеткеніміз және сайып келгенде тамаша автоматтандыру құралына ие болғанымыз туралы әңгіме бар. болашақ адамдар командаларды пайдалана алады.

Іске асыру, масштабтау: ВТБ автоматтандырылған сынақтарды қолдану тәжірибесі

Біз неден бастадық?

Автотесттерді енгізу және оларды құбырға біріктіру үшін бізге қажеттіліктерімізге сәйкес икемді түрде өзгертуге болатын автоматтандыру жүйесі қажет болды. Ең дұрысы, мен автотесттерді құбырға енгізуге бейімделген автотестілеу қозғалтқышының бірыңғай стандартын алғым келді. Іске асыру үшін біз келесі технологияларды таңдадық:

  • Java,
  • Мавен,
  • селен,
  • Қияр+4 ЖҰМЫС,
  • тартымдылық,
  • GitLab.

Іске асыру, масштабтау: ВТБ автоматтандырылған сынақтарды қолдану тәжірибесі

Неліктен бұл арнайы жиынтық? Java - автоматтандырылған сынақтар үшін ең танымал тілдердің бірі және команданың барлық мүшелері оны сөйлейді. Селен - бұл айқын шешім. Қияр, басқалармен қатар, қолмен тестілеуге қатысатын бөлімшелердің автоматтандырылған сынақтардың нәтижелеріне сенімділігін арттыруы керек еді.

Бір ағынды сынақтар

Дөңгелекті қайта ойлап таппау үшін біз GitHub-тағы әртүрлі репозиторийлерден әзірлемелерді негіз ретінде алып, оларды өзімізге бейімдедік. Біз автотест құрылымының өзегі бар негізгі кітапхана үшін репозиторий және өзімізде автотесттерді енгізудің алтын үлгісі бар репозиторий жасадық. Әр команда «Алтын» суретті алып, оны өз жобасына бейімдей отырып, ондағы сынақтарды әзірлеуі керек болды. Біз оны GitLab-CI банкіне орналастырдық, онда біз конфигурацияладық:

  • әрбір жоба үшін барлық жазбаша автотесттердің күнделікті жұмысы;
  • құрылыс құбырында іске қосылады.

Алғашында сынақтар аз болды, олар бір лекте жүргізілді. Windows Runner 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 ГБ жедел жады, 1 жіп)
 
Бір ағынды сынақтардың артықшылықтары:

  • орнату және іске қосу оңай;
  • CI-дағы ұшырулар жергілікті ұшырулардан іс жүзінде еш айырмашылығы жоқ;
  • сынақтар бір-біріне әсер етпейді;
  • жүгіруші ресурстарына қойылатын минималды талаптар.

Бір ағынды сынақтардың кемшіліктері:

  • аяқтау үшін өте ұзақ уақыт қажет;
  • сынақтарды ұзақ тұрақтандыру;
  • жүгіру ресурстарын тиімсіз пайдалану, өте төмен пайдалану.

JVM шанышқыларындағы сынақтар

Біз базалық құрылымды енгізу кезінде ағынды қауіпсіз кодқа мән бермегендіктен, параллельді іске қосудың ең айқын жолы болды. қияр-jvm-параллель-плагин Мавен үшін. Плагинді конфигурациялау оңай, бірақ дұрыс параллель жұмыс істеу үшін автотесттерді бөлек браузерлерде орындау қажет. Ештеңе жоқ, мен Селеноидты қолдануға тура келді.

Selenoid сервері 32 ядросы және 24 ГБ жедел жады бар машинада іске қосылды. Шектеу 48 браузерде белгіленді - бір ядроға 1,5 ағын және шамамен 400 МБ жедел жады. Нәтижесінде тестілеу уақыты үш сағаттан 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 ГБ жедел жады, 12 ағын)
 
Артықшылықтары:

  • оңай орнату - сізге тек плагин қосу керек;
  • көптеген сынақтарды бір уақытта орындау мүмкіндігі;
  • 1-қадамның арқасында сынақты тұрақтандыруды жеделдету. 

Кемшіліктері:

  • Бірнеше операциялық жүйе/контейнерлер қажет;
  • әрбір шанышқы үшін жоғары ресурстарды тұтыну;
  • Плагин ескірген және енді оған қолдау көрсетілмейді. 

Тұрақсыздықты қалай жеңуге болады 

Сынақ орындықтары автотесттердің өздері сияқты идеалды емес. Бізде бірнеше ретсіз сынақтардың болуы таңқаларлық емес. Көмекке келді 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 …
Опция ретінде PowerShell сценарийі (PS1) үшін Maven опцияларын орнатыңыз:

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

Артықшылықтары:

  • ол бұзылған кезде тұрақсыз сынақты талдауға уақыт жоғалтудың қажеті жоқ;
  • сынақ стендінің тұрақтылық мәселелерін азайтуға болады.

Кемшіліктері:

  • қалқымалы ақауларды өткізіп жіберуге болады;
  • орындалу уақыты артады.

Қияр 4 кітапханасымен параллельді сынақтар

Тесттер саны күн сайын өсуде. Біз тағы да жүгіруді тездету туралы ойладық. Сонымен қатар, мен қосымшаларды құрастыру құбырына мүмкіндігінше көп сынақтарды біріктіргім келді. Маңызды фактор Maven плагинін пайдаланып параллельді жүгіру кезінде жүгірушілер генерациясының тым ұзаққа созылуы болды.

Ол кезде қияр 4 шығарылған болатын, сондықтан біз осы нұсқа үшін ядроны қайта жазуды шештік. Шығарылым жазбаларында бізге жіп деңгейінде параллельді іске қосу уәде етілген. Теориялық тұрғыдан бұл болуы керек:

  • ағындардың санын көбейту арқылы автотесттердің орындалуын айтарлықтай жылдамдату;
  • әрбір автотест үшін жүгірушілер генерациялау уақытын жоғалтуды болдырмайды.

Көп ағынды автотесттер үшін негізді оңтайландыру соншалықты қиын емес болып шықты. Қияр 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 ГБ жедел жады, 24 ағын)

Артықшылықтары:

  • ресурстарды аз тұтыну;
  • қиярдан туған қолдау - қосымша құралдар қажет емес;
  • бір процессор өзегі үшін 6-дан астам ағынды іске қосу мүмкіндігі.

Кемшіліктері:

  • кодтың көп ағынды орындауды қолдайтынына көз жеткізу керек;
  • кіру шегі артады.

GitLab беттеріндегі Allure есептері

Көп ағынды орындауды енгізгеннен кейін біз есептерді талдауға көбірек уақыт бөле бастадық. Ол кезде біз әр есепті 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 минутта орындалады. Бұл олардан жылдам кері байланыс алуға, қажет болған жағдайда өзгертулер енгізуге және процедураны қайтадан қайталауға мүмкіндік береді.

Ақпарат көзі: www.habr.com

пікір қалдыру