Nerapkeun, skala: pangalaman ngagunakeun tés otomatis di VTB

Divisi kami nyiptakeun saluran pipa otomatis pikeun ngaluncurkeun vérsi anyar aplikasi kana lingkungan produksi. Tangtosna, ieu peryogi tés fungsional otomatis. Di handap potongan aya carita ngeunaan kumaha, dimimitian ku nguji single-thread dina mesin lokal, urang ngahontal titik multi-threaded autotest ngajalankeun on Selenoid dina pipa ngawangun kalawan laporan Allure dina kaca GitLab sarta ahirna meunang alat automation tiis. yén jalma kahareup bisa ngagunakeun tim.

Nerapkeun, skala: pangalaman ngagunakeun tés otomatis di VTB

Dimana urang ngamimitian?

Pikeun nerapkeun autotes sareng ngahijikeun kana pipa, kami peryogi kerangka otomatisasi anu tiasa dirobih sacara fleksibel pikeun nyocogkeun ka kabutuhan urang. Ideally, kuring hayang meunang standar tunggal pikeun mesin autotesting, diadaptasi pikeun embedding autotests kana pipa nu. Pikeun palaksanaan kami milih téknologi handap:

  • Jawa,
  • Maven,
  • selenium,
  • Bonténg+JUNIT 4,
  • Pikat,
  • GitLab.

Nerapkeun, skala: pangalaman ngagunakeun tés otomatis di VTB

Naha set husus ieu? Java mangrupikeun salah sahiji basa anu pang populerna pikeun tés otomatis, sareng sadaya anggota tim nyarioskeunana. Selenium mangrupikeun solusi anu jelas. Bonténg, antara séjén, ieu sakuduna dituju pikeun ngaronjatkeun kapercayaan dina hasil tés otomatis dina bagian tina departemén aub dina nguji manual.

tés threaded tunggal

Dina raraga teu reinvent kabayang, urang nyandak kamajuan ti sagala rupa repositories on GitHub salaku dadasar pikeun kerangka sarta diadaptasi aranjeunna keur diri urang sorangan. Kami nyiptakeun gudang pikeun perpustakaan utama kalayan inti kerangka autotest sareng gudang kalayan conto Emas ngalaksanakeun autotest dina inti kami. Masing-masing tim kedah nyandak gambar Emas sareng ngamekarkeun tés di jerona, nyaluyukeun kana proyékna. Kami nyebarkeun GitLab-CI di bank, dimana kami ngonpigurasi:

  • ngajalankeun poean sadaya autotests ditulis pikeun tiap proyék;
  • ngajalankeun dina pipa ngawangun.

Mimitina aya sababaraha tés, sareng aranjeunna dilaksanakeun dina hiji aliran. Ngajalankeun single-threaded dina Windows runner GitLab cocog pisan pikeun kami: tés dimuat dina bangku tés enteng pisan sareng ampir henteu nganggo sumber daya.

Kana waktu, jumlah autotests jadi beuki loba, sarta kami pikir ngeunaan ngajalankeun aranjeunna dina paralel, nalika ngajalankeun pinuh mimiti nyandak ngeunaan tilu jam. Masalah sanésna ogé muncul:

  • urang teu bisa pariksa yen tés éta stabil;
  • tés anu dijalankeun sababaraha kali dina urutan dina mesin lokal kadang nabrak di CI.

Conto nyetel autotests:

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

 Nerapkeun, skala: pangalaman ngagunakeun tés otomatis di VTB
conto laporan mikat

 Nerapkeun, skala: pangalaman ngagunakeun tés otomatis di VTB
Beban runner salila tés (8 cores, 8 GB RAM, 1 thread)
 
Kaunggulan tina tés single-threaded:

  • gampang pikeun nyetél tur ngajalankeun;
  • peluncuran di CI praktis henteu béda ti peluncuran lokal;
  • tés teu mangaruhan silih;
  • syarat minimum pikeun sumber runner.

Kelemahan tes single-threaded:

  • butuh waktu anu pohara lila pikeun réngsé;
  • stabilisasi panjang tina tés;
  • pamakéan teu efisien sumberdaya runner, utilization pisan low.

Tés dina garpu JVM

