Implimenta, skala: esperjenza ta 'użu ta' testijiet awtomatizzati fil-VTB

Id-diviżjoni tagħna toħloq pipelines kompletament awtomatiċi għat-tnedija ta 'verżjonijiet ġodda ta' applikazzjonijiet fl-ambjent tal-produzzjoni. Naturalment, dan jeħtieġ testijiet funzjonali awtomatizzati. Taħt il-qatgħa hemm storja dwar kif, ibda bl-ittestjar b'ħajt wieħed fuq magna lokali, wasalna l-punt ta 'awtotest b'ħafna ħajt li jaħdem fuq Selenoid fil-pipeline tal-bini b'rapport Allure fuq paġni GitLab u eventwalment ltqajna għodda ta' awtomazzjoni friska li n-nies futuri jistgħu jużaw timijiet.

Implimenta, skala: esperjenza ta 'użu ta' testijiet awtomatizzati fil-VTB

Minn fejn bdejna?

Biex nimplimentaw l-awtotests u nintegrawhom fil-pipeline, kellna bżonn qafas ta 'awtomazzjoni li jista' jinbidel b'mod flessibbli biex jaqbel mal-bżonnijiet tagħna. Idealment, ridt nikseb standard wieħed għall-magna tal-awtotestjar, adattat għall-inkorporazzjoni tal-awtotests fil-pipeline. Għall-implimentazzjoni għażilna t-teknoloġiji li ġejjin:

  • Java,
  • Maven,
  • Selenju,
  • Ħjar+ĠUNITA 4,
  • Allure,
  • GitLab.

Implimenta, skala: esperjenza ta 'użu ta' testijiet awtomatizzati fil-VTB

Għaliex dan is-sett partikolari? Java hija waħda mill-lingwi l-aktar popolari għal testijiet awtomatizzati, u l-membri kollha tat-tim jitkellmuha. Is-selenju huwa s-soluzzjoni ovvja. Il-ħjar, fost affarijiet oħra, kellu jżid il-fiduċja fir-riżultati tat-testijiet awtomatizzati min-naħa tad-dipartimenti involuti fl-ittestjar manwali.

Testijiet b'kamin wieħed

Sabiex ma nivvintax mill-ġdid ir-rota, ħadna żviluppi minn diversi repożitorji fuq GitHub bħala l-bażi għall-qafas u adattajnahom għalina. Ħloqna repożitorju għal-librerija ewlenija bil-qalba tal-qafas tal-awtotest u repożitorju b'eżempju Gold tal-implimentazzjoni tal-awtotests fuq il-qalba tagħna. Kull tim kellu jieħu l-immaġni Gold u jiżviluppa testijiet fiha, u jadattaha għall-proġett tagħhom. Aħna skjerajna lill-bank GitLab-CI, li fuqu kkonfigurajna:

  • ġirjiet ta' kuljum tal-awtotests kollha bil-miktub għal kull proġett;
  • tniedi fil-pipeline tal-bini.

Għall-ewwel kien hemm ftit testijiet, u twettqu f'fluss wieħed. It-tħaddim b'ħajt wieħed fuq il-Windows runner GitLab kien adattat għalina pjuttost tajjeb: it-testijiet għabbew il-bank tat-test ħafif ħafna u kważi ma użaw l-ebda riżorsi.

Maż-żmien, in-numru ta 'awtotests sar aktar u aktar numerużi, u ħsibna biex inmexxuhom b'mod parallel, meta ġirja sħiħa bdiet tieħu madwar tliet sigħat. Dehru wkoll problemi oħra:

  • ma stajniex nivverifikaw li t-testijiet kienu stabbli;
  • testijiet li twettqu diversi drabi wara xulxin fuq il-magna lokali kultant ġġarraf f'CI.

Eżempju tat-twaqqif ta' awtotests:

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

 Implimenta, skala: esperjenza ta 'użu ta' testijiet awtomatizzati fil-VTB
Eżempju ta 'rapport Allure

 Implimenta, skala: esperjenza ta 'użu ta' testijiet awtomatizzati fil-VTB
Tagħbija tar-runner waqt it-testijiet (8 cores, 8 GB RAM, ħajta 1)
 
Vantaġġi ta' testijiet b'ħajt wieħed:

  • faċli biex titwaqqaf u titħaddem;
  • tnedijiet fis-CI prattikament mhumiex differenti mit-tnedija lokali;
  • it-testijiet ma jaffettwawx lil xulxin;
  • rekwiżiti minimi għar-riżorsi runner.

Żvantaġġi tat-testijiet b'ħajt wieħed:

  • jieħu żmien twil ħafna biex jitlesta;
  • stabbilizzazzjoni fit-tul tat-testijiet;
  • użu ineffiċjenti tar-riżorsi runner, utilizzazzjoni estremament baxxa.

Testijiet fuq frieket JVM

