Hoʻokumu kā mākou māhele i nā pipeline piha piha no ka hoʻokuʻu ʻana i nā mana hou o nā noi i loko o ke kaiapuni hana. ʻOiaʻiʻo, pono kēia i nā hoʻokolohua hana automated. Ma lalo o ka ʻoki ʻana he moʻolelo e pili ana i ka hoʻomaka ʻana me ka hoʻāʻo ʻana i hoʻokahi thread ma kahi mīkini kūloko, ua hele mākou i nā autotests multi-threaded e holo ana ma Selenoid i ka pipeline kūkulu me kahi hōʻike Allure ma nā ʻaoʻao GitLab a loaʻa i kahi hāmeʻa automation maikaʻi loa. Hiki i nā poʻe e hiki mai ana ke hoʻohana i nā hui.
Ma hea mākou i hoʻomaka ai?
No ka hoʻokō ʻana i nā autotests a hoʻohui iā lākou i ka pipeline, pono mākou i kahi ʻōnaehana automation e hiki ke hoʻololi maʻalahi e kūpono i kā mākou pono. Ma ke kūpono, makemake au e kiʻi i hoʻokahi maʻamau no ka ʻenekini autotesting, i hoʻololi ʻia no ka hoʻokomo ʻana i nā autotests i loko o ka pipeline. No ka hoʻokō, ua koho mākou i nā ʻenehana penei:
- Iava,
- Maven,
- Selenium,
- Kukama+JUNIT 4,
- Hoʻohiwahiwa,
- ʻO GitLab.
No ke aha kēia hoʻonohonoho kūikawā? ʻO Java kekahi o nā ʻōlelo kaulana loa no nā hoʻāʻo ʻokoʻa, a ʻōlelo nā lālā a pau. ʻO Selenium ka hopena maopopo. ʻO ka kukama, ma waena o nā mea ʻē aʻe, ua manaʻo ʻia e hoʻonui i ka hilinaʻi i nā hopena o nā hoʻokolohua automated ma ka ʻaoʻao o nā keʻena i komo i ka hoʻāʻo manual.
Nā hoʻāʻo ʻana i hoʻokahi kaula
I ʻole e hana hou i ka huila, ua lawe mākou i nā hoʻomohala mai nā waihona like ʻole ma GitHub i kumu no ka hoʻolālā a hoʻololi iā lākou no mākou iho. Ua hana mākou i kahi waihona no ka waihona nui me ke kumu o ka autotest framework a me kahi waihona me kahi laʻana gula o ka hoʻokō ʻana i nā autotests ma kā mākou kumu. Pono kēlā me kēia hui e lawe i ke kiʻi gula a hoʻomohala i nā hoʻokolohua i loko o ia mea, e hoʻololi iā ia i kā lākou papahana. Hāʻawi mākou iā ia i ka waihona GitLab-CI, kahi a mākou i hoʻonohonoho ai:
- ka holo ʻana i kēlā me kēia lā o nā hōʻike autotest i kākau ʻia no kēlā me kēia papahana;
- hoʻokuʻu ʻia i ka pipeline kūkulu.
I ka wā mua he kakaikahi nā hoʻokolohua, a ua lawe ʻia lākou i hoʻokahi kahawai. Ua kūpono loa ka holo ʻana o ka holo hoʻokahi ma ka GitLab Windows runner iā mākou: ua hoʻouka maʻalahi nā hoʻokolohua i ka papa hoʻāʻo a hoʻohana ʻole i nā kumuwaiwai.
I ka wā lōʻihi, ua ʻoi aku ka nui o nā autotests, a noʻonoʻo mākou e holo like me lākou, i ka wā i hoʻomaka ai ka holo holoʻokoʻa ma kahi o ʻekolu hola. Ua ʻike ʻia nā pilikia ʻē aʻe:
- ʻAʻole hiki iā mākou ke hōʻoia i ka paʻa o nā hoʻokolohua;
- ʻO nā hoʻokolohua i hana ʻia i nā manawa he nui i ka lālani ma ka mīkini kūloko i kekahi manawa i hāʻule i CI.
Ka laʻana o ka hoʻonohonoho ʻana i nā hoʻāʻo auto:
<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>
Hōʻike hōʻike hoʻohālike
Hoʻouka ka mea holo i ka wā o nā hoʻokolohua (8 cores, 8 GB RAM, 1 thread)
ʻO nā mea maikaʻi o nā ho'āʻo hoʻokahi-threaded:
- maʻalahi e hoʻonohonoho a holo;
- ʻAʻole ʻokoʻa ka hoʻokuʻu ʻana ma CI mai nā hoʻokuʻu kūloko;
- ʻaʻole pili nā hoʻokolohua kekahi i kekahi;
- nā koi liʻiliʻi no nā kumuwaiwai runner.
ʻO nā hemahema o nā hoʻokolohua hoʻokahi-threaded:
- lōʻihi loa ka hoʻopau ʻana;
- hoʻopaʻa lōʻihi o nā hoʻokolohua;
- ka hoʻohana pono ʻole ʻana i nā kumuwaiwai runner, haʻahaʻa loa ka hoʻohana ʻana.
ʻO nā hoʻāʻo ʻana ma nā ʻōpala JVM
No ka mea ʻaʻole mākou i mālama i ka code-safe code i ka wā e hoʻokō ai i ke kahua kumu, ʻo ke ala maopopo loa e holo like ai.
Ua hoʻokuʻu ʻia ka server Selenoid ma kahi mīkini me 32 cores a me 24 GB o RAM. Ua hoʻonoho ʻia ka palena ma 48 mau mākaʻikaʻi - 1,5 mau kaula i kēlā me kēia kumu a ma kahi o 400 MB o RAM. ʻO ka hopena, ua hoʻemi ʻia ka manawa hoʻāʻo mai ʻekolu hola i 40 mau minuke. ʻO ka wikiwiki ʻana i nā holo i kōkua i ka hoʻoponopono ʻana i ka pilikia hoʻokūpaʻa: i kēia manawa hiki iā mākou ke holo wikiwiki i nā hoʻokolohua hou hou 20-30 mau manawa a maopopo iā mākou ua holo pono lākou.
ʻO ka drawback mua o ka hopena ʻo ka hoʻohana kiʻekiʻe o nā kumuwaiwai runner me kahi helu liʻiliʻi o nā kaula like ʻole: ma 4 cores a me 8 GB o RAM, holo paʻa nā hoʻokolohua ma mua o 6 mau kaula. ʻO ka lua o ka hemahema: hoʻopuka ka plugin i nā papa kukini no kēlā me kēia hiʻohiʻona, ʻaʻohe mea e hoʻomaka ai ka nui o lākou.
Mea nui! Mai hāʻawi i kahi hoʻololi me nā hōʻailona i argLine, no ka laʻana, penei:
<argLine>-Dcucumber.options="--tags ${TAGS} --plugin io.qameta.allure.cucumber2jvm.AllureCucumber2Jvm --plugin pretty"</argLine>
…
Mvn –DTAGS="@smoke"
Inā hāʻawi ʻoe i ka hōʻailona ma kēia ʻano, e hoʻopuka ka plugin i nā mea holo no nā hoʻokolohua āpau, ʻo ia hoʻi, e hoʻāʻo e holo i nā hoʻokolohua āpau, e lele koke iā lākou ma hope o ka hoʻomaka ʻana a me ka hana ʻana i nā ʻāpana JVM he nui.
Pono e hoʻolei i kahi hoʻololi me kahi hōʻailona i loko Tags i nā hoʻonohonoho plugin, e ʻike i ka laʻana ma lalo nei. Loaʻa nā pilikia ʻē aʻe a mākou i hoʻāʻo ai i ka hoʻopili ʻana i ka plugin Allure.
Ka laʻana o ka manawa holo no nā hoʻokolohua pōkole 6 me nā hoʻonohonoho hewa:
[INFO] Total time: 03:17 min
Ka laʻana o ka manawa hoʻāʻo inā hoʻololi pololei ʻoe i ka hōʻailona i mvn... –Dcucumber.options:
[INFO] Total time: 44.467 s
Ka laʻana o ka hoʻonohonoho ʻana i nā hoʻāʻo auto:
<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>
Ka laʻana o kahi hōʻike Allure (ka hoʻāʻo paʻa ʻole, 4 mau hoʻoiho)
Hoʻouka ka mea holo i ka wā o nā hoʻokolohua (8 cores, 8 GB RAM, 12 threads)
Kākoʻo:
- hoʻonohonoho maʻalahi - pono ʻoe e hoʻohui i kahi plugin;
- ka hiki ke hana i ka nui o nā ho'āʻo i ka manawa like;
- ka wikiwiki o ka hoʻokūpaʻa hoʻāʻo e hoʻomaikaʻi i ka pae 1.
ʻAla:
- Pono nā OS / pahu he nui;
- ka hoʻohana waiwai nui no kēlā me kēia ʻōpala;
- ʻAʻole i kākoʻo hou ʻia ka plugin.
Pehea e lanakila ai i ka noho ʻole
ʻAʻole kūpono nā papa hoʻāʻo, e like me nā hoʻāʻo ʻana iā lākou iho. ʻAʻole ia he mea kupanaha no ka loaʻa ʻana o nā hoʻokolohua flacky. Hele mai e hoʻopakele
Ka laʻana o ka hoʻonohonoho ʻana i nā hoʻāʻo auto:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
….
<rerunFailingTestsCount>2</rerunFailingTestsCount>
….
</configuration>
</plugin>
A i ʻole ma ka hoʻomaka ʻana: mvn … -Dsurefire.rerunFailingTestsCount=2 …
Ma ke ʻano he koho, hoʻonoho i nā koho Maven no ka palapala PowerShell (PS1):
Set-Item Env:MAVEN_OPTS "-Dfile.encoding=UTF-8 -Dsurefire.rerunFailingTestsCount=2"
Kākoʻo:
- ʻAʻole pono e hoʻonele i ka manawa no ka nānā ʻana i kahi hoʻokolohua paʻa ʻole ke hāʻule;
- Hiki ke hoʻemi ʻia nā pilikia paʻa o ka papa hoʻāʻo.
ʻAla:
- hiki ke nalo i na hemahema e lana ana;
- piʻi ka manawa holo.
Nā hoʻāʻo like ʻana me ka waihona ʻo Cucumber 4
Ua ulu ka nui o nā ho'āʻo i kēlā me kēia lā. Ua noʻonoʻo hou mākou i ka wikiwiki ʻana i nā holo. Eia hou, makemake au e hoʻohui i nā hoʻokolohua he nui i hiki i ka pipeline hui noi. ʻO ke kumu koʻikoʻi ʻo ia ka lōʻihi o ka hana ʻana o nā mea holo i ka wā e holo like ai me ka hoʻohana ʻana i ka plugin Maven.
I kēlā manawa, ua hoʻokuʻu ʻia ʻo Cucumber 4, no laila ua hoʻoholo mākou e kākau hou i ka kernel no kēia mana. Ma nā memo hoʻokuʻu, ua hoʻohiki ʻia mākou e hoʻomaka i ka pae pae. ʻO ka manaʻo pono kēia:
- e wikiwiki loa i ka holo ʻana o nā autotests ma ka hoʻonui ʻana i ka nui o nā kaula;
- hoʻopau i ka nalowale o ka manawa ma ka hana ʻana i nā mea holo no kēlā me kēia autotest.
ʻAʻole paʻakikī loa ka hoʻonui ʻana i ke kāʻei no nā autotests multi-threaded. Hoʻohana ʻo Cucumber 4 i kēlā me kēia hoʻāʻo ʻana ma kahi pae i hoʻolaʻa ʻia mai ka hoʻomaka ʻana a hiki i ka pau ʻana, no laila ua hoʻololi wale ʻia kekahi mau mea static maʻamau i ThreadLocal variables.
ʻO ka mea nui i ka wā e hoʻololi ai me ka hoʻohana ʻana i nā mea hana manaʻo Idea refactoring e nānā i nā wahi i hoʻohālikelike ʻia ai ka loli (no ka laʻana, nānā no ka null). Eia hou, pono ʻoe e hoʻohui i ka plugin Allure i ka hōʻike papa Junit Runner.
Ka laʻana o ka hoʻonohonoho ʻana i nā hoʻāʻo auto:
<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>
Ka laʻana o kahi hōʻike Allure (ka hoʻāʻo paʻa ʻole, 5 mau hoʻoiho)
Hoʻouka ka mea holo i ka wā o nā hoʻokolohua (8 cores, 8 GB RAM, 24 mau kaula)
Kākoʻo:
- haʻahaʻa hoʻohana waiwai;
- kākoʻo maoli mai Kukama - ʻaʻohe mea hana hou e pono ai;
- ka hiki ke holo ma mua o 6 mau kaula no kēlā me kēia kaʻina hana.
ʻAla:
- pono ʻoe e hōʻoia e kākoʻo ke code i ka hoʻokō multi-threaded;
- piʻi ka paepae komo.
Hōʻike ʻo Allure ma nā ʻaoʻao GitLab
Ma hope o ka hoʻokomo ʻana i ka hoʻokō multi-threaded, hoʻomaka mākou e hoʻolilo i ka manawa hou aku i ka nānā ʻana i nā hōʻike. I kēlā manawa, pono mākou e hoʻouka i kēlā me kēia hōʻike ma ke ʻano he kiʻi kiʻi iā GitLab, a laila hoʻoiho a wehe iā ia. ʻAʻole maʻalahi a lōʻihi ka manawa. A inā makemake kekahi e nānā i ka hōʻike no lākou iho, pono lākou e hana i nā hana like. Makemake mākou e loaʻa wikiwiki nā manaʻo, a loaʻa iā mākou kahi hopena - nā ʻaoʻao GitLab. ʻO kēia kahi hiʻohiʻona i kūkulu ʻia i loaʻa ma waho o ka pahu i nā mana hou o GitLab. Hāʻawi iā ʻoe e kau i nā pūnaewele static ma kāu kikowaena a komo iā lākou ma o kahi loulou pololei.
Ua lawe ʻia nā kiʻi paʻi āpau o nā hōʻike Allure ma nā ʻaoʻao GitLab. Palapala no ka lawe ʻana i ka hōʻike i nā ʻaoʻao GitLab - ma Windows PowerShell (ma mua o kēia pono ʻoe e holo i nā autotests):
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
ʻO ka hopena
No laila, inā ʻoe e noʻonoʻo nei inā pono ʻoe i ke code palekana Thread i ka ʻōnaehana autotest Cucumber, i kēia manawa ua ʻike ʻia ka pane - me ka Cucumber 4 he maʻalahi ke hoʻokō, a laila e hoʻonui nui i ka helu o nā kaula i hoʻokuʻu ʻia i ka manawa like. Me kēia ʻano o ka holo ʻana i nā hoʻokolohua, lilo ka nīnau e pili ana i ka hana o ka mīkini me Selenoid a me ka papa hoʻāʻo.
Ua hōʻike ka hoʻomaʻamaʻa ʻana i ka holo ʻana i nā autotests ma nā pae e hiki ai iā ʻoe ke hōʻemi i ka hoʻohana waiwai i ka liʻiliʻi me ka hana maikaʻi loa. E like me ka mea i ʻike ʻia mai nā kiʻi, ʻaʻole alakaʻi i nā kaula pālua i ka wikiwiki like i nā hoʻokolohua hana. Eia nō naʻe, ua hiki iā mākou ke hoʻohui i nā hoʻāʻo automated ʻoi aku ma mua o 2 i ka hana noi, ʻoiai me 200 reruns e holo ma kahi o 5 mau minuke. Hiki iā ʻoe ke loaʻa nā manaʻo wikiwiki mai lākou, a, inā pono, e hoʻololi a hana hou i ke kaʻina hana.
Source: www.habr.com