Selenium WebDriver: TestNG za upravljanje test slučajevima i generiranje izvješća



Ovaj vodič za Selenium WebDriver pomoći će vam da shvatite potrebu upotrebe TestNG-a s Selenijem za upravljanje test slučajevima i generiranje detaljnih izvještaja o testiranju.

U prethodnom blogu naučio sam vas kako pokrenuti svoj prvi test Selenium WebDriver. Na ovom blogu obrađivat ću napredne koncepte Selenium WebDriver. Već sam nekoliko puta spomenuo da Selenium WebDriver ima ograničenja u pogledu upravljanja test slučajevima i generiranja izvještaja o testiranju. Pa, koja je alternativa? Alat popularan poput selena sigurno mora imati zaobilazno rješenje, zar ne? Naravno da ima! Možemo upotrijebiti kombinaciju selena i TestNG-a da pobijedimo ovo ograničenje i to će biti tema rasprave na ovom blogu.

kako testirati bazu podataka

U slučaju da ste novi selenij i želite uvod u osnovne koncepte, svoje putovanje možete započeti odavde: ? Međutim, ostali mogu započeti s testNG-om za selen s ovog bloga.Također biste trebali znati da organizacije aktivno love profesionalce s , što ga čini važnom vještinom za svladavanje ispitivača softvera.





Programeri softvera iz cijelog svijeta jednoglasno će se složiti da pisanje koda u testnim slučajevima štedi dobar dio njihovog vremena za uklanjanje pogrešaka. Zašto? To je zato što test slučajevi pomažu u stvaranju robusnog koda bez pogrešaka. Kako to čini? Razbijanjem cijelog koda na manje testne slučajeve, a zatim procjenom svakog od ovih testnih slučajeva da li prolazi / ne uspijeva, možemo stvoriti kôd bez pogrešaka. Budući da Selenium ne podržava izvršavanje koda u testnim slučajevima, moramo koristiti TestNG za isti. Tu se TestNG uklapa u okvir Selenium.

TestNG stoji za Testirajte sljedeću generaciju i to je okvir za automatizaciju ispitivanja otvorenog koda nadahnut JUnit-om i NUnit-om. Pa, ne samo nadahnuto, već nadogradnju na ta dva okvira. Možete pitati koja je ovdje nadogradnja?Nadogradnja s TestNG-om je u tome što pruža dodatne funkcije kao što su: testne bilješke, grupiranje, određivanje prioriteta, parametriranje i tehnike sekvenciranja u kodu što ranije nije bilo moguće.



Uz upravljanje test slučajevima, čak i detaljna izvješća o testovima mogu se dobiti pomoću TestNG-a. Bit će sažetak koji prikazuje test slučaja koji nije uspio, zajedno s grupom čiji je dio bio i razredom u koji spada. Kad se programske pogreške mogu točno locirati na ovaj način, mogu se odmah popraviti na olakšanje programera. Slika dolje prikazuje rad TestNG-a.

testng - selenski web pogonitelj

Pa, kako TestNG obavlja posao? Na ovo pitanje odgovorit će se usljedeći odjeljak ovog bloka tutorijala za Selenium WebDriver, gdje ću raspravljati o upravljanju raznim test slučajevima pomoću TestNG-a.



Selen WebDriver s TestNG

Test slučajevi mogu se definirati i njima upravljati na jedan od sljedećih načina:

  1. Test bilješke
  2. Određivanje prioriteta
  3. Onemogućavanje test slučajeva
  4. Ovisnost o metodi
  5. Grupiranje
  6. Tvrdnje
  7. Generiranje izvješća

Da počnem objašnjavatisvaka od ovih funkcionalnosti.

Test bilješke

Prije svega, postavimo si ovo pitanje: Zašto trebamo koristiti bilješke? Kada ih možemo koristiti? Bilješke u seleniju koriste se za kontrolu sljedeće metode koja će se izvršiti. Oznake testa definirane su prije svake metode u testnom kodu. U slučaju da nijedna metoda nema prefiks s napomenama, tada će se ta metoda zanemariti i neće se izvršiti kao dio testnog koda. Da bi ih definirali, metode treba jednostavno označiti s ' @Test ‘. Na primjer, pogledajte donji isječak koda.