Kusabab urang henteu ngurus kode anu aman-aman nalika nerapkeun kerangka dasar, cara anu paling atra pikeun ngajalankeun paralel nyaéta bonténg-jvm-paralel-plugin pikeun Maven. Plugin gampang dikonpigurasikeun, tapi pikeun operasi paralel anu leres, tés otomatis kedah dijalankeun dina panyungsi anu misah. Henteu aya anu kedah dilakukeun, kuring kedah nganggo Selenoid.

server Selenoid diawalan dina mesin kalawan 32 cores na 24 GB RAM. Watesanna disetél dina 48 browser - 1,5 benang per inti sareng kira-kira 400 MB RAM. Hasilna, waktos tés dikirangan tina tilu jam janten 40 menit. Ngagancangkeun lari mantuan ngarengsekeun masalah stabilisasi: ayeuna urang bisa gancang ngajalankeun autotests anyar 20-30 kali nepi ka kami yakin yén maranéhna ngajalankeun reliably.
The aral munggaran solusi éta utilization tinggi sumberdaya runner kalawan sajumlah leutik threads paralel: dina 4 cores na 8 GB RAM, tés digawé stably kalawan henteu leuwih ti 6 threads. The disadvantage kadua: plugin nu dibangkitkeun kelas runner pikeun tiap skenario, euweuh urusan sabaraha di antarana dibuka.

Penting! Ulah lulus variabel kalawan tag ka argLine, contona, saperti kieu:

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

Upami anjeun lulus tag ku cara ieu, plugin bakal ngahasilkeun runners pikeun sadaya tés, nyaéta, éta bakal nyobian ngajalankeun sadaya tés, ngaluncurkeunana langsung saatos peluncuran sareng nyiptakeun seueur garpu JVM.

Ieu bener buang variabel kalawan tag kana tags dina setélan plugin, tingali conto di handap. Métode séjén anu kami uji ngagaduhan masalah dina nyambungkeun plugin Allure.

Conto waktos ngajalankeun pikeun 6 tés pondok sareng setélan anu salah:

[INFO] Total time: 03:17 min

Conto waktos uji coba upami anjeun langsung mindahkeun tag ka mvn... –Dcucumber.options:

[INFO] Total time: 44.467 s

Conto nyetel autotests:

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

Nerapkeun, skala: pangalaman ngagunakeun tés otomatis di VTB
Conto laporan Allure (uji anu paling teu stabil, 4 ulangan)

Nerapkeun, skala: pangalaman ngagunakeun tés otomatis di VTBBeban runner salila tés (8 cores, 8 GB RAM, 12 threads)
 
pro:

  • pangaturan gampang - anjeun ngan ukur kedah nambihan plugin;
  • kamampuhan pikeun sakaligus ngalakukeun sajumlah ageung tés;
  • akselerasi stabilisasi tés berkat léngkah 1. 

kontra:

  • Sababaraha OS / wadahna diperlukeun;
  • konsumsi sumberdaya tinggi pikeun tiap garpu;
  • plugin nu geus tinggaleun jaman jeung euweuh dirojong. 

Kumaha carana nungkulan instability 

Bangku tés henteu idéal, sapertos autotests sorangan. Teu heran urang gaduh sababaraha tés flacky. Datang ka nyalametkeun plugin surefire maven, nu out of the box ngarojong balikan deui tes gagal. Anjeun kudu ngamutahirkeun versi plugin mun sahanteuna 2.21 jeung nulis hiji garis kalawan jumlah restarts dina file pom atawa lulus eta salaku argumen pikeun Maven.

Conto nyetel autotests:

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

Atawa dina ngamimitian: mvn … -Dsurefire.rerunFailingTestsCount=2 …
Salaku pilihan, setel pilihan Maven pikeun skrip PowerShell (PS1):

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

pro:

  • teu kedah miceunan waktos nganalisa tés anu teu stabil nalika nabrak;
  • masalah stabilitas bangku test bisa mitigated.

kontra:

  • defects ngambang bisa lasut;
  • waktos ngajalankeun nambahan.

tés paralel jeung bonténg 4 perpustakaan

Jumlah tés naék unggal dinten. Urang deui mikir ngeunaan ngagancangkeun ngajalankeun. Sajaba ti éta, kuring hayang ngahijikeun saloba tés mungkin kana pipa assembly aplikasi. Faktor kritis éta yén generasi runners nyandak panjang teuing nalika ngajalankeun di paralel ngagunakeun plugin Maven.

