Tekeleza, kipimo: uzoefu wa kutumia majaribio ya kiotomatiki katika VTB

Mgawanyiko wetu huunda mabomba ya kiotomatiki kwa ajili ya kuzindua matoleo mapya ya programu katika mazingira ya uzalishaji. Bila shaka, hii inahitaji vipimo vya kazi vya kiotomatiki. Chini ya kukata kuna hadithi kuhusu jinsi, kwa kuanzia na majaribio ya uzi mmoja kwenye mashine ya ndani, tulifikia hatua ya majaribio ya kiotomatiki yenye nyuzi nyingi yanayoendeshwa kwenye Selenoid kwenye bomba la ujenzi na ripoti ya Allure kwenye kurasa za GitLab na hatimaye tukapata zana nzuri ya otomatiki. kwamba watu wa baadaye wanaweza kutumia timu.

Tekeleza, kipimo: uzoefu wa kutumia majaribio ya kiotomatiki katika VTB

Tulianzia wapi?

Ili kutekeleza majaribio ya kiotomatiki na kuyaunganisha kwenye bomba, tulihitaji mfumo wa otomatiki ambao unaweza kubadilishwa kwa urahisi ili kukidhi mahitaji yetu. Kwa kweli, nilitaka kupata kiwango kimoja cha injini ya kujiendesha, iliyorekebishwa kwa kupachika majaribio ya kiotomatiki kwenye bomba. Kwa utekelezaji, tulichagua teknolojia zifuatazo:

  • Java,
  • Maven,
  • Selenium,
  • Tango+JUNIT 4,
  • Kuvutia,
  • gitlab.

Tekeleza, kipimo: uzoefu wa kutumia majaribio ya kiotomatiki katika VTB

Kwa nini seti hii maalum? Java ni mojawapo ya lugha maarufu kwa majaribio ya kiotomatiki, na washiriki wote wa timu huizungumza. Selenium ni suluhisho dhahiri. Tango, kati ya mambo mengine, ilitakiwa kuongeza imani katika matokeo ya vipimo vya automatiska kwa upande wa idara zinazohusika na upimaji wa mwongozo.

Majaribio yenye thread moja

Ili kutoanzisha tena gurudumu, tulichukua maendeleo kutoka kwa hazina mbalimbali kwenye GitHub kama msingi wa mfumo na tukajirekebisha kwa ajili yetu. Tuliunda hazina ya maktaba kuu yenye msingi wa mfumo wa otomatiki na hazina yenye mfano wa Dhahabu wa kutekeleza majaribio ya kiotomatiki kwenye msingi wetu. Kila timu ilibidi kuchukua picha ya Dhahabu na kukuza majaribio ndani yake, kuirekebisha kwa mradi wao. Tuliipeleka kwa benki ya GitLab-CI, ambayo tuliisanidi:

  • utekelezaji wa kila siku wa majaribio yote ya maandishi kwa kila mradi;
  • inazindua katika bomba la ujenzi.

Mwanzoni kulikuwa na majaribio machache, na yalifanywa kwa mkondo mmoja. Uendeshaji wa nyuzi moja kwenye kiendesha Windows GitLab ulitufaa kabisa: majaribio yalipakia benchi ya majaribio kwa urahisi sana na haikutumia rasilimali yoyote.

Baada ya muda, idadi ya majaribio ya kiotomatiki iliongezeka zaidi na zaidi, na tulifikiria juu ya kuziendesha kwa usawa, wakati kukimbia kamili kulianza kuchukua kama masaa matatu. Shida zingine pia zilionekana:

  • hatukuweza kuthibitisha kuwa vipimo vilikuwa dhabiti;
  • majaribio ambayo yaliendeshwa mara kadhaa mfululizo kwenye mashine ya ndani wakati mwingine yalianguka katika CI.

Mfano wa kusanidi majaribio ya kiotomatiki:

<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>

 Tekeleza, kipimo: uzoefu wa kutumia majaribio ya kiotomatiki katika VTB
Mfano wa ripoti ya kuvutia

 Tekeleza, kipimo: uzoefu wa kutumia majaribio ya kiotomatiki katika VTB
Upakiaji wa kiendeshaji wakati wa majaribio (cores 8, RAM ya GB 8, thread 1)
 
Faida za majaribio ya nyuzi moja:

  • rahisi kuanzisha na kukimbia;
  • uzinduzi katika CI kwa kweli sio tofauti na uzinduzi wa ndani;
  • vipimo haviathiri kila mmoja;
  • mahitaji ya chini kwa rasilimali za wakimbiaji.

Ubaya wa majaribio ya nyuzi moja:

  • kuchukua muda mrefu sana kukamilisha;
  • utulivu wa muda mrefu wa vipimo;
  • matumizi duni ya rasilimali za wakimbiaji, matumizi ya chini sana.

Majaribio kwenye uma za JVM

