Websites testen met Selenium en Behave

download Websites testen met Selenium en Behave

If you can't read please download the document

Transcript of Websites testen met Selenium en Behave

  • 1. Websites testen met Behave en Selenium Fedict Brussel 11 oktober 2013 Fedict 2013. All rights reserved

2. Agenda Fedict 2013. All rights reserved 3. Agenda Websites testenSeleniumSplinterBehave(Demo)Vragen Fedict 2013. All rights reserved | p. 3 4. Websites testen Fedict 2013. All rights reserved 5. Verschillende soorten (complementair) Schaalbaarheid / load testing Vb: JMeterBeveiligingToegankelijkheid Valideren HTML Vb: AnySurfer Vb: W3C Markup ValidatorVia browser / eindgebruiker test Vb: Selenium Fedict 2013. All rights reserved | p. 5 6. Selenium Fedict 2013. All rights reserved 7. Selenium Automatiseren browser acties Open source Niet bedoeld voor load testing, HTML validaties... http://www.seleniumhq.orgVerzameling tools Selenium IDE (Firefox plugin) (Selenium Remote Control) Selenium WebDriver Selenium Grid (testen op meerdere servers tegelijk) Fedict 2013. All rights reserved | p. 7 8. Selenium Web Driver Sturen browser Ondersteuning voor meerdere browsers Openen en sluiten browser Openen pagina, klikken op buttons, invullen velden, ... Testen van aanwezigheid elementen, tekst ... Firefox 3.6+, HTMLUnit Chrome 12+, IE 7+, Opera 8+ IOS, Android browserVia verschillende programmeertalen Java, C#, Python, Ruby (3rd party) PHP, Perl, Fedict 2013. All rights reserved | p. 8 9. Voorbeeld (Python) from selenium import webdriver browser = webdriver.Firefox() browser.get('http://some.example/user') elem = browser.find_element_by_id('edit-name') elem.send_keys('UserName') elem = browser.find_element_by_id('edit-pass') elem.send_keys('SecretPassword') elem = browser.find_element_by_id('button-submit') elem.click() browser.quit() Fedict 2013. All rights reserved | p. 9 10. Enkele mogelijkheden Navigatie Invullen formulieren Tekstvelden, select, ...Zoeken specifieke HTML-elementen Pagina's laden, page history Navigeren naar frames, windows, alert dialogsVia attributen ID, class, name Via naam, CSS selector, XPath Linken: via (zichtbare) tekst van linkJavascript, cookies, ... Fedict 2013. All rights reserved | p. 10 11. Beperkingen Geen toegang tot onzichtbare elementen Geen HTTP authentication / .htaccess Vb: => Echte gebruiker heeft dit ook niet Verschilt per browser / pop-up schermen invullenProxy configureren verschilt per browser Fedict 2013. All rights reserved | p. 11 12. Best practice: Page Objects Extra abstractie Nadeel Scheiden applicatie-logica en HTML-elementen Vb: LoginPage object Extra werk vooraf (zelf te programmeren)Voordelen Bevordert hergebruik Minder werk als HTML-code pagina wijzigt Fedict 2013. All rights reserved | p. 12 13. Voorbeeld Page Object gebruiken from selenium import webdriver from myexample import LoginPage browser = webdriver.Firefox() page = LoginPage(browser, 'http://some.example/user') page.login('Username', 'Password') browser.quit() Fedict 2013. All rights reserved | p. 13 14. Voorbeeld Page Object (LoginPage) from selenium import webdriver def login(self, username, password): browser = self.browser elem = browser.find_element_by_id('name') elem.send_keys(username) elem = browser.find_element_by_id('pass') elem.send_keys(password) elem = browser.find_element_by_id('button-submit') elem.click() def __init__(self, browser, url): self.browser = browser browser.get(url) Fedict 2013. All rights reserved | p. 14 15. Splinter Fedict 2013. All rights reserved 16. Overzicht Python(Iets) eenvoudigere API dan SeleniumAbstractie PhantomJS / Selenium / Zope.testbrowserTesten of bepaald element wel/niet aanwezig is Via naam, ID, XPath, Testen of bepaalde tekst wel/niet aanwezig isFuncties voor pagina titel / url / HTML code Fedict 2013. All rights reserved | p. 16 17. Voorbeeld from splinter import Browser browser = Browser() Browser.visit('http://some.example/user') browser.fill('name', 'MyUserName') browser.fill('pass', 'SecretPassword') elem = browser.find_by_id('button-submit') elem.first.click() browser.quit() Fedict 2013. All rights reserved | p. 17 18. Behave Fedict 2013. All rights reserved 19. Behavior Driven Development (BDD) Agile ontwikkelingLeesbare test cases Samenwerking business / techiesTools voor verschillende programmeertalen Python: Behave Java: JBehave, Spock, Instinct Javascript: Jasmine Ruby: Cucumber, RSpec, ... Fedict 2013. All rights reserved | p. 19 20. Behave PythonBechrijven testen in tekst files Automatisch uitvoeren Features, Scenarios, Steps Command line / integratie IDE of andere toolsRapportering Console, JUnit rapport, eigen log file ... Fedict 2013. All rights reserved | p. 20 21. Features, Scenarios, Steps Testen van Features Via een of meer Scenarios Vb: inloggen op een website Met correcte / verkeerde username ...Elk scenario bevat meerdere Steps Ga naar website, log in, controleer Worden door programmeur gekoppeld aan code Fedict 2013. All rights reserved | p. 21 22. Voorbeeld Feature met Scenarios, Steps Feature: testing the login form of The Example website Scenario: log in with invalid users Given the website "some.example" When I log in with user "invalid" and password "wrong" Then an error message must be displayed Scenario: log in with valid user Given the website "some.example" When I log in with user "valid" and password "correct" Then the connection must be secured And a welcome message must be displayed Fedict 2013. All rights reserved | p. 22 23. Steps: Given, When, Then, And Worden gekoppeld aan code / functies Via annotaties Alles na Given is eigenlijk een verwijzingParameters zijn mogelijk Worden uit tekst gehaald via gewone match of regexp Ook een (tekst) tabel is mogelijk Fedict 2013. All rights reserved | p. 23 24. Voorbeeld implementatie Step from splinter import Browser from myexample import LoginPage @given('the website {url}') def step_impl(self, url): self.homepage = url @when('I log in with user {user} and password {pwd}') def step_impl(self, user, pwd): page = LoginPage(self.browser, self.homepage) page.login(user, pwd) @then('the connection must be secured') def step_impl(self): assert self.browser.url.startswith('https') Fedict 2013. All rights reserved | p. 24 25. Voorbeeld complexere Step Feature: testing the login form of The Example website Scenario: log in with several invalid users Given the website "some.example" When I log in with an invalid username or password | username | password | | correct | wrong | | wrong | wrong | Then an error message must be displayed Invalid username or password. Please try again. Fedict 2013. All rights reserved | p. 25 26. Enkele handige functionaliteiten Selecteren van uit te voeren Scenarios Environment file Via zelf te definiren tags Vb: @nl, @https, @mobile Voor en/of na elke Feature en/of Scenario en/of Step Vb: starten / afsluiten browserWork in Progress mode Stopt bij eerste fout Geen error log naar console Fedict 2013. All rights reserved | p. 26 27. Voorbeeld Environment from splinter import Browser def before_all(self): profile = { 'network.proxy.type': 1, 'network.proxy.http': 'myproxy.example', 'network.proxy.http_port': 8080 } self.browser = Browser('firefox', profile_preferences=profile) def after_all(self): self.browser.quit() Fedict 2013. All rights reserved | p. 27 28. Vragen ? Fedict 2013. All rights reserved 29. Enkele linken http://www.w3.org/TR/webdriverhttp://www.seleniumhq.orghttp://selenium-python.readthedocs.orghttp://splinter.cobrateam.infohttp://pythonhosted.org/behavehttps://saucelabs.com Fedict 2013. All rights reserved | p. 29 30. Bedankt ! Bart Hanssens / Fedict Maria-Theresiastraat 1 1000 Brussel, Belgium @BartHanssens bart.hanssens [at] fedict.be | www.fedict.belgium.be Fedict 2013. All rights reserved