Your SlideShare is downloading. ×
Websites testen met Selenium en Behave
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Websites testen met Selenium en Behave

193
views

Published on

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
193
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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 testen  Selenium  Splinter  Behave  (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: JMeter  Beveiliging  Toegankelijkheid   Valideren HTML   Vb: AnySurfer Vb: W3C Markup Validator Via 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.org Verzameling 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 browser Via 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 dialogs Via attributen ID, class, name Via naam, CSS selector, XPath Linken: via (zichtbare) tekst van link Javascript, cookies, ... © Fedict 2013. All rights reserved | p. 10
  • 11. Beperkingen  Geen toegang tot onzichtbare elementen    Geen HTTP authentication / .htaccess   Vb: <input type=”hidden”> => “Echte” gebruiker heeft dit ook niet Verschilt per browser / pop-up schermen invullen Proxy 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 Selenium  Abstractie   PhantomJS / Selenium / Zope.testbrowser Testen of bepaald element wel/niet aanwezig is  Via naam, ID, XPath, …  Testen of bepaalde tekst wel/niet aanwezig is  Functies 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” ontwikkeling  “Leesbare” test cases   Samenwerking business / techies Tools voor verschillende programmeertalen     Python: Behave Java: JBehave, Spock, Instinct … Javascript: Jasmine Ruby: Cucumber, RSpec, ... © Fedict 2013. All rights reserved | p. 19
  • 20. Behave  Python  Bechrijven testen in tekst files   Automatisch uitvoeren   Features, Scenarios, Steps Command line / integratie IDE of andere tools Rapportering  Console, JUnit rapport, eigen log file ... © Fedict 2013. All rights reserved | p. 20
  • 21. Features, Scenarios, Steps  Testen van “Feature”s   Via een of meer “Scenario”s   Vb: inloggen op een website Met correcte / verkeerde username ... Elk scenario bevat meerdere “Step”s   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 verwijzing Parameters 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 definiëren tags Vb: @nl, @https, @mobile Voor en/of na elke Feature en/of Scenario en/of Step Vb: starten / afsluiten browser “Work 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/webdriver  http://www.seleniumhq.org  http://selenium-python.readthedocs.org  http://splinter.cobrateam.info  http://pythonhosted.org/behave  https://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