Kwa kuwa hatukutunza nambari salama ya uzi wakati wa kutekeleza mfumo wa msingi, njia dhahiri zaidi ya kukimbia sambamba ilikuwa. tango-jvm-sambamba-plugin kwa Maven. Programu-jalizi ni rahisi kusanidi, lakini kwa uendeshaji sahihi sambamba, majaribio ya kiotomatiki lazima yaendeshwe katika vivinjari tofauti. Hakuna cha kufanya, ilibidi nitumie Selenoid.

Seva ya Selenoid ilizinduliwa kwenye mashine yenye cores 32 na 24 GB ya RAM. Kikomo kiliwekwa katika vivinjari 48 - nyuzi 1,5 kwa kila msingi na takriban MB 400 za RAM. Matokeo yake, muda wa mtihani ulipunguzwa kutoka saa tatu hadi dakika 40. Kuongeza kasi ya kukimbia kulisaidia kutatua tatizo la uimarishaji: sasa tunaweza kufanya majaribio mapya ya kiotomatiki kwa haraka mara 20-30 hadi tuwe na uhakika kwamba yaliendeshwa kwa uhakika.
Upungufu wa kwanza wa suluhisho ulikuwa utumiaji wa juu wa rasilimali za wakimbiaji na idadi ndogo ya nyuzi zinazofanana: kwenye cores 4 na 8 GB ya RAM, majaribio yaliendeshwa kwa utulivu katika si zaidi ya nyuzi 6. Ubaya wa pili: programu-jalizi hutoa madarasa ya wakimbiaji kwa kila hali, haijalishi ni ngapi kati yao imezinduliwa.

Muhimu! Usipitishe kigezo chenye vitambulisho kwa argLine, kwa mfano, kama hii:

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

Ikiwa utapitisha lebo kwa njia hii, programu-jalizi itazalisha wakimbiaji kwa majaribio yote, ambayo ni, itajaribu kufanya majaribio yote, kuruka mara baada ya uzinduzi na kuunda uma nyingi za JVM.

Ni sawa kurusha kibadilishaji chenye tagi ndani tags katika mipangilio ya programu-jalizi, angalia mfano hapa chini. Mbinu zingine tulizojaribu zina matatizo ya kuunganisha programu-jalizi ya Allure.

Mfano wa muda wa kufanya majaribio 6 mafupi na mipangilio isiyo sahihi:

[INFO] Total time: 03:17 min

Mfano wa muda wa kufanya majaribio ikiwa utahamisha lebo moja kwa moja hadi mvn... –Dcucumber.chaguzi:

[INFO] Total time: 44.467 s

Mfano wa kusanidi majaribio ya kiotomatiki:

<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>

Tekeleza, kipimo: uzoefu wa kutumia majaribio ya kiotomatiki katika VTB
Mfano wa ripoti ya Allure (jaribio lisilo imara zaidi, marudio 4)

Tekeleza, kipimo: uzoefu wa kutumia majaribio ya kiotomatiki katika VTBUpakiaji wa kiendeshaji wakati wa majaribio (cores 8, RAM ya GB 8, nyuzi 12)
 
Faida:

  • usanidi rahisi - unahitaji tu kuongeza programu-jalizi;
  • uwezo wa kufanya wakati huo huo idadi kubwa ya vipimo;
  • kuongeza kasi ya uimarishaji wa mtihani shukrani kwa hatua ya 1. 

Minus:

  • OS/vyombo vingi vinahitajika;
  • matumizi makubwa ya rasilimali kwa kila uma;
  • Programu-jalizi imepitwa na wakati na haitumiki tena. 

Jinsi ya kushinda kutokuwa na utulivu 

Madawati ya majaribio si bora, kama vile majaribio ya kiotomatiki yenyewe. Haishangazi kuwa tuna idadi ya majaribio dhaifu. Alikuja kuwaokoa programu-jalizi ya maven surefire, ambayo nje ya kisanduku inasaidia kuanzisha upya majaribio ambayo hayajafaulu. Unahitaji kusasisha toleo la programu-jalizi hadi angalau 2.21 na uandike mstari mmoja na idadi ya kuanza tena kwenye faili ya pom au uipitishe kama hoja kwa Maven.

Mfano wa kusanidi majaribio ya kiotomatiki:

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

Au wakati wa kuanza: mvn … -Dsurefire.rerunFailingTestsCount=2 …
Kama chaguo, weka chaguzi za Maven kwa hati ya PowerShell (PS1):

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

Faida:

  • hakuna haja ya kupoteza muda kuchambua mtihani usio na uhakika wakati unaanguka;
  • matatizo ya uthabiti wa benchi ya mtihani yanaweza kupunguzwa.

Minus:

  • kasoro za kuelea zinaweza kukosa;
  • muda wa kukimbia unaongezeka.

Vipimo sambamba na maktaba ya tango 4

Idadi ya vipimo ilikua kila siku. Tulifikiria tena juu ya kuharakisha kukimbia. Kwa kuongeza, nilitaka kuunganisha vipimo vingi iwezekanavyo kwenye bomba la mkutano wa maombi. Jambo muhimu lilikuwa kwamba kizazi cha wakimbiaji kilichukua muda mrefu sana wakati wa kukimbia sambamba kwa kutumia programu-jalizi ya Maven.