Dina waktos éta, Timun 4 parantos dileupaskeun, janten kami mutuskeun pikeun nyerat deui kernel pikeun versi ieu. Dina catetan pelepasan kami dijanjikeun peluncuran paralel dina tingkat benang. Sacara téoritis ieu kedahna:

  • nyata nyepetkeun ngajalankeun autotests ku cara ningkatkeun jumlah threads;
  • ngaleungitkeun leungitna waktu dina ngahasilkeun runners pikeun tiap autotest.

Ngaoptimalkeun kerangka pikeun autotes multi-threaded tétéla henteu sesah. Timun 4 ngajalankeun unggal test individu dina thread dedicated ti mimiti nepi ka rengse, jadi sababaraha hal statik umum ngan saukur dirobah jadi variabel ThreadLocal. 
Hal utama nalika ngarobah ngagunakeun parabot refactoring Gagasan nyaéta mariksa tempat dimana variabel ieu dibandingkeun (contona, mariksa null). Salaku tambahan, anjeun kedah nambihan plugin Allure kana annotation kelas Junit Runner.

Conto nyetel autotests:

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

Nerapkeun, skala: pangalaman ngagunakeun tés otomatis di VTBConto laporan Allure (tés anu paling teu stabil, 5 ulangan)

Nerapkeun, skala: pangalaman ngagunakeun tés otomatis di VTBBeban runner salila tés (8 cores, 8 GB RAM, 24 threads)

pro:

  • konsumsi sumberdaya low;
  • rojongan pituin ti Bonténg - euweuh parabot tambahan diperlukeun;
  • kamampuhan pikeun ngajalankeun leuwih ti 6 threads per core processor.

kontra:

  • Anjeun kudu mastikeun yén kode ngarojong palaksanaan multi-threaded;
  • bangbarung Éntri naek.

Laporan mikat dina halaman GitLab

Saatos ngenalkeun palaksanaan multi-threaded, urang mimiti nyéépkeun waktos langkung seueur pikeun nganalisis laporan. Dina waktos éta, urang kedah unggah unggal laporan salaku artefak ka GitLab, teras unduh sareng ngabongkar. Ieu teu pisan merenah tur butuh waktu lila. Sareng upami batur hoyong ningali laporan éta nyalira, maka aranjeunna kedah ngalakukeun operasi anu sami. Kami hoyong nampi tanggapan langkung gancang, sareng kami mendakan solusi - halaman GitLab. Ieu mangrupikeun fitur anu diwangun anu sayogi di luar kotak dina sadaya vérsi GitLab énggal. Ngidinan anjeun nyebarkeun situs statik dina pangladén anjeun sareng ngaksésna liwat tautan langsung.

Sadaya Potret layar laporan Allure dicandak dina halaman GitLab. Skrip pikeun nyebarkeun laporan ka halaman GitLab - dina Windows PowerShell (saméméh ieu anjeun kedah ngajalankeun autotes):

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

Kalawan hasil nu 

Janten, upami anjeun mikir naha anjeun peryogi kode aman Thread dina kerangka autotest Cucumber, ayeuna jawabanna écés - sareng Timun 4 éta gampang pikeun nerapkeunana, ku kituna sacara signifikan ningkatkeun jumlah benang anu diluncurkeun sakaligus. Kalayan metodeu ieu ngajalankeun tés, patarosan ayeuna janten ngeunaan kinerja mesin sareng Selenoid sareng bangku tés.

Prakték parantos nunjukkeun yén ngajalankeun autotes dina benang ngamungkinkeun anjeun ngirangan konsumsi sumberdaya ka minimum kalayan kinerja anu pangsaéna. Salaku bisa ditempo ti grafik, duka kali threads teu ngakibatkeun hiji akselerasi sarupa dina tés kinerja. Najan kitu, urang bisa nambahkeun leuwih ti 2 tés otomatis kana ngawangun aplikasi, nu sanajan kalawan 200 reruns ngajalankeun dina ngeunaan 5 menit. Ieu ngidinan Anjeun pikeun nampa eupan balik gancang ti aranjeunna, sarta, lamun perlu, nyieun parobahan sarta ngulang prosedur deui.

sumber: www.habr.com

Tambahkeun komentar