paket testng import org.openqa.selenium.WebDriver import org.openqa.selenium.firefox.FirefoxDriver import org.testng.annotations.AfterClass import org.testng.annotations.AfterMethod import org.testng.annotations.BeforeClass import org.testng.annotations .BeforeMethod import org.testng.annotations.Test public class TestAnnotations {@Test public void myTestMethod () {System.out.println ('Inside method: - myTestMethod') WebDriver driver = new FirefoxDriver () driver.get ('http: //www.seleniumframework.com/Practiceform/ ') String title = driver.getTitle () System.out.println (title) driver.quit ()} @BeforeMethod public void beforeMethod () {System.out.println (' This komad koda izvršava se prije metode: - myTestMethod ') System.setProperty (' webdriver.gecko.driver ',' C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe ')} @AfterMethod public void afterMethod () {System.out.println (' Ovaj dio koda izvršava se nakon metode: - myTestMethod ')} @BeforeClass javna praznina prijeClass () {Syste m.out.println ('Ovaj dio koda se izvršava prije izvršavanja klase')} @AfterClass javna praznina afterClass () {System.out.println ('Ovaj dio koda se izvršava nakon izvršavanja klase')} }

U gornjem kodu primijetili biste da nisam definirao ‘glavnu’ metodu. Međutim, definirao sam još 5 metoda. To su 'myTestMethod', 'beforeMethod', 'afterMethod', 'beforeClass' i 'afterClass'. Također, imajte na umu redoslijed definiranja metoda u kodu jer se one neće izvršavati istim tim redoslijedom.

Označena je metoda 'myTestMethod' @Test , a to je glavna metoda ili dio koda koji se mora izvršiti. Ostale anotirane metode izvršit će se prije i nakon izvršavanja ove metode. Budući da je označena oznaka 'beforeMethod' @BeforeMethod , izvršit će se prije izvršavanja 'myTestMethod'. Slično tome, izraz 'afterMethod' označen je s @AfterMethod , i stoga će se izvršiti nakon 'myTestMethod'.

Međutim, označava se s 'beforeClass' @BeforeClass , što znači da će se izvršiti i prije nego što se izvrši sama klasa. Ovdje se zove naš razred Napomene testa , i tako će se prije izvođenja klase izvršiti komad koda unutar 'beforeClass'. Slično tome, 'afterClass' je označen s @AfterMethod , i tako će se izvršiti nakon predavanja Napomene testa izvršava se.

Ako i dalje imate zabune oko redoslijeda izvršenja, isječak u nastavku sigurno će vam pomoći.

1. BeforeSuite 2. BeforeTest 3. BeforeClass 4. BeforeMethod 5. Test 6. AfterMethod 7. AfterClass 8. AfterTest 9. AfterSuite

Rezultat gornjeg koda bit će:

Ovaj dio koda se izvršava prije izvođenja klase Ovaj dio koda se izvršava prije metode: - myTestMethod Inside method: - myTestMethod 1493192682118 geckodriver INFO Slušanje na 127.0.0.1.13676 1493192682713 mozprofile :: profil INFO Korištenje putanje profila C: UsersVardhanAppDataLocalTempfile ust_ .wGkcwvwXkl2y 1493192682729 geckodriver :: marionette INFO Pokretanje preglednika C: Programske datoteke (x86) Mozilla Firefoxirefox.exe 1493192682729 geckodriver :: marionette INFO Povezivanje s Marionetom na localhost-u: 59792 [GPU 6152] error: c: 109 / c /moz2_slave/m-rel-w32-00000000000000000000/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, linija 346 1493192688316 Marionet INFO Slušanje na luci 59792 26. travnja 2017. 13:14:49 org. openqa.selenium.remote.ProtocolHandshake createSession INFO: Otkriven dijalekt: W3C JavaScript pogreška: http://t.dtscout.com/i/?l=http%3A%2F%2Fwww.seleniumframework.com%2FPracticeform%2F&j=, linija 1: Pogreška tipa: document.getElementsByTagNa me (...) [0] je nedefinirani okvir selena | Practiceform 1493192695134 Marionette INFO Nove veze više neće biti prihvaćene 26. travnja 2017. 13:14:57 org.openqa.selenium.os.UnixProcess uništiti TEŠKO: Nije moguće ubiti proces s PID 6724 Ovaj dio koda se izvršava nakon metode: - myTestMethod Ovaj dio koda se izvršava nakon izvršavanja klase PASSED: myTestMethod =================================== ============ Zadani test Pokrenuti testovi: 1, Kvarovi: 0, Preskoči: 0 ======================== ======================== =============================== ==================== Zadani paket Ukupno pokrenutih testova: 1, Kvarovi: 0, Preskoči: 0 =============== ==================================