Wakati huo, Tango 4 ilikuwa tayari imetolewa, kwa hiyo tuliamua kuandika tena kernel kwa toleo hili. Katika maelezo ya kutolewa tuliahidiwa uzinduzi sambamba katika ngazi ya thread. Kinadharia inapaswa kuwa na:

  • kuharakisha kwa kiasi kikubwa uendeshaji wa otomatiki kwa kuongeza idadi ya nyuzi;
  • ondoa upotevu wa muda wa kuzalisha wakimbiaji kwa kila jaribio otomatiki.

Kuboresha mfumo wa majaribio ya otomatiki yenye nyuzi nyingi iligeuka kuwa sio ngumu sana. Tango 4 huendesha kila jaribio la mtu binafsi kwenye uzi uliojitolea kutoka mwanzo hadi mwisho, kwa hivyo baadhi ya vitu vya kawaida tuli vilibadilishwa tu kuwa viwezo vya ThreadLocal. 
Jambo kuu wakati wa kubadilisha kwa kutumia zana za kurekebisha Idea ni kuangalia mahali ambapo utofauti ulilinganishwa (kwa mfano, kuangalia kwa null). Kwa kuongeza, unahitaji kuongeza programu-jalizi ya Allure kwenye ufafanuzi wa darasa la Junit Runner.

Mfano wa kusanidi majaribio ya kiotomatiki:

 
<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>

Tekeleza, kipimo: uzoefu wa kutumia majaribio ya kiotomatiki katika VTBMfano wa ripoti ya Allure (jaribio lisilo imara zaidi, marudio 5)

Tekeleza, kipimo: uzoefu wa kutumia majaribio ya kiotomatiki katika VTBUpakiaji wa kikimbiaji wakati wa majaribio (cores 8, RAM ya GB 8, nyuzi 24)

Faida:

  • matumizi ya chini ya rasilimali;
  • msaada wa asili kutoka kwa Tango - hakuna zana za ziada zinazohitajika;
  • uwezo wa kuendesha nyuzi zaidi ya 6 kwa msingi wa processor.

Minus:

  • unahitaji kuhakikisha kuwa nambari inasaidia utekelezaji wa nyuzi nyingi;
  • kizingiti cha kuingia kinaongezeka.

Ripoti za kuvutia kwenye kurasa za GitLab

Baada ya kuanzisha utekelezaji wa nyuzi nyingi, tulianza kutumia wakati mwingi kuchambua ripoti. Wakati huo, ilitubidi kupakia kila ripoti kama vizalia vya programu kwa GitLab, kisha kuipakua na kuifungua. Sio rahisi sana na inachukua muda mrefu. Na ikiwa mtu mwingine anataka kujionea ripoti, basi atahitaji kufanya shughuli sawa. Tulitaka kupokea maoni haraka, na tulipata suluhisho - kurasa za GitLab. Hiki ni kipengele kilichojengewa ndani ambacho kinapatikana nje ya kisanduku katika matoleo yote ya hivi majuzi ya GitLab. Hukuruhusu kupeleka tovuti tuli kwenye seva yako na kuzifikia kupitia kiungo cha moja kwa moja.

Picha zote za skrini za ripoti za Allure zilichukuliwa kwenye kurasa za GitLab. Hati ya kupeleka ripoti kwa kurasa za GitLab - katika Windows PowerShell (kabla ya hii unahitaji kufanya majaribio otomatiki):

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

Matokeo ni nini 

Kwa hivyo, ikiwa unafikiria ikiwa unahitaji nambari salama ya Thread kwenye mfumo wa otomatiki wa tango, sasa jibu ni dhahiri - na Tango 4 ni rahisi kuitekeleza, na hivyo kuongeza kwa kiasi kikubwa idadi ya nyuzi zilizozinduliwa wakati huo huo. Kwa njia hii ya kufanya majaribio, swali sasa linakuwa juu ya utendaji wa mashine na Selenoid na benchi ya majaribio.

Mazoezi yameonyesha kuwa kufanya majaribio ya kiotomatiki kwenye nyuzi hukuruhusu kupunguza matumizi ya rasilimali kwa kiwango cha chini kwa utendakazi bora. Kama inavyoweza kuonekana kutoka kwa grafu, nyuzi mara mbili haziongoi kuongeza kasi sawa katika majaribio ya utendaji. Hata hivyo, tuliweza kuongeza zaidi ya majaribio 2 ya kiotomatiki kwenye muundo wa programu, ambayo hata kwa marudio 200 huendeshwa kwa takriban dakika 5. Hii inakuwezesha kupokea maoni ya haraka kutoka kwao, na, ikiwa ni lazima, kufanya mabadiliko na kurudia utaratibu tena.

Chanzo: mapenzi.com

Kuongeza maoni