Automaattisten testien kirjoittaminen on enemmän kuin ylellisyyttä mille tahansa ketterälle ohjelmistokehitystiimille. Se on tarve ja välttämätön työkalu virheiden löytämiseen nopeasti ohjelmistokehityksen alkuvaiheessa. Kun uusi ominaisuus on vielä kehitysvaiheessa, kehittäjät voivat suorittaa automaattisia testejä ja nähdä, miten muutokset vaikuttavat järjestelmän muihin osiin. Tässä artikkelissa kerrotaan, kuinka voit nopeuttaa automaattista testausta Sivun objektimallin avulla -palvelussa Seleeni .
Kautta testiautomaatio , on mahdollista alentaa virheenkorjauksen kustannuksia ja tuoda yleistä parannusta Ohjelmiston laadunvarmistus (QA) -prosessi. Asianmukaisilla testeillä kehittäjät saavat mahdollisuuden löytää ja korjata vikoja jo ennen kuin ne pääsevät laadunvalvontaan. Testausautomaatio auttaa meitä automatisoimaan testitapauksia ja ominaisuuksia, jotka ovat jatkuvasti taantumassa. Tällä tavalla laadunvalvojilla on enemmän aikaa testata sovelluksen muita osia. Lisäksi tämä auttaa varmistamaan tuotteen laadun tuotantopäästöissä. Tämän seurauksena saamme tuotteita, jotka ovat tehokkaammin vakaampia, ja laadunvalvontaprosessi, joka on tehokkaampi.
Vaikka automaattisten testien kirjoittaminen saattaa tuntua helpolta kehittäjille ja insinööreille, on silti mahdollista päästä huonosti toteutettuihin testeihin ja koodin ylläpidon korkeat kustannukset missä tahansa ketterässä prosessissa. Yritä jatkuvasti muuttaa muutoksia tai ominaisuuksia missä tahansa ketterässä kehitysprojektissa voi osoittautua kalliiksi testeissä. Yhden elementin vaihtaminen verkkosivulla, johon 20 testiä luottaa, vaatii yhden käymään läpi nämä 20 testirutiinia ja päivittämään kukin mukautumaan tähän äskettäin tehtyyn muutokseen. Paitsi että tämä voi olla todella aikaa vievää, mutta vakava motivoiva tekijä automatisoitujen testien toteuttamisessa jo varhaisessa vaiheessa.
Mutta entä jos voisimme tehdä muutoksen vain yhdessä paikassa ja jos kaikki asiaankuuluvat testirutiinit käyttävät sitä? Tässä artikkelissa tarkastellaan Seleniumin automatisoituja testejä ja miten voimme käyttää Page Object -malleja ylläpitettävien ja uudelleenkäytettävien testirutiinien kirjoittamiseen.
Sivun objektimalli on Seleniumin objektisuunnittelukuvio, jossa verkkosivut esitetään luokkina ja sivun eri elementit määritellään luokan muuttujina. Kaikki mahdolliset käyttäjien vuorovaikutukset voidaan sitten toteuttaa menetelminä luokassa:
clickLoginButton(); setCredentials(user_name,user_password);
Koska luokkien hyvin nimetyt menetelmät ovat helposti luettavissa, tämä toimii tyylikkäänä tapana toteuttaa testirutiinit, jotka ovat sekä luettavissa että helpompia ylläpitää tai päivittää tulevaisuudessa. Esimerkiksi:
Sivuobjektimallin tukemiseksi käytämme Sivutehdas . Seleenin sivutehdas on sivuobjektin laajennus ja sitä voidaan käyttää monin tavoin. Tässä tapauksessa käytämme Page Factory -ohjelmaa verkkosivujen luokissa tai sivuobjekteissa määriteltyjen web-elementtien alustamiseen.
Verkkoelementtejä sisältävät verkkosivuluokat tai sivuobjektit on alustettava Page Factory -toiminnolla, ennen kuin verkkoelementtimuuttujia voidaan käyttää. Tämä voidaan tehdä yksinkertaisesti käyttämällä aloitukset toiminto PageFactory:
LoginPage page = new LoginPage(driver); PageFactory.initElements(driver, page);
Tai vielä yksinkertaisempi:
LoginPage page = PageFactory.intElements(driver,LoginPage.class)
Tai verkkosivuluokan rakentajan sisällä:
public LoginPage(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); }
Sivutehdas alustaa jokaisen WebElement muuttuja viitaten vastaavaan elementtiin todellisella verkkosivulla määritettyjen 'paikanninten' perusteella. Tämä tapahtuu käyttämällä @FindBy merkinnät. Tämän merkinnän avulla voimme määritellä strategian elementin etsimiseen sekä tarvittavat tiedot sen tunnistamiseksi:
@FindBy(how=How.NAME, using='username') private WebElement user_name;
Joka kerta kun menetelmää käytetään tähän WebElement muuttuja, kuljettaja löytää sen ensin nykyiseltä sivulta ja simuloi sitten vuorovaikutusta. Jos työskentelemme yksinkertaisen sivun kanssa, tiedämme, että löydämme elementin sivulta joka kerta kun etsimme sitä, ja tiedämme myös, että navigoimme lopulta tältä sivulta emmekä palaa sille, voimme tallentaa välimuistin haettu kenttä käyttämällä toista yksinkertaista merkintää:
@FindBy(how=How.NAME, using='username') @CacheLookup private WebElement user_name;
Tämä koko WebElement-muuttujan määritelmä voidaan korvata sen paljon tiiviimmällä muodolla:
@FindBy(name='username') private WebElement user_name;
@FindBy merkintä tukee muutamia muita strategioita, jotka helpottavat asioita:
id, name, className, css, tagName, linkText, partialLinkText, xpath
@FindBy(id='username') private WebElement user_name; @FindBy(name='passsword') private WebElement user_password; @FindBy(className='h3') private WebElement label; @FindBy(css=”#content”) private WebElement text;
Alustamisen jälkeen näitä WebElement-muuttujia voidaan käyttää vuorovaikutuksessa sivun vastaavien elementtien kanssa. Seuraava koodi esimerkiksi:
user_password.sendKeys(password);
… Lähetä annettu näppäinsarja sivun salasanakenttään, ja se vastaa:
driver.findElement(By.name(“user_password”)).sendKeys(password);
Jatkamalla kohtaat usein tilanteita, joissa sinun on löydettävä luettelo elementeistä sivulta, ja juuri silloin @FindBys on kätevä:
@FindBys(@FindBy(css=”div[class=’yt-lockup-tile yt-lockup-video’]”))) private List videoElements;
Yllä oleva koodi löytää kaikki div elementit, joilla on kaksi luokkanimeä 'yt-lockup-tile' ja 'yt-lockup-video'. Voimme yksinkertaistaa tätä vielä enemmän korvaamalla sen seuraavalla:
@FindBy(how=How.CSS,using='div[class=’yt-lockup-tile yt-lockup-video’]') private List videoElements;
Lisäksi voit käyttää @FindAll useiden kanssa @FindBy merkinnät etsimään elementtejä, jotka sopivat johonkin annettuihin paikantimiin:
@FindAll({@FindBy(how=How.ID, using=”username”), @FindBy(className=”username-field”)}) private WebElement user_name;
Nyt kun voimme edustaa verkkosivuja Java-luokkina ja käyttää Page Factoryä alustamiseen WebElement muuttujia helposti, on aika nähdä, kuinka voimme kirjoittaa yksinkertaisia Selenium-testejä käyttämällä Sivun objektikuviota ja Sivutehdasta.
Sivuobjektimallin opetusohjelmassamme automatisoimme kehittäjien rekisteröitymisen ApeeScape-palveluun. Tätä varten meidän on automatisoitava seuraavat vaiheet:
Käy osoitteessa www.toptal.com
Napsauta 'Käytä kehittäjänä' -painiketta
Tarkista ensin portaalisivulla, onko se auki
Napsauta Liity ApeeScape-painiketta
Täytä lomake
Lähetä lomake napsauttamalla Liity ApeeScape-painiketta
lataa ja asenna Java JDK
lataa ja asenna InteliJ-idea
Luo uusi Maven-projekti
Linkitä ”Project SDK” JDK-tiedostoosi, esimerkiksi: Windows ”C: Program Files Java jdkxxx
Asennusryhmän tunnus ja artefaktin tunnus:
SeleniumTEST Test
junit junit ${junit.version} test org.seleniumhq.selenium selenium-firefox-driver ${selenium.version} org.seleniumhq.selenium selenium-support ${selenium.version} org.seleniumhq.selenium selenium-java ${selenium.version}
Korvaa Selenium-versio ja JUnit-versio uusimmilla versionumeroilla, jotka löytyvät etsimällä JUnit Mavenia Googlesta ja Selenium-sivustolta.
Tässä vaiheessa, jos automaattinen koontiversio on käytössä, riippuvuuksien pitäisi alkaa ladata automaattisesti. Jos ei, aktivoi vain Laajennukset> asenna> asenna: asenna Maven Projects -paneelin alle IntelliJ Idea IDE: n oikealla puolella.
Kun projekti on käynnistetty, voimme aloittaa testipakettimme luomisen kohdassa “src / test / java”. Nimeä paketti 'com.toptal' ja luo sen alle kaksi pakettia: 'com.toptal.webpages' ja 'com.toptal.tests'.
Säilytämme sivuobjekti- / sivutehdasluokkamme kohdassa com.toptal.webpages ja testirutiinit kohdassa com.toptal.tests.
Nyt voimme aloittaa sivuobjektiluokkien luomisen.
Ensimmäinen, joka meidän on pantava täytäntöön, on ApeeScapen kotisivu (www.toptal.com). Luo luokka kohtaan 'com.toptal.webpages' ja nimeä se 'HomePage'.
package com.toptal.webpages; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.How; import org.openqa.selenium.support.PageFactory; public class HomePage { private WebDriver driver; //Page URL private static String PAGE_URL='https://www.toptal.com'; //Locators //Apply as Developer Button @FindBy(how = How.LINK_TEXT, using = 'APPLY AS A DEVELOPER') private WebElement developerApplyButton; //Constructor public HomePage(WebDriver driver){ this.driver=driver; driver.get(PAGE_URL); //Initialise Elements PageFactory.initElements(driver, this); } public void clickOnDeveloperApplyButton(){ developerApplyButton.click(); } }
ApeeScapen kotisivulla olemme kiinnostuneita erityisesti yhdestä elementistä, eli 'Käytä kehittäjänä' -painikkeesta. Voimme löytää tämän elementin sovittamalla tekstiä, mitä teemme yllä. Mallinnettaessa verkkosivuja sivuobjektiluokiksi elementtien löytämisestä ja tunnistamisesta voi tulla usein työlästä. Google Chromen tai Firefoxin virheenkorjaustyökalujen avulla tämä voidaan tehdä helpommaksi. Napsauttamalla mitä tahansa sivun elementtiä hiiren kakkospainikkeella, voit aktivoida 'Tarkasta elementti' -vaihtoehdon pikavalikosta saadaksesi lisätietoja elementistä.
Yksi yleinen (ja suosimani) tapa on löytää elementtejä Firefoxin avulla FireBug-laajennus , yhdessä seleniumin Firefox-web-ohjaimen kanssa. Kun olet asentanut ja ottanut FireBug-laajennuksen käyttöön, voit napsauttaa sivua hiiren kakkospainikkeella ja valita “Tarkasta elementti FireBugilla” avataksesi FireBugin. FireBugin HTML-välilehdeltä voit kopioida minkä tahansa sivun elementin XPath-, CSS-polku-, Tag-nimi- tai Id-tunnuksen (jos käytettävissä).
Kopioimalla yllä olevan kuvakaappauksen elementin XPath voimme luoda sille WebElement-kentän sivuobjektiimme seuraavasti:
@FindBy(xpath = '/html/body/div[1]/div/div/header/div/h1') WebElement heading;
Tai pitämällä asiat yksinkertaisina, voimme käyttää tässä tagin nimeä 'h1', kunhan se yksilöi yksilöllisesti kiinnostavan elementin:
@FindBy(tagName = 'h1') WebElement heading;
Seuraavaksi tarvitsemme sivuobjektin, joka edustaa kehittäjäportaalin sivua, johon pääsemme napsauttamalla 'Käytä kehittäjänä' -painiketta.
Tällä sivulla meillä on kaksi kiinnostavaa elementtiä. Sivun latautumisen selvittämiseksi haluamme tarkistaa otsikon olemassaolon. Ja haluamme myös WebElement Liity ApeeScape-painikkeeseen.
package com.toptal.webpages; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class DeveloperPortalPage { private WebDriver driver; @FindBy(xpath = '/html/body/div[1]/div/div/header/div/h1') private WebElement heading; @FindBy(linkText = 'JOIN TOPTAL') private WebElement joinApeeScapeButton; //Constructor public DeveloperPortalPage (WebDriver driver){ this.driver=driver; //Initialise Elements PageFactory.initElements(driver, this); } //We will use this boolean for assertion. To check if page is opened public boolean isPageOpened(){ return heading.getText().toString().contains('Developer portal'); } public void clikOnJoin(){ joinApeeScapeButton.click(); } }
Ja lopuksi, tämän projektin kolmannelle ja viimeiselle sivuobjektille määritellään yksi, joka edustaa sivua, joka sisältää kehittäjän hakemuslomakkeen. Koska meidän on käsiteltävä useita lomakekenttiä tässä, määritämme yhden WebElement muuttuja jokaiselle lomakekentälle. Löydämme jokaisen kentän niiden id: n perusteella ja määrittelemme jokaiselle kentälle erityiset setterimenetelmät, jotka simuloivat vastaavien kenttien näppäinpainalluksia.
package com.toptal.webpages; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class DeveloperApplyPage { private WebDriver driver; @FindBy(tagName = 'h1') WebElement heading; @FindBy(id='developer_email') WebElement developer_email; @FindBy(id = 'developer_password') WebElement developer_password; @FindBy(id = 'developer_password_confirmation') WebElement developer_password_confirmation; @FindBy(id = 'developer_full_name') WebElement developer_full_name; @FindBy(id = 'developer_skype') WebElement developer_skype; @FindBy(id ='save_new_developer') WebElement join_toptal_button; //Constructor public DeveloperApplyPage(WebDriver driver){ this.driver=driver; //Initialise Elements PageFactory.initElements(driver, this); } public void setDeveloper_email(String email){ developer_email.clear(); developer_email.sendKeys(email); } public void setDeveloper_password(String password){ developer_password.clear(); developer_password.sendKeys(password); } public void setDeveloper_password_confirmation(String password_confirmation){ developer_password_confirmation.clear(); developer_password_confirmation.sendKeys(password_confirmation); } public void setDeveloper_full_name (String fullname){ developer_full_name.clear(); developer_full_name.sendKeys(fullname); } public void setDeveloper_skype (String skype){ developer_skype.clear(); developer_skype.sendKeys(skype); } public void clickOnJoin(){ join_toptal_button.click(); } public boolean isPageOpened(){ //Assertion return heading.getText().toString().contains('Apply to join our network as a developer'); } }
Kun sivuobjektiluokit edustavat sivujamme, ja käyttäjien vuorovaikutukset niiden menetelminä, voimme nyt kirjoittaa yksinkertaisen testirutiinimme yksinkertaisina menetelmäkutsuina ja väitteinä.
package com.toptal.tests; import com.toptal.webpages.DeveloperApplyPage; import com.toptal.webpages.DeveloperPortalPage; import com.toptal.webpages.HomePage; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import java.net.URL; import java.util.concurrent.TimeUnit; public class ApplyAsDeveloperTest { WebDriver driver; @Before public void setup(){ //use FF Driver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } @Test public void applyAsDeveloper() { //Create object of HomePage Class HomePage home = new HomePage(driver); home.clickOnDeveloperApplyButton(); //Create object of DeveloperPortalPage DeveloperPortalPage devportal= new DeveloperPortalPage(driver); //Check if page is opened Assert.assertTrue(devportal.isPageOpened()); //Click on Join ApeeScape devportal.clikOnJoin(); //Create object of DeveloperApplyPage DeveloperApplyPage applyPage =new DeveloperApplyPage(driver); //Check if page is opened Assert.assertTrue(applyPage.isPageOpened()); //Fill up data applyPage.setDeveloper_email(' [email protected] '); applyPage.setDeveloper_full_name('Dejan Zivanovic Automated Test'); applyPage.setDeveloper_password('password123'); applyPage.setDeveloper_password_confirmation('password123'); applyPage.setDeveloper_skype('automated_test_skype'); //Click on join //applyPage.clickOnJoin(); } @After public void close(){ driver.close(); } }
Tässä vaiheessa projektisi rakenteen tulisi näyttää tältä:
Jos haluat suorittaa testin, valitse puusta ”ApplyAsDeveloperTest”, napsauta sitä hiiren kakkospainikkeella ja valitse Suorita 'ApplyAsDeveloperTest' .
Kun testi on suoritettu, näet tulokset IDE: n vasemmassa alakulmassa:
Sivuobjekti ja sivutehdas helpottavat verkkosivujen mallintamista Seleniumissa ja niiden testaamista automaattisesti ja tekevät kehittäjien ja Laadunvalvonta paljon yksinkertaisempi. Kun se tehdään oikein, näitä Sivun objektiluokkia voidaan käyttää uudelleen koko testipaketissasi ja antaa itsellesi mahdollisuus toteuttaa projektiisi automaattiset seleenitestit jo varhaisessa vaiheessa vaarantamatta ketterää kehitystä. Abstraktioimalla käyttäjien vuorovaikutukset sivuobjektimalleissasi ja pitämällä testirutiinisi kevyinä ja yksinkertaisina, voit mukauttaa testipaketti muuttuviin vaatimuksiin pienellä vaivalla.
Toivon, että olen onnistunut näyttämään sinulle kuinka kirjoittaa mukava ja puhdas testikoodi, joka on helppo ylläpitää. Lopetan artikkelin suosikkilaatulausekkeellani:
Liittyvät: Verkon kaavinta päättömällä selaimella: Puppeteer-opetusohjelmaAjattele kahdesti, koodaa kerran!
Sivu Objektimalli on Seleniumin objektisuunnittelukuvio. Verkkosivut on esitetty luokkina, ja sivun elementit on määritelty luokan muuttujiksi, joten käyttäjien vuorovaikutukset voidaan sitten toteuttaa luokkamenetelminä.
Seleeni on suunniteltu automatisoimaan selaimet, mikä antaa ohjelmistosuunnittelijoille mahdollisuuden nopeuttaa ja automatisoida testausta huomattavasti. Vaikka testausautomaatio on sen ensisijainen käyttö, Seleeniä voidaan käyttää myös automatisoimaan tiettyjä toistuvia toimintoja, kuten perustoiminnot.
Seleenitestaus on prosessi, jossa Selenium-ohjelmistotyökaluja käytetään testiautomaation helpottamiseen. Useimmissa tapauksissa ohjelmistoinsinöörit valitsevat tähän tehtävään yhdestä kahteen seleenityökalua, mutta lisävälineitä voidaan käyttää vastaamaan erilaisia tarpeita.
Sivuobjektimalli on suunnittelukuvio, kuten aiemmin tässä osiossa hahmoteltiin. Page Factory laajentaa Page Object -mallin toiminnallisuutta tuomalla kehittyneempiä ominaisuuksia. Sen avulla käyttäjät voivat alustaa tietyt elementit Page Object-mallissa merkintöjen avulla.