SlideShare una empresa de Scribd logo
1 de 26
Writing automated tests
Python + Selenium
Letícia Rostirola
Before Automating: BDD
● Encouraging conversation between all involved
● Writing down examples to make things clearer
● Reduce ambiguity
“Automating the scenarios resulting from the conversations is an optional next step.”
Julien Biezemans
Creator of Cucumber.js
Gherkin: a natural language style
“Gherkin is designed to be easy to learn by non-
programmers, yet structured enough to allow
concise description of examples to illustrate
business rules in most real-world domains”.
Why Test Automation?
● Saves you time, money and people
● Consistency of tests
● Continuous Integration
● Avoid boredom
Cucumber
Cucumber can be used to implement automated tests based
on scenarios described in your Gherkin feature files.
In the example given in step definitions:
When she eats 3 cucumbers
Cucumber extracts the text 3 from the step, converts it to an
int and passes it as an argument to the method.
Cucumber vs Behave vs Godog
Cucumber: Java, JS, Ruby.
Behave: Cucumber Python style.
Godog: Cucumber for golang.
Web browser automation
Selenium
“Selenium automates browsers. That's it! What you do with
that power is entirely up to you”.
Web browser automation
Selenium vs Splinter
Project Organization
Page Objects design pattern
“Despite the term "page" object, these objects shouldn't usually be built for each page, but rather for
the significant elements on a page. So a page showing multiple albums would have an album list
page object containing several album page objects. There would probably also be a header page
object and a footer page object.”
Martin Fowler
Software Developer
Page Objects: Benefits
● Create reusable code that can be shared
across multiple test cases
● Reduce the amount of duplicated code
● If the user interface changes, the fix needs
changes in only one place
Page Objects: Example
from lib.pages.basepage import BasePage
from selenium.webdriver.common.by import By
class LogoutPage(BasePage):
def __init__(self, context):
BasePage.__init__(self, context.browser, base_url='http://twitter.com/logout')
locator_dictionary = {
"submit" : (By.CSS_SELECTOR, 'button[type="submit"]'),
}
Page Objects: BasePage
class BasePage(object):
base_url = 'http://twitter.com/'
def __init__(self, driver):
self.driver = driver
def find(self, selector):
return self.driver.find_element_by_css_selector(selector)
def contains_content(self, text, timeout):
try:
elem = WebDriverWait(self.driver, timeout).until(
EC.text_to_be_present_in_element((By.TAG_NAME, 'body'), text))
return elem
except TimeoutException as ex:
return False
Creating the project
Tree
https://github.com/ladylovelace/automation-behave-pageobjects
.
├── features
│ ├── config.py
│ ├── config.py.dist
│ ├── environment.py
│ ├── lib
│ │ ├── chromedriver
│ │ └── pages
│ │ ├── basepage.py
│ │ ├── homepage.py
│ │ └── loginpage.py
│ ├── login_twitter.feature
│ ├── steps
│ │ ├── home.py
│ │ └── login.py
│ └── tweet.feature
├── README.md
├── requirements.txt
├── screenshot
Features
Feature: Tweet
Allow valid users
Post 280 characters limit per tweet
To have a better day
@rainy
Scenario: Tweet like a crazy teenager > 280 chars
Given the valid user is logged in on the homepage
When user post invalid tweet
Then the tweet button should be disabled
@sunny @sanity
Scenario: Tweet properly <= 280 chars
Given the valid user is logged in on the homepage
When user post valid tweet
Then the tweet button should be enabled
And the user should be able to tweet
environment.py
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from lib.pages.basepage import BasePage
def before_all(context):
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
context.browser = BasePage(driver)
def after_scenario(context, scenario):
context.browser.screenshot(str(scenario))
def after_all(context):
print("===== That's all folks =====")
context.browser.close()
steps/page.py
from features.lib.pages.loginpage import LoginPage
from behave import given, when, then
from config import USER
@when(u'the "{user_type}" user logs in')
def login(context, user_type):
username_field = context.browser.find(
LoginPage.locator_dictionary['email'])
password_field = context.browser.find(
LoginPage.locator_dictionary['password'])
username_field.send_keys(USER[user_type]['email'])
password_field.send_keys(USER[user_type]['pass'])
submit_button = context.browser.find(
LoginPage.locator_dictionary['submit'])
submit_button.click()
Scenario: Valid login
Given "valid" user navigates to page "landing"
When the "valid" user logs in
Then the user should be redirected to homepage
feature/steps/login.py feature/steps/login.py
config.py (optional)
USER = {
'valid': {
'email': 'YOUR_EMAIL',
'pass': 'YOUR_PASS',
'username': 'YOUR_USERNAME',
},
'invalid': {
'email': 'spy@spy.com.br',
'pass': 'mudar123',
},
}
Running
https://github.com/PyLadiesSanca/little-monkey
$ pip install selenium
$ pip install behave
$ behave
Test Recording
Tips
● Be aware of Chromedriver/chrome version
○ Chrome headless requires chromedriver 2.3+
● Use Selenium explicit/implicit wait instead of python time.sleep function
○ Better, faster and stronger
● Use find_by_id (or similar) instead of find_by_xpath
○ IE provides no native XPath-over-HTML solution
Best Practices
● "Tag" parts of your feature file
● Gherkin common mistakes
○ Using absolute values instead of configurable values
○ Describing every action instead of a functionality
○ Writing scripts in first person instead of third person
● Good relationship with Frontenders > You will need IDs
● The scenarios should run independently, without any dependencies on other scenarios
References
https://docs.cucumber.io/bdd/overview/
http://www.seleniumhq.org/
https://docs.cucumber.io
https://martinfowler.com/bliki/PageObject.html
https://selenium-python.readthedocs.io/page-objects.html
http://www.seleniumframework.com/python-frameworks/modeling-page-objects/
https://behave.readthedocs.io/en/latest/practical_tips.html
http://www.seleniumframework.com/python-frameworks/complete-the-workflow/
https://www.infoq.com/br/news/2015/07/bdd-cucumber-testing
Thanks