Peress li ma ħadniex ħsieb il-kodiċi thread-safe meta nimplimentajna l-qafas bażi, l-aktar mod ovvju biex taħdem b'mod parallel kien ħjar-jvm-parallel-plugin għal Maven. Il-plugin huwa faċli biex jiġi kkonfigurat, iżda għal tħaddim parallel korrett, l-awtotests għandhom jitmexxew f'browsers separati. M'hemm xejn x'tagħmel, kelli nuża Selenoid.

Is-server Selenoid tnieda fuq magna b'32 core u 24 GB RAM. Il-limitu ġie stabbilit għal 48 browser - 1,5 threads għal kull qalba u madwar 400 MB RAM. Bħala riżultat, il-ħin tat-test tnaqqas minn tliet sigħat għal 40 minuta. It-tħaffif tal-ġirjiet għen biex issolvi l-problema tal-istabbilizzazzjoni: issa stajna malajr inmexxu awtotestijiet ġodda 20-30 darba sakemm konna ċerti li damu b'mod affidabbli.
L-ewwel żvantaġġ tas-soluzzjoni kien l-użu għoli ta 'riżorsi runner b'numru żgħir ta' ħjut paralleli: fuq 4 cores u 8 GB ta 'RAM, it-testijiet damu b'mod stabbli f'mhux aktar minn 6 ħjut. It-tieni żvantaġġ: il-plugin jiġġenera klassijiet ta 'runner għal kull xenarju, irrispettivament minn kemm huma mnedija.

Importanti! Tgħaddix varjabbli b'tags lil argLine, pereżempju, bħal dan:

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

Jekk tgħaddi t-tikketta b'dan il-mod, il-plugin se jiġġenera runners għat-testijiet kollha, jiġifieri, se jipprova jmexxi t-testijiet kollha, taqbeżhom immedjatament wara t-tnedija u joħloq ħafna frieket JVM.

Huwa korrett li tarmi varjabbli b'tikketta ġo tags fis-settings tal-plugin, ara l-eżempju hawn taħt. Metodi oħra li ttestjajna għandhom problemi biex jgħaqqdu l-plugin Allure.

Eżempju ta' ħin ta' tħaddim għal 6 testijiet qosra b'settings żbaljati:

[INFO] Total time: 03:17 min

Eżempju tal-ħin tat-test jekk tittrasferixxi direttament it-tikketta mvn... –Dcucumber.għażliet:

[INFO] Total time: 44.467 s

Eżempju tat-twaqqif ta' awtotests:

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

Implimenta, skala: esperjenza ta 'użu ta' testijiet awtomatizzati fil-VTB
Eżempju ta' rapport ta' Allure (l-aktar test instabbli, 4 reruns)

Implimenta, skala: esperjenza ta 'użu ta' testijiet awtomatizzati fil-VTBTagħbija tar-runner waqt it-testijiet (8 cores, 8 GB RAM, 12-il ħajta)
 
Pros:

  • setup faċli - għandek bżonn biss li żżid plugin;
  • il-kapaċità li simultanjament twettaq numru kbir ta 'testijiet;
  • aċċelerazzjoni tal-istabbilizzazzjoni tat-test grazzi għall-pass 1. 

Cons:

  • Multipli OS/kontenituri meħtieġa;
  • konsum għoli ta 'riżorsi għal kull furketta;
  • Il-plugin huwa skadut u m'għadux appoġġjat. 

Kif tegħleb l-instabilità 

Il-bankijiet tat-test mhumiex ideali, bħall-awtotests infushom. Mhuwiex sorprendenti li għandna numru ta 'testijiet flacky. Wasal għall-salvataġġ plugin maven surefire, li barra mill-kaxxa jappoġġja l-bidu mill-ġdid tat-testijiet falluti. Għandek bżonn taġġorna l-verżjoni tal-plugin għal mill-inqas 2.21 u tikteb linja waħda bin-numru ta 'startjar mill-ġdid fil-fajl pom jew tgħaddiha bħala argument lil Maven.

Eżempju tat-twaqqif ta' awtotests:

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

Jew mal-istartjar: mvn … -Dsurefire.rerunFailingTestsCount=2 …
Bħala għażla, issettja l-għażliet Maven għall-iskrittura PowerShell (PS1):

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

Pros:

  • l-ebda ħtieġa li taħli ħin tanalizza test instabbli meta jiġġarraf;
  • problemi ta' stabbiltà tal-bank tat-test jistgħu jittaffew.

Cons:

  • difetti f'wiċċ l-ilma jistgħu jintilfu;
  • iżid il-ħin tal-ġirja.

Testijiet paralleli mal-librerija tal-Ħjar 4

In-numru ta 'testijiet kiber kuljum. Erġajna ħsibna biex inħaffu l-ġirjiet. Barra minn hekk, ridt nintegra kemm jista 'jkun testijiet fil-pipeline tal-assemblaġġ tal-applikazzjoni. Il-fattur kritiku kien li l-ġenerazzjoni ta 'runners ħadet wisq żmien meta taħdem b'mod parallel bl-użu tal-plugin Maven.