Kao što možete vidjeti iz gornjeg rezultata, broj izvršenih testova je 1, a neuspjelih 0. To znači da je kôd uspješan. Čak će i redoslijed izvršenja metoda biti u reduJaranije spomenuto.

Kada izvršite ovaj kôd na svom stroju, Selenium WebDriver će instancirati vaš preglednik Firefox, prijeći na obrazac za vježbanje Selenium Framework, zatvoriti instancu preglednika i prikazati isti izlaz kao što je prikazano gore u vašem Eclipse IDE-u.

U svom kodu upotrijebio sam samo 5 različitih napomena. No, postoji mnogo više napomena koje se mogu koristiti za kontrolu sljedeće metode koja se izvršava. Čitav popis bilješki objašnjen je ustolispod:

@BeforeSuite - Metoda označena s @BeforeSuite pokrenut će se prije nego što se pokrenu svi testovi u paketu.

@AfterSuite - Metoda označena s @AfterSuite pokrenut će se nakon izvršavanja svih testova u paketu.

@BeforeTest - Metoda označena s @BeforeTest pokrenut će se prije pokretanja bilo koje metode ispitivanja koja pripada klasi.

@AfterTest - Metoda označena s @AfterTest pokrenut će se nakon izvršavanja svih metoda ispitivanja koje pripadaju klasi.

@BeforeGroup - Metoda označena s @BeforeGroup pokrenut će se prije pokretanja svake grupe.

@AfterGroup - Metoda označena s @AfterGroup pokrenut će se nakon pokretanja svake grupe.

@BeforeClass - Metoda označena s @BeforeClass pokrenut će se jednom prije nego što se pozove prva metoda ispitivanja u trenutnoj klasi.

@Nakon nastave - Metoda označena s @Nakon nastave pokrenut će se jednom nakon izvršavanja svih metoda ispitivanja u trenutnoj klasi.

@BeforeMethod - Metoda označena s @BeforeMethod pokrenut će se prije pokretanja bilo koje metode ispitivanja unutar klase.

@AfterMethod - Metoda označena s @AfterMethod pokrenut će se nakon pokretanja svake metode ispitivanja unutar klase.

@Test - Metoda označena s @Test je glavna metoda ispitivanja u cijelom programu. Druge anotirane metode izvršit će se oko ove metode.

Snimak zaslona izvještaja TestNG jeprisutni u nastavku: -

Određivanje prioriteta

Razgovarali smo o tome kako se različite metode mogu definirati tako da se izvršavaju oko @Test metoda. Ali, što ako ih imate više @Test metodu i želite definirati redoslijed izvršenja između njih?

U tom slučaju možemoStrrioritizirajte ih dodjeljivanjem broja označenim test slučajevima. Manji broj, veći prioritet. Prioritet se može dodijeliti kao parametri tijekom definiranja test slučajeva. Ali, ako nije dodijeljen prioritet, tada će se označene metode ispitivanja izvršiti prema abecednom redoslijedu testova. Pogledajte parametre testnih napomena u donjem dijelukodirati.

@Test (Priority = 2) javna statička void FirstTest () {system.out.println ('Ovo je testni slučaj broj dva zbog prioriteta # 2')} @Test (Priority = 1) javna statička void SecondTest () { system.out.println ('Ovo je testni slučaj broj jedan zbog prioriteta # 1')} @Test javna statička void FinalTest () {system.out.println ('Ovo je završni testni slučaj jer nema prioriteta') )}

Onemogućavanje test slučajeva

Dopustite mi da vam pokažem nešto zanimljivije. Što ako imate kôd koji obuhvaća milijun redaka, a sastoji se od stotina testnih slučajeva, a želite onemogućiti samo jednu testnu metodu? Umjesto toga, ne trebate brisati nijedan dio koda, možemo jednostavno onemogućiti tu metodu ispitivanja.

Čin onemogućavanja test slučaja također se vrši putem parametara. Možemo postaviti omogućeno atribut 'lažno'. Prema zadanim postavkama bit će omogućeni svi testni slučajevi, stoga ih ne trebamo definirati svaki put kad napišemo test. Pogledajte parametre treće i četvrte metode u nastavku tekstakodirati.

@Test (Prioritet = 2, omogućeno = Tačno) javna statička void FirstTest () {system.out.println ('Ovo je testni slučaj broj dva zbog prioriteta # 2')} @Test (Prioritet = 1, omogućen = True ) public static void SecondTest () {system.out.println ('Ovo je testni slučaj broj jedan zbog prioriteta # 1')} @Test (enabled = false) javna statička void SkippedTest () {system.out.println ( 'Ovo je preskočeni test jer je ovo onemogućeno')} @Test (enabled = True) javna statička void FinalTest () {system.out.println ('Ovo je završni test koji je omogućen i nema prioritet ')}

Ovisnost o metodi

Sada u slučaju da imate situaciju u kojoj želite da se dio koda izvrši samo ako zadovoljava uvjet ili samo ako se određena metoda uspješno izvrši, to možemo učiniti pomoću zavisiOnMethod (). To je u osnovi uvjet ovisnosti metode gdje će se metoda izvršiti ovisno o drugoj metodi. Ako dodatno postavimo uvijekRun atribut true, tada će se metoda izvršiti bez obzira na uvjet neuspjeha / prolaska ovisno o metodi. Pogledajte kod u donjem isječku koda.

@Test javna statička void FirstTest () {system.out.println ('Ovo je prvi test slučaj koji je izvršen')} @Test (dependOnMethods = {'FirstTest'}) javna statička void SecondTest () {system.out. println ('Ovo je drugi test slučaj koji se izvršava Ovo je ovisna metoda')} @Test (dependOnMethods = {'SecondTest'}) public static void FinalTest () {system.out.println ('Ovo je završni test Slučaj Ionako će se izvršiti. ')}

Ovo nas vodi do još jednog važnog aspekta u testubilješke koja je Grupiranje .

Grupiranje

Do sada morate znati da će u kodu biti niz metoda kao dio našeg testnog slučaja. Recimo da postoji 100 testnih slučajeva, ali mi želimo izvršiti samo 20 testnih slučajeva u našem sljedećem testu. Mislite li da to možemo? Naravno da možemo.

java koje su varijable instance

Možemo koristiti skupine atribut u tu svrhu. Možemo dodijeliti naziv grupe brojnim testnim slučajevima, a kasnije odabrati izvršenje grupe umjesto cijelog koda. Pogledajte donji isječak koda da biste ga razumjelikako stvoriti grupe.

@Test (groups = {'MyGroup'}) public static void FirstTest () {system.out.println ('Ovo je dio grupe: MyGroup')} @Test (groups = {'MyGroup'})) public static void SecondTest () {system.out.println ('Ovo je također dio grupe: MyGroup')} @Test javna statička void ThirdTest () {system.out.println ('Ali, ovo nije dio Grupa: MyGroup ')}

Tvrdnje TestNG-a

Ovo nas sada vodi do sljedeće teme u TestNG-u, a to su tvrdnje. Kao što i samo ime govori, tvrdnje se mogu koristiti u metodama ispitivanja kako bi se utvrdilo da li je test uspjeh / neuspjeh. Na temelju istinitog / netačnog stanja izjave, testovi će proći / proći.

U donji kod uvrstio sam 3 metode ispitivanja, pri čemu prva i treća metoda imaju uvjet prolaska, a druga metoda neuspjeh. Pogledajte kod sami.

paket testng import org.testng.annotations.Test import org.testng.annotations.BeforeMethod import org.openqa.selenium.WebDriver import org.openqa.selenium.firefox.FirefoxDriver import org.testng.Assert import org.testng.annotations.AfterMethod. tvrdnje javne klase {@BeforeMethod javna void prijeMethod () {System.setProperty ('webdriver.gecko.driver', 'C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe')} public boolean isEqual (int a, int b) {if (a == b ) {return true} else {return false}} @Test public void testEquality1 () {Assert.assertEquals (true, isEqual (10, 10)) System.out.println ('Ovo je uvjet za prolaz')} @Test public void testEquality2 () {Assert.assertEquals (true, isEqual (10, 11)) System.out.println ('Ovo je uvjet neuspjeha')} @Test public void getTitle () {WebDriver driver = novi upravljački program FirefoxDriver (). get ('https://www.gmail.com') String title = driver.getTitle () Assert.assertEquals (title, 'Gmail') System.out.println ('Ovo je opet uvjet prolaska')} }

Kada pogledate izvješće koje se generira nakon ovog izvršenja, primijetit ćete da od tri testa jedno nije uspjelo, a dva prošlo. Još jedna važna stvar koju treba imati na umu jest da će, kada tvrdnja ne uspije, druge naredbe / retci koda u tom testu preskočiti. Tek kad je tvrdnja uspješna, sljedeći redak koda bit će izveden u tom testu. Pogledajte izlaz ispod, gdje system.out.println je izvršio samo za prvu i treću metodu.

1493277977348 geckodriver INFO Slušanje na 127.0.0.1:47035 1493277977993 mozprofile :: profile INFO Korištenje putanje profila C: UsersVardhanAppDataLocalTemp ust_mozprofile.Z7X9uFdKODvi 1493277977994 geckodriver :: marionette INfo Startz Infraz Inverzec Firefox Infinis Mreža Firefo. Povezivanje s Marionetom na localhostu: 50758 [GPU 6920] UPOZORENJE: pogreška cijevi: 109: datoteka c: / builds / moz2_slave / m-rel-w32-00000000000000000000 / build / src / ipc / chromium / src / chrome / common / ipc_channel_win. cc, linija 346 1493277981742 Marionette INFO Slušanje na luci 50758 27. travnja 2017. 12:56:22 org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Otkriven dijalekt: W3C Ovo je opet uvjet prolaska Ovo je uvjet prolaska PROŠLO: getTitle PROŠLO: testEquality1 FAILED: testEquality2 java.lang.AssertionError: očekuje se [false], ali je pronađeno [true] na org.testng.Assert.fail (Assert.java:93) na org.testng.Assert.failNotEquals (Assert.java: 512) na org.testng.Assert.assertE qualsImpl (Assert.java:134) na org.testng.Assert.assertEquals (Assert.java:115) na org.testng.Assert.assertEquals (Assert.java:304) na org.testng.Assert.assertEquals (Assert.java : 314) na testng.Assertions.testEquality2 (Assertions.java:38) na sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) na sun.reflect.NativeMethodAccessorImpl.invoke (nepoznati izvor) na sun.reflect.DelegorkeImetlDelegatingkeMethod Izvor) na java.lang.reflect.Method.invoke (nepoznati izvor) na org.testng.internal.MethodInvocationHelper.invokeMethod (MethodInvocationHelper.java:108) na org.testng.internal.Invoker.invokeMethod (Invoker.java:661) na org.testng.internal.Invoker.invokeTestMethod (Invoker.java:869) na org.testng.internal.Invoker.invokeTestMethods (Invoker.java:1193) na org.testng.internal.TestMethodWorker.invokeTestMethods (TestMethodWorker.java:126 ) na org.testng.internal.TestMethodWorker.run (TestMethodWorker.java:109) na org.testng.TestRunner.privateRun (TestRunner.java:744) na org.testng.TestRu nner.run (TestRunner.java:602) na org.testng.SuiteRunner.runTest (SuiteRunner.java:380) na org.testng.SuiteRunner.runSequentially (SuiteRunner.java:375) na org.testng.SuiteRunner.privateRun (SuiteRunner .java: 340) na org.testng.SuiteRunner.run (SuiteRunner.java:289) na org.testng.SuiteRunnerWorker.runSuite (SuiteRunnerWorker.java:52) na org.testng.SuiteRunnerWorker.run (SuiteRunnerWorker.java:86) na org.testng.TestNG.runSuitesSequentially (TestNG.java:1301) na org.testng.TestNG.runSuitesLocally (TestNG.java:1226) na org.testng.TestNG.runSuites (TestNG.java:1144) na org.testng. TestNG.run (TestNG.java:1115) na org.testng.remote.AbstractRemoteTestNG.run (AbstractRemoteTestNG.java:132) na org.testng.remote.RemoteTestNG.initAndRun (RemoteTestNG.java:230) na org.testng.remote .RemoteTestNG.main (RemoteTestNG.java:76) ========================================= ======== Zadani test Pokrenuti testovi: 3, Kvarovi: 1, Preskoči: 0 ============================ ==================== =================================== ================ Zadani paket Ukupno pokrenutih testova: 3, Kvarovi: 1, Preskoči: 0 ===================================== ============

Dakle, to je kraj koncepata povezanih s upravljanjem testnim slučajem. Preostala nam je još jedna tema, a to je generiranje izvještaja. Generiranje izvještaja posljednja je tema u ovom vodiču za Selenium WebDriver jer se izvješća mogu generirati tek nakon svihprovode se testovi.

best java ide for ubuntu

Generiranje izvješća

Najvažnija stvar koju morate imati na umu je da će se izvještaj generirati samo putem .xml datoteke. To znači, bilo da je riječ o metodi, bilo o klasi ili o grupi koju želite testirati, svi oni moraju biti navedeni u .xml datoteci.

Dakle, prvo možete stvoriti novu mapu u okviru svog projekta i stvoriti novu datoteku unutar te mape i datoteci dati ime i spremiti je s ekstenzijom .xml. Novu mapu i datoteku možete stvoriti desnim klikom na istraživač paketa. Nakon što stvorite datoteku, idite na izvornu karticu s dna prozora i unesite konfiguracije kako je navedeno u donjem isječku.

 

Prvi redak je definicija tipa XML dokumenta. Ovo je standardno i obvezno za sva izvješća o ispitivanju. Ali, ostali su retci prilično objašnjeni. Koristio sam otvorene oznake za paket, test, klase i nastavu. Oznaka razreda može sadržavati jednu ili više klasa unutar sebe. Stoga se može koristiti ako želimo generirati izvješće u kojem testiramo više klasa. Ovo je zgodno posebno za programere koji žele testirati dugački dio koda.

U svakom slučaju, vraćajući se našem izvješću, možete imenovati svaki paket ili test ili razred nakon otvaranja tih oznaka i ne zaboravite zatvoriti svaku oznaku koju otvorite. Ime svog apartmana dao sam kao TestNG , naziv testa kao Test Bilješke i naziv klase kao testng.TestAnotacije. Imajte na umu da je naziv klase u formatu ' ime paketa.klasa ' .

Kada pokrenete ovu datoteku kao TestNG paket, izvršenje će započeti i dobit ćete detaljna izvješća o ispitivanju. Rezultat testa dobit ćete na kartici konzole, a rezultat paketa testova na sljedećoj kartici. Izvještaj koji sam generirao za izvršavanje mog koda jeudonji snimak zaslona. Primijetit ćete da ovaj put postoji naziv skupa, naziv testa, naziv klase, zajedno s vremenom potrebnim za izvršavanje svakog od njih.

U slučaju da želite pregledati HTML izvješće (indeksno izvješće ili izvješće o dostupnosti), možete otići na test-izlaz mapa unutar direktorija projekta u vašem radnom prostoru. Klikom na njih možete pregledati izvješća i kasnije. Ispod su njihove snimke zaslona.

Indeksno izvješće : -

Izvješće dostupno putem e-maila : -

Dakle, to nas dovodi do kraja ovog udžbeničkog bloga za Selenium WebDriver. Vrijeme je da na svom kraju postavite eclipse, instalirate razne selenium pakete, instalirate TestNG i započnete s pisanjem svojih test slučajeva.

Možete pogledati donji video tutorial Selenium WebDriver kako biste svjedočili demonstraciji različitih koncepata objašnjenih na ovom blogu.

Trening selena | TestNG okvir za selen | Edureka

Ovaj video o Edureka Selenium Training vodit će vas kroz detaljne detalje o Selenium WebDriver. Ovaj tutorial video za Selenium idealan je i za početnike i za profesionalce koji žele razjasniti osnove WebDriver naredbi i naučiti kako se TestNG može koristiti sa Seleniumom za upravljanje raznim test slučajevima.

Ako želite naučiti selenij i izgraditi karijeru u domeni testiranja, pogledajte našu interaktivnu mrežu uživo ovdje dolazi s podrškom 24 * 7 koja će vas voditi kroz čitavo razdoblje učenja.

Imate pitanje za nas? Molimo spomenite to u odjeljku za komentare i javit ćemo vam se.