Más contenido relacionado

La actualidad más candente

Behavior Driven Development with Cucumber
Behavior Driven Development with CucumberBehavior Driven Development with Cucumber
Behavior Driven Development with Cucumber
Brandon Keepers
 

La actualidad más candente (20)

Introduction to Bdd and cucumber
Introduction to Bdd and cucumberIntroduction to Bdd and cucumber
Introduction to Bdd and cucumber
 
QSpiders - Automation using Selenium
QSpiders - Automation using SeleniumQSpiders - Automation using Selenium
QSpiders - Automation using Selenium
 
Python selenium
Python seleniumPython selenium
Python selenium
 
Test Automation Framework with BDD and Cucumber
Test Automation Framework with BDD and CucumberTest Automation Framework with BDD and Cucumber
Test Automation Framework with BDD and Cucumber
 
Behavior Driven Development with Cucumber
Behavior Driven Development with CucumberBehavior Driven Development with Cucumber
Behavior Driven Development with Cucumber
 
Introducing BDD and TDD with Cucumber
Introducing BDD and TDD with CucumberIntroducing BDD and TDD with Cucumber
Introducing BDD and TDD with Cucumber
 
Selenium test automation
Selenium test automationSelenium test automation
Selenium test automation
 
Selenium with Cucumber
Selenium  with Cucumber Selenium  with Cucumber
Selenium with Cucumber
 
Selenium Concepts
Selenium ConceptsSelenium Concepts
Selenium Concepts
 
Bdd – with cucumber and gherkin
Bdd – with cucumber and gherkinBdd – with cucumber and gherkin
Bdd – with cucumber and gherkin
 
Test Automation Framework using Cucumber BDD overview (part 1)
Test Automation Framework using Cucumber BDD overview (part 1)Test Automation Framework using Cucumber BDD overview (part 1)
Test Automation Framework using Cucumber BDD overview (part 1)
 
Selenium
SeleniumSelenium
Selenium
 
Introduction to selenium
Introduction to seleniumIntroduction to selenium
Introduction to selenium
 
Cucumber & gherkin language
Cucumber & gherkin languageCucumber & gherkin language
Cucumber & gherkin language
 
BDD with Cucumber
BDD with CucumberBDD with Cucumber
BDD with Cucumber
 
Cucumber BDD
Cucumber BDDCucumber BDD
Cucumber BDD
 
BDD WITH CUCUMBER AND JAVA
BDD WITH CUCUMBER AND JAVABDD WITH CUCUMBER AND JAVA
BDD WITH CUCUMBER AND JAVA
 
Realtime selenium interview questions
Realtime selenium interview questionsRealtime selenium interview questions
Realtime selenium interview questions
 
Automation Testing by Selenium Web Driver
Automation Testing by Selenium Web DriverAutomation Testing by Selenium Web Driver
Automation Testing by Selenium Web Driver
 
Jenkins
JenkinsJenkins
Jenkins
 

Similar a Writing automation tests with python selenium behave pageobjects

Automating Django Functional Tests Using Selenium on Cloud
Automating Django Functional Tests Using Selenium on CloudAutomating Django Functional Tests Using Selenium on Cloud
Automating Django Functional Tests Using Selenium on Cloud
Jonghyun Park
 