Dak iż-żmien, il-Ħjar 4 kien diġà ġie rilaxxat, għalhekk iddeċidejna li nerġgħu nikteb il-qalba għal din il-verżjoni. Fin-noti tar-rilaxx konna mwiegħda tnedija parallela fil-livell tal-ħajt. Teoretikament għandu jkollu:

  • tħaffef b'mod sinifikanti t-tmexxija ta 'awtotests billi żżid in-numru ta' ħjut;
  • telimina t-telf ta 'ħin fuq il-ġenerazzjoni ta' runners għal kull autotest.

L-ottimizzazzjoni tal-qafas għal autotests b'ħafna ħajt irriżulta li ma kienx daqshekk diffiċli. Il-ħjar 4 iwettaq kull test individwali fuq ħajt iddedikat mill-bidu sat-tmiem, għalhekk xi affarijiet statiċi komuni ġew sempliċement konvertiti għal varjabbli ThreadLocal. 
Il-ħaġa prinċipali meta tikkonverti bl-użu ta 'għodod ta' refactoring tal-Idea hija li tivverifika l-postijiet fejn il-varjabbli ġiet imqabbla (per eżempju, verifika għal null). Barra minn hekk, trid iżżid il-plugin Allure mal-annotazzjoni tal-klassi Junit Runner.

Eżempju tat-twaqqif ta' awtotests:

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

Implimenta, skala: esperjenza ta 'użu ta' testijiet awtomatizzati fil-VTBEżempju ta' rapport ta' Allure (l-aktar test instabbli, 5 reruns)

Implimenta, skala: esperjenza ta 'użu ta' testijiet awtomatizzati fil-VTBTagħbija tar-runner waqt it-testijiet (8 cores, 8 GB RAM, 24 ħajta)

Pros:

  • konsum baxx tar-riżorsi;
  • appoġġ nattiv mill-Ħjar - l-ebda għodda addizzjonali meħtieġa;
  • l-abbiltà li tmexxi aktar minn 6 ħjut għal kull qalba tal-proċessur.

Cons:

  • għandek bżonn tiżgura li l-kodiċi jappoġġja eżekuzzjoni multi-threaded;
  • il-limitu tad-dħul jiżdied.

Rapporti Allure fuq paġni GitLab

Wara li introduċejna l-eżekuzzjoni multi-threaded, bdejna nqattgħu ħafna aktar ħin biex janalizzaw ir-rapporti. Dak iż-żmien, kellna ntellgħu kull rapport bħala artifact fuq GitLab, imbagħad inniżżlu u nippakkjawh. Mhuwiex konvenjenti ħafna u jieħu ħafna żmien. U jekk xi ħadd ieħor irid jara r-rapport waħdu, allura jeħtieġ li jagħmel l-istess operazzjonijiet. Ridna nirċievu feedback aktar malajr, u sibna soluzzjoni - paġni GitLab. Din hija karatteristika integrata li hija disponibbli barra mill-kaxxa fil-verżjonijiet reċenti kollha ta 'GitLab. Jippermettilek tuża siti statiċi fuq is-server tiegħek u taċċessahom permezz ta' link dirett.

Il-screenshots kollha tar-rapporti Allure ttieħdu fuq il-paġni tal-GitLab. Script għall-iskjerament tar-rapport għall-paġni GitLab - fil-Windows PowerShell (qabel dan għandek bżonn tmexxi awtotests):

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

X'inhu r-riżultat 

Għalhekk, jekk kont qed taħseb dwar jekk għandekx bżonn kodiċi Thread safe fil-qafas tal-awtotest tal-Ħjar, issa t-tweġiba hija ovvja - bil-Ħjar 4 huwa faċli li timplimentah, u b'hekk iżid b'mod sinifikanti n-numru ta 'ħjut imnedija simultanjament. B'dan il-metodu ta 'tmexxija tat-testijiet, il-mistoqsija issa ssir dwar il-prestazzjoni tal-magna b'Selenoid u l-bank tat-test.

Il-prattika wriet li t-tħaddim ta 'awtotests fuq ħjut jippermettilek tnaqqas il-konsum tar-riżorsi għall-minimu bl-aħjar prestazzjoni. Kif jidher mill-graffs, l-irduppjar tal-ħjut ma jwassalx għal aċċelerazzjoni simili fit-testijiet tal-prestazzjoni. Madankollu, stajna nżidu aktar minn 2 test awtomatizzat mal-bini tal-applikazzjoni, li anke b'200 reruns jimxu f'madwar 5 minuta. Dan jippermettilek li tirċievi feedback malajr mingħandhom, u, jekk meħtieġ, tagħmel bidliet u erġa' rrepeti l-proċedura.

Sors: www.habr.com

Żid kumment