Além do Webdriver e
Page Objects
Charles Kilesse
@chkile
Gustavo Fonseca
@gustavo7lagoas
Selenium webdriver
Test frameworks
Page Objects
Factory de Page Objects
“Services” de dados
“3 As”
Agenda
(powered by pseu...
Implicit Wait X Explicit Wait
Camadas de Abstração
Abordagem Estrutural X Abordagem Funcional
Navegação entre páginas
Agen...
DRY, YAGNI and KISS whenever you can.
ref: http://talkingabouttesting.com/2015/06/08/testes-de-aceitacao-automatizados/
BÁSICO
“Permite a automação de navegadores. É isso!”
Selenium Webdriver
ref: https://github.com/seleniumhq/selenium
ref: www.sele...
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("ht...
O Selenium ajuda com o navegador.
Alguém precisa fazer os testes.
Test Frameworks
class PythonOrgSearch(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
def test_search_in_python_org...
Separação entre código de teste e código
específico da página.
Repositório único dos serviços e operações
fornecidos pela ...
class PageObject:
locators = { "name_input": (By.ID, "name"),
"email_input": (By.CLASS, "email"),
"submit_button": (By.CLA...
Como organizar o código dos testes?
E quando tenho muitos Page Objects?
Como manipulo os dados do que quero testar?
Proble...
INTERMEDIÁRIO
Utilizar o padrão de projeto Factory
Agora temos um Page Object Factory
Vamos ver como fica?
Múltiplos Page Objects
class PageObjectsFactory:
page_map = {
"home": HomePage,
"form": FormPage,
"confirmation": ConfirmationPage
}
def create(p...
Utilizar o Padrão de Projeto Service que cria e
manipula os dados pro seu teste
E este caso como fica?
Dados para testes
class UserService:
def create_user(name, email):
data = {
"username": name,
"email": email
}
api_layer.put("/user", data)
...
Modelo 3As
Arrange, Act, Assert
Aqui também temos um exemplo
Organização do código
class TestCases:
def test_user_form_submit():
# Arrange
user = user_service.create_user("Charles",
"charles.kilesse@outloo...
E o teste lá do início?
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox() TEST FRAMEWORK...
AVANÇADO
Simplicidade X Controle
Implicit X Explicit Waits
Page Objects
DOM Elements
Domain
Behavior
Domain Specific Language (DSL)
Camadas de abstração
Abordagem estrutural ou funcional?
Funcional:
login(username, password)
ou
login_as(user)
Estrutural:
enter_name(username)...
Page Object retorna outro Page Object
ou navegação implícita
ou eu crio um objeto de navegação?
E a navegação entre as pág...
Documentação do sistema.
Abstração das regras de negócio.
Testes são efeito colateral.
BDD?
Palestra sobre abstrações http://seleniumsimplified.com/2014/11/automation-abstractions-
page-objects-and-beyond-conferenc...
OBRIGADO!
Charles Kilesse
charles.kilesse@outlook.com
@chkile
Gustavo Fonseca
gustavo7lagoas@gmail.com
@gustavo7lagoas
Próximos SlideShares
Carregando em…5
×

Além do Webdriver e Page Objects - Versão completa

566 visualizações

Publicada em

  • Seja o primeiro a comentar

Além do Webdriver e Page Objects - Versão completa

  1. 1. Além do Webdriver e Page Objects Charles Kilesse @chkile Gustavo Fonseca @gustavo7lagoas
  2. 2. Selenium webdriver Test frameworks Page Objects Factory de Page Objects “Services” de dados “3 As” Agenda (powered by pseudo-python)
  3. 3. Implicit Wait X Explicit Wait Camadas de Abstração Abordagem Estrutural X Abordagem Funcional Navegação entre páginas Agenda (powered by pseudo-python)
  4. 4. DRY, YAGNI and KISS whenever you can. ref: http://talkingabouttesting.com/2015/06/08/testes-de-aceitacao-automatizados/
  5. 5. BÁSICO
  6. 6. “Permite a automação de navegadores. É isso!” Selenium Webdriver ref: https://github.com/seleniumhq/selenium ref: www.seleniumhq.org ref: selenium-python.readthedocs.org/
  7. 7. from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.get("http://www.python.org") assert "Python" in driver.title elem = driver.find_element_by_name("q") elem.send_keys("pycon") elem.send_keys(Keys.RETURN) assert "No results found." not in driver.page_source driver.close() ref: http://selenium-python.readthedocs.org/en/latest/getting-started.html
  8. 8. O Selenium ajuda com o navegador. Alguém precisa fazer os testes. Test Frameworks
  9. 9. class PythonOrgSearch(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() def test_search_in_python_org(self): driver = self.driver driver.get("http://www.python.org") self.assertIn("Python", driver.title) elem = driver.find_element_by_name("q") elem.send_keys("pycon") elem.send_keys(Keys.RETURN) assert "No results found." not in diver.page_source def tearDown(self): self.driver.close() ref: http://selenium-python.readthedocs.org/en/latest/getting-started.html
  10. 10. Separação entre código de teste e código específico da página. Repositório único dos serviços e operações fornecidos pela página Page Objects ref: http://docs.seleniumhq.org/docs/06_test_design_considerations.jsp
  11. 11. class PageObject: locators = { "name_input": (By.ID, "name"), "email_input": (By.CLASS, "email"), "submit_button": (By.CLASS, "submit_form") } def fill_name_input(text): element = driver.find_element(locators["name_input"]) element.send_keys(text) def fill_email_input(text): element = driver.find_element(locators["email_input"]) element.send_keys(text) def click_submit(): element = driver.find_element(locators["submit_button"]) element.click() return ConfirmationPage
  12. 12. Como organizar o código dos testes? E quando tenho muitos Page Objects? Como manipulo os dados do que quero testar? Problemas!
  13. 13. INTERMEDIÁRIO
  14. 14. Utilizar o padrão de projeto Factory Agora temos um Page Object Factory Vamos ver como fica? Múltiplos Page Objects
  15. 15. class PageObjectsFactory: page_map = { "home": HomePage, "form": FormPage, "confirmation": ConfirmationPage } def create(page_key): return page_map[page_key]()
  16. 16. Utilizar o Padrão de Projeto Service que cria e manipula os dados pro seu teste E este caso como fica? Dados para testes
  17. 17. class UserService: def create_user(name, email): data = { "username": name, "email": email } api_layer.put("/user", data) return User(name, email)
  18. 18. Modelo 3As Arrange, Act, Assert Aqui também temos um exemplo Organização do código
  19. 19. class TestCases: def test_user_form_submit(): # Arrange user = user_service.create_user("Charles", "charles.kilesse@outlook.com") # Act form_page = page_factory.create("form") form_page.fill_name_input(user.name) form_page.fill_email_input(user.email) confirmation_page = form_page.click_submit() confirmation_message = confirmation_page.get_message() # Assert assertEqual(confirmation_message, "Yay! Much Success!")
  20. 20. E o teste lá do início?
  21. 21. from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() TEST FRAMEWORK driver.get("http://www.python.org") PAGE OBJECT assert "Python" in driver.title TEST FRAMEWORK DO YOU EVEN 3AS? elem = driver.find_element_by_name("q") PAGE OBJECT elem.send_keys("pycon") PAGE OBJECT elem.send_keys(Keys.RETURN) PAGE OBJECT assert "No results found." not in driver.page_source TEST FRAMEWORK driver.close() TEST FRAMEWORK
  22. 22. AVANÇADO
  23. 23. Simplicidade X Controle Implicit X Explicit Waits
  24. 24. Page Objects DOM Elements Domain Behavior Domain Specific Language (DSL) Camadas de abstração
  25. 25. Abordagem estrutural ou funcional? Funcional: login(username, password) ou login_as(user) Estrutural: enter_name(username) enter_password(password) click_login()
  26. 26. Page Object retorna outro Page Object ou navegação implícita ou eu crio um objeto de navegação? E a navegação entre as páginas?
  27. 27. Documentação do sistema. Abstração das regras de negócio. Testes são efeito colateral. BDD?
  28. 28. Palestra sobre abstrações http://seleniumsimplified.com/2014/11/automation-abstractions- page-objects-and-beyond-conference-talk/ Melhores Práticas Selenium https://seleniumhq.github.io/docs/best.html#best_practices
  29. 29. OBRIGADO! Charles Kilesse charles.kilesse@outlook.com @chkile Gustavo Fonseca gustavo7lagoas@gmail.com @gustavo7lagoas

×