Gae Meets Django
Gae Meets DjangoGae Meets Django
Gae Meets Django
fool2nd
 
Top100summit 谷歌-scott-improve your automated web application testing
Top100summit  谷歌-scott-improve your automated web application testingTop100summit  谷歌-scott-improve your automated web application testing
Top100summit 谷歌-scott-improve your automated web application testing
drewz lin
 
Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01
Tony Frame
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDB
MongoDB
 
Making the most of your Test Suite
Making the most of your Test SuiteMaking the most of your Test Suite
Making the most of your Test Suite
ericholscher
 

Similar a Writing automation tests with python selenium behave pageobjects (20)

Sphinx + robot framework = documentation as result of functional testing
Sphinx + robot framework = documentation as result of functional testingSphinx + robot framework = documentation as result of functional testing
Sphinx + robot framework = documentation as result of functional testing
 
End-to-end testing with geb
End-to-end testing with gebEnd-to-end testing with geb
End-to-end testing with geb
 
Behave manners for ui testing pycon2019
Behave manners for ui testing pycon2019Behave manners for ui testing pycon2019
Behave manners for ui testing pycon2019
 
OSCON Google App Engine Codelab - July 2010
OSCON Google App Engine Codelab - July 2010OSCON Google App Engine Codelab - July 2010
OSCON Google App Engine Codelab - July 2010
 
Wt unit 5
Wt unit 5Wt unit 5
Wt unit 5
 
Automating Django Functional Tests Using Selenium on Cloud
Automating Django Functional Tests Using Selenium on CloudAutomating Django Functional Tests Using Selenium on Cloud
Automating Django Functional Tests Using Selenium on Cloud
 
Behind the curtain - How Django handles a request
Behind the curtain - How Django handles a requestBehind the curtain - How Django handles a request
Behind the curtain - How Django handles a request
 
Django for mobile applications
Django for mobile applicationsDjango for mobile applications
Django for mobile applications
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
Gae Meets Django
Gae Meets DjangoGae Meets Django
Gae Meets Django
 
Top100summit 谷歌-scott-improve your automated web application testing
Top100summit  谷歌-scott-improve your automated web application testingTop100summit  谷歌-scott-improve your automated web application testing
Top100summit 谷歌-scott-improve your automated web application testing
 
Continuous integration using thucydides(bdd) with selenium
Continuous integration using thucydides(bdd) with  seleniumContinuous integration using thucydides(bdd) with  selenium
Continuous integration using thucydides(bdd) with selenium
 
Mini Curso de Django
Mini Curso de DjangoMini Curso de Django
Mini Curso de Django
 
Django web framework
Django web frameworkDjango web framework
Django web framework
 
Testing in AngularJS
Testing in AngularJSTesting in AngularJS
Testing in AngularJS
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01Googleappengineintro 110410190620-phpapp01
Googleappengineintro 110410190620-phpapp01
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDB
 
Making the most of your Test Suite
Making the most of your Test SuiteMaking the most of your Test Suite
Making the most of your Test Suite
 
Mezzanine簡介 (at) Taichung.py
Mezzanine簡介 (at) Taichung.pyMezzanine簡介 (at) Taichung.py
Mezzanine簡介 (at) Taichung.py
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 

Último (20)

CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 

Writing automation tests with python selenium behave pageobjects

  • 1. Writing automated tests Python + Selenium Letícia Rostirola
  • 2. Before Automating: BDD ● Encouraging conversation between all involved ● Writing down examples to make things clearer ● Reduce ambiguity “Automating the scenarios resulting from the conversations is an optional next step.” Julien Biezemans Creator of Cucumber.js
  • 3. Gherkin: a natural language style “Gherkin is designed to be easy to learn by non- programmers, yet structured enough to allow concise description of examples to illustrate business rules in most real-world domains”.
  • 4. Why Test Automation? ● Saves you time, money and people ● Consistency of tests ● Continuous Integration ● Avoid boredom
  • 5. Cucumber Cucumber can be used to implement automated tests based on scenarios described in your Gherkin feature files. In the example given in step definitions: When she eats 3 cucumbers Cucumber extracts the text 3 from the step, converts it to an int and passes it as an argument to the method.
  • 6. Cucumber vs Behave vs Godog Cucumber: Java, JS, Ruby. Behave: Cucumber Python style. Godog: Cucumber for golang.
  • 7. Web browser automation Selenium “Selenium automates browsers. That's it! What you do with that power is entirely up to you”.
  • 10. Page Objects design pattern “Despite the term "page" object, these objects shouldn't usually be built for each page, but rather for the significant elements on a page. So a page showing multiple albums would have an album list page object containing several album page objects. There would probably also be a header page object and a footer page object.” Martin Fowler Software Developer
  • 11. Page Objects: Benefits ● Create reusable code that can be shared across multiple test cases ● Reduce the amount of duplicated code ● If the user interface changes, the fix needs changes in only one place
  • 12. Page Objects: Example from lib.pages.basepage import BasePage from selenium.webdriver.common.by import By class LogoutPage(BasePage): def __init__(self, context): BasePage.__init__(self, context.browser, base_url='http://twitter.com/logout') locator_dictionary = { "submit" : (By.CSS_SELECTOR, 'button[type="submit"]'), }
  • 13. Page Objects: BasePage class BasePage(object): base_url = 'http://twitter.com/' def __init__(self, driver): self.driver = driver def find(self, selector): return self.driver.find_element_by_css_selector(selector) def contains_content(self, text, timeout): try: elem = WebDriverWait(self.driver, timeout).until( EC.text_to_be_present_in_element((By.TAG_NAME, 'body'), text)) return elem except TimeoutException as ex: return False
  • 15. Tree https://github.com/ladylovelace/automation-behave-pageobjects . ├── features │ ├── config.py │ ├── config.py.dist │ ├── environment.py │ ├── lib │ │ ├── chromedriver │ │ └── pages │ │ ├── basepage.py │ │ ├── homepage.py │ │ └── loginpage.py │ ├── login_twitter.feature │ ├── steps │ │ ├── home.py │ │ └── login.py │ └── tweet.feature ├── README.md ├── requirements.txt ├── screenshot
  • 16. Features Feature: Tweet Allow valid users Post 280 characters limit per tweet To have a better day @rainy Scenario: Tweet like a crazy teenager > 280 chars Given the valid user is logged in on the homepage When user post invalid tweet Then the tweet button should be disabled @sunny @sanity Scenario: Tweet properly <= 280 chars Given the valid user is logged in on the homepage When user post valid tweet Then the tweet button should be enabled And the user should be able to tweet
  • 17. environment.py import os from selenium import webdriver from selenium.webdriver.chrome.options import Options from lib.pages.basepage import BasePage def before_all(context): driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(10) context.browser = BasePage(driver) def after_scenario(context, scenario): context.browser.screenshot(str(scenario)) def after_all(context): print("===== That's all folks =====") context.browser.close()
  • 18. steps/page.py from features.lib.pages.loginpage import LoginPage from behave import given, when, then from config import USER @when(u'the "{user_type}" user logs in') def login(context, user_type): username_field = context.browser.find( LoginPage.locator_dictionary['email']) password_field = context.browser.find( LoginPage.locator_dictionary['password']) username_field.send_keys(USER[user_type]['email']) password_field.send_keys(USER[user_type]['pass']) submit_button = context.browser.find( LoginPage.locator_dictionary['submit']) submit_button.click() Scenario: Valid login Given "valid" user navigates to page "landing" When the "valid" user logs in Then the user should be redirected to homepage feature/steps/login.py feature/steps/login.py
  • 19. config.py (optional) USER = { 'valid': { 'email': 'YOUR_EMAIL', 'pass': 'YOUR_PASS', 'username': 'YOUR_USERNAME', }, 'invalid': { 'email': 'spy@spy.com.br', 'pass': 'mudar123', }, }
  • 21. $ pip install selenium $ pip install behave $ behave
  • 23. Tips ● Be aware of Chromedriver/chrome version ○ Chrome headless requires chromedriver 2.3+ ● Use Selenium explicit/implicit wait instead of python time.sleep function ○ Better, faster and stronger ● Use find_by_id (or similar) instead of find_by_xpath ○ IE provides no native XPath-over-HTML solution
  • 24. Best Practices ● "Tag" parts of your feature file ● Gherkin common mistakes ○ Using absolute values instead of configurable values ○ Describing every action instead of a functionality ○ Writing scripts in first person instead of third person ● Good relationship with Frontenders > You will need IDs ● The scenarios should run independently, without any dependencies on other scenarios

Notas del editor

  1. Testes Funcionais: Resumidamente verificar se a aplicação está apta a realizar as funções na qual foi desenvolvida para fazer. Ilustrar com exemplos sobre testes repetidos, quebrar features anteriores, CI.
  2. Usar a linguagem que se sentir mais confortável, que o time dominar, ou que tenha uma facil rampa de aprendizado
  3. encapsular em cada classe os atributos e métodos, como campos e ações de cada pagina.