SlideShare a Scribd company logo
Alexander Vasilyev
Selenium+py.test
• Selenium overwiew
• Some Samples
• Actions
• Fixtures
• Travis CI
• Jenkins CI
Agenda
Parts of Selenium:
•Selenium Webdriver (Selenium 2)
•Selenium IDE
•Selenium Server
•Selenium-Grid
Selenium Overview
• Google Chrome
• Internet Explorer 6, 7, 8, 9, 10 - 32 and 64-bit where applicable
• Firefox: latest ESR, previous ESR, current release, one previous
release
• Safari
• Opera
• HtmlUnit
• phantomjs
• Android (with Selendroid or appium)
• iOS (with ios-driver or appium)
Selenium Overview
Selenium Overview
• find_element_by_id
• find_element_by_name
• find_element_by_xpath
• find_element_by_link_text
• find_element_by_partial_link_text
• find_element_by_tag_name
• find_element_by_class_name
• find_element_by_css_selector
Find & Interact
def login_field(self):
return self.wait.until(EC.element_to_be_clickable((By.NAME, 'Login')))
def password_field(self):
return self.wait.until(EC.element_to_be_clickable((By.NAME, 'Password')))
def login_button(self):
return self.wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']")))
def error_message(self):
return self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='error-text']")))
def login_username(self):
return self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "username")))
def logout_button(self):
return self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "logout")))
Find
Interact
def login(self, name, password):
self.login_field().send_keys(name)
self.password_field().send_keys(password)
self.login_button().click()
Actions
actions = ActionChains(driver)
test_plan = wait.until(EC.presence_of_element_located((By.XPATH, ".//ul/li[1]")))
actions.move_to_element(test_plan)
actions.click(test_plan)
actions.perform()
Asserts
Asserts
•assertEqual(a, b)
•assertNotEqual(a, b)
•assertTrue(x)
•assertFalse(x)
error_message = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='error-
text']")))
unittest.TestCase.assertEqual(error_message.is_displayed(), True, "Should return error-
message")
All together
import pageObjects.login_page
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
class TestClass(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.wait = WebDriverWait(self.driver, 10)
def tearDown(self):
self.driver.quit()
pass
def test_input_field(self):
self.driver.get("http://www.ukr.net")
login_page.login("name", "pasword")
unittest.TestCase.assertEqual(login_page.error_message().is_displayed(), True, "Should return error-
message")
if __name__ == '__main__':
unittest.main()
setUp&tearDown
def setUp(self):
self.driver = webdriver.Firefox()
self.wait = WebDriverWait(self.driver, 10)
def tearDown(self):
self.driver.quit()
pass
py.test
http://pytest.org/
The pytest testing tool makes it easy to write small tests, yet scales to support complex functional
testing. It provides
•auto-discovery of test modules and functions,
•detailed info on failing assert statements (no need to remember self.assert* names)
•fixtures for managing small or parametrized long-lived test resources.
•you can use pytest to run test suites based on unittest (or trial), nose
•single-source compatibility from Python2.6 all the way up to Python3.4, PyPy-2.3
•many external plugins.
py.test test discovery
pytest implements the following standard test discovery:
•collection starts from the initial command line arguments which may be directories, filenames or
test ids.
•recurse into directories, unless they match norecursedirs
•test_*.py or *_test.py files, imported by their test package name.
•Test prefixed test classes (without an __init__ method)
•test_ prefixed test functions or methods are test items
py.test asserts
def test_set_comparison():
set1 = set("1308")
set2 = set("8035")
assert set1 == set2
py.test asserts
================================= FAILURES =================================
___________________________ test_set_comparison ____________________________
def test_set_comparison():
set1 = set("1308")
set2 = set("8035")
> assert set1 == set2
E assert set(['0', '1', '3', '8']) == set(['0', '3', '5', '8'])
E Extra items in the left set:
E '1'
E Extra items in the right set:
E '5'
E Use -v to get the full diff
test_assert2.py:5: AssertionError
========================= 1 failed in 0.01 seconds =========================
py.test asserts
Special comparisons are done for a number of cases:
•comparing long strings: a context diff is shown
•comparing long sequences: first failing indices
•comparing dicts: different entries
py.test fixtures
The purpose of test fixtures is to provide a fixed baseline upon which tests
can reliably and repeatedly execute. pytest fixtures offer advantage over
the classic xUnit style of setup/teardown functions:
•fixtures have explicit names and are activated by declaring their use from
test functions, modules, classes or whole projects.
•fixtures are implemented in a modular manner, as each fixture name
triggers a fixture function which can itself use other fixtures.
•fixture management scales from simple unit to complex functional testing,
allowing to parametrize fixtures and tests according to configuration and
component options, or to re-use fixtures across class, module or whole test
session scopes.
py.test fixtures discovery
The discovery of fixtures functions starts at test classes, then test modules,
then conftest.py files and finally built-in and third party plugins.
py.test fixtures
@pytest.fixture
def driver():
_driver = webdriver.Firefox()
def driver_teardown():
_driver.quit()
request.addfinalizer(driver_teardown)
return _driver
def test_server_connect(driver):
driver.get("ukr.net")
assert "UKR" in driver.title
py.test fixtures
@pytest.yield_fixture
def driver():
_driver = webdriver.Firefox()
yield _driver
_driver.quit()
def test_server_connect(driver):
driver.get("ukr.net")
assert "UKR" in driver.title
py.test parameterize
chrome_driver = webdriver.Remote(selenium_grid_url, desired_capabilities={'platform': 'ANY',
'browserName': 'chrome', 'version': '', 'javascriptEnabled': True})
firefox_driver = webdriver.Remote(selenium_grid_url, desired_capabilities={'platform': 'ANY',
'browserName': 'firefox', 'version': '', 'javascriptEnabled': True})
@pytest.mark.parametrize('driver', [chrome_driver, firefox_driver])
def test_login(driver):
login_page = LoginPage(driver)
driver.get("http://www.ukr.net")
login_page.login(login, password)
assert login_page.login_username().is_displayed() is True
py.test pytest-xdist
The pytest-xdist plugin extends py.test with some unique test execution modes:
•test run parallelization: if you have multiple CPUs or hosts you can use those for a
combined test run. This allows to speed up development or to use special resources of
remote machines.
•--boxed: (not available on Windows) run each test in a boxed subprocess to survive
SEGFAULTS or otherwise dying processes
•--looponfail: run your tests repeatedly in a subprocess. After each run py.test waits until a
file in your project changes and then re-runs the previously failing tests. This is repeated
until all tests pass after which again a full run is performed.
•Multi-Platform coverage: you can specify different Python interpreters or different
platforms and run tests in parallel on all of them.
py.test pytest-xdist
Localy : py.test -n5 test_ukrnet.py
Distribute: py.test -d --tx socket=192.168.1.102:8888 --rsyncdir mypkg mypkg
py.test CI-Travis
Travis CI is a hosted continuous integration service. It is integrated with GitHub.
Travis CI's build environment provides different runtimes for different languages, for
instance multiple versions of Python, Ruby, PHP, Node.js. It also comes preinstalled
with a variety of data stores and common tools like message brokers.
py.test CI-Travis
language: python
python:
- "2.7"
before_install:
- "sh -e /etc/init.d/xvfb start"
- "export DISPLAY=:99.0"
- "wget http://selenium-release.storage.googleapis.com/2.44/selenium-server-standalone-2.44.0.ja
- "java -jar selenium-server-standalone-2.44.0.jar > /dev/null &"
- "sleep 10"
# command to install dependencies
install:
- "pip install -r requirements.txt"
# command to run tests
script: py.test
py.test SauceLabs
https://docs.saucelabs.com/tutorials/python/
from selenium import webdriver
sauce_url = "http://YOUR_USERNAME:YOUR_ACCESS_KEY@ondemand.saucelabs.com:80/wd/hub"
desired_capabilities = {
'platform': "Mac OS X 10.9",
'browserName': "chrome",
'version': "31",
}
driver = webdriver.Remote(desired_capabilities=desired_capabilities,
command_executor=sauce_url)
driver.implicitly_wait(10)
py.test CI-Jenkins
py.test --junitxml=path
py.test CI-Jenkins
Thank You!

More Related Content

What's hot (20)

PDF
Test Driven Development With Python
Siddhi
 
ODT
Testing in-python-and-pytest-framework
Arulalan T
 
PDF
Token Testing Slides
ericholscher
 
PDF
Python Unit Test
David Xie
 
PDF
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
Christopher Bartling
 
PDF
Keep your repo clean
Hector Canto
 
PPTX
Unit testing in JavaScript with Jasmine and Karma
Andrey Kolodnitsky
 
PDF
Modern Python Testing
Alexander Loechel
 
KEY
Testing My Patience
Adam Lowry
 
PDF
Python unittest
Felipe Ruhland
 
PDF
Unit Testing JavaScript Applications
Ynon Perek
 
PDF
Testing in Django
Kevin Harvey
 
PDF
Unit testing PHP apps with PHPUnit
Michelangelo van Dam
 
PDF
Python-nose: A unittest-based testing framework for Python that makes writing...
Timo Stollenwerk
 
PPTX
Automation patterns on practice
automated-testing.info
 
PDF
Painless JavaScript Testing with Jest
Michał Pierzchała
 
KEY
DjangoCon US 2011 - Monkeying around at New Relic
Graham Dumpleton
 
PDF
AngularJS Unit Testing w/Karma and Jasmine
foxp2code
 
PDF
Angular testing
Raissa Ferreira
 
PDF
Intro to testing Javascript with jasmine
Timothy Oxley
 
Test Driven Development With Python
Siddhi
 
Testing in-python-and-pytest-framework
Arulalan T
 
Token Testing Slides
ericholscher
 
Python Unit Test
David Xie
 
JavaScript Test-Driven Development with Jasmine 2.0 and Karma
Christopher Bartling
 
Keep your repo clean
Hector Canto
 
Unit testing in JavaScript with Jasmine and Karma
Andrey Kolodnitsky
 
Modern Python Testing
Alexander Loechel
 
Testing My Patience
Adam Lowry
 
Python unittest
Felipe Ruhland
 
Unit Testing JavaScript Applications
Ynon Perek
 
Testing in Django
Kevin Harvey
 
Unit testing PHP apps with PHPUnit
Michelangelo van Dam
 
Python-nose: A unittest-based testing framework for Python that makes writing...
Timo Stollenwerk
 
Automation patterns on practice
automated-testing.info
 
Painless JavaScript Testing with Jest
Michał Pierzchała
 
DjangoCon US 2011 - Monkeying around at New Relic
Graham Dumpleton
 
AngularJS Unit Testing w/Karma and Jasmine
foxp2code
 
Angular testing
Raissa Ferreira
 
Intro to testing Javascript with jasmine
Timothy Oxley
 

Similar to Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks (20)

PDF
Тестирование и Django
MoscowDjango
 
PDF
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Robot Media
 
PPTX
Browser testing with nightwatch.js
Salvador Molina (Slv_)
 
PDF
JUnit5 and TestContainers
Sunghyouk Bae
 
PDF
How to fake_properly
Rainer Schuettengruber
 
ODP
Good Practices On Test Automation
Gustavo Labbate Godoy
 
PPTX
Junit_.pptx
Suman Sourav
 
ODP
Grails unit testing
pleeps
 
PDF
Data driven testing using Integrant & Spec
Leon Mergen
 
PPTX
Building frameworks over Selenium
Cristian COȚOI
 
DOC
Selenium Webdriver with data driven framework
David Rajah Selvaraj
 
KEY
Django’s nasal passage
Erik Rose
 
PPT
Testing And Drupal
Peter Arato
 
PPTX
Unit testing
NexThoughts Technologies
 
PPTX
Testing ASP.NET - Progressive.NET
Ben Hall
 
PDF
Web UI test automation instruments
Artem Nagornyi
 
PPTX
Testing basics for developers
Anton Udovychenko
 
KEY
Django Pro ORM
Alex Gaynor
 
PPTX
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
Jen Wong
 
PPT
Unit testing with Spock Framework
Eugene Dvorkin
 
Тестирование и Django
MoscowDjango
 
Unit testing in iOS featuring OCUnit, GHUnit & OCMock
Robot Media
 
Browser testing with nightwatch.js
Salvador Molina (Slv_)
 
JUnit5 and TestContainers
Sunghyouk Bae
 
How to fake_properly
Rainer Schuettengruber
 
Good Practices On Test Automation
Gustavo Labbate Godoy
 
Junit_.pptx
Suman Sourav
 
Grails unit testing
pleeps
 
Data driven testing using Integrant & Spec
Leon Mergen
 
Building frameworks over Selenium
Cristian COȚOI
 
Selenium Webdriver with data driven framework
David Rajah Selvaraj
 
Django’s nasal passage
Erik Rose
 
Testing And Drupal
Peter Arato
 
Testing ASP.NET - Progressive.NET
Ben Hall
 
Web UI test automation instruments
Artem Nagornyi
 
Testing basics for developers
Anton Udovychenko
 
Django Pro ORM
Alex Gaynor
 
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
Jen Wong
 
Unit testing with Spock Framework
Eugene Dvorkin
 
Ad

More from Lohika_Odessa_TechTalks (20)

PPTX
OAuth2 Authorization Server Under the Hood
Lohika_Odessa_TechTalks
 
PPTX
Debugging Microservices - key challenges and techniques - Microservices Odesa...
Lohika_Odessa_TechTalks
 
PPTX
Design and Evolution of APIs in Microservice Architecture
Lohika_Odessa_TechTalks
 
PPTX
Micro-frontends – is it a new normal?
Lohika_Odessa_TechTalks
 
PPTX
Multithreading in go
Lohika_Odessa_TechTalks
 
PPTX
Druid - Interactive Analytics At Scale
Lohika_Odessa_TechTalks
 
PDF
DevOps Odessa #TechTalks 21.01.2020
Lohika_Odessa_TechTalks
 
PPTX
Jenkins' shared libraries in action
Lohika_Odessa_TechTalks
 
PPTX
Prometheus: infrastructure and application monitoring in kubernetes cluster
Lohika_Odessa_TechTalks
 
PPT
Architectural peripherals of react by Vadym Zhiltsov
Lohika_Odessa_TechTalks
 
PPTX
React native by example by Vadim Ruban
Lohika_Odessa_TechTalks
 
PPTX
Aws lambda by Leonid Amigud
Lohika_Odessa_TechTalks
 
PPT
Congratulations, you have been promoted to a manager role. You`ve got new pro...
Lohika_Odessa_TechTalks
 
PPT
"Don't touch me and give me my money" or how motivate people who can but don...
Lohika_Odessa_TechTalks
 
PPTX
Docker based Architecture by Denys Serdiuk
Lohika_Odessa_TechTalks
 
PPTX
SparkSpark in the Big Data dark by Sergey Levandovskiy
Lohika_Odessa_TechTalks
 
PPT
Burnout and how to avoid it in your team. Responsible person's issue by Andre...
Lohika_Odessa_TechTalks
 
PPTX
Performance evaluation process as a way to empower your employees and help th...
Lohika_Odessa_TechTalks
 
PPT
" Performance testing for Automation QA - why and how " by Andrey Kovalenko f...
Lohika_Odessa_TechTalks
 
PPT
"WEB applications security testing" by Kirill Semenov for Lohika Odessa QA Te...
Lohika_Odessa_TechTalks
 
OAuth2 Authorization Server Under the Hood
Lohika_Odessa_TechTalks
 
Debugging Microservices - key challenges and techniques - Microservices Odesa...
Lohika_Odessa_TechTalks
 
Design and Evolution of APIs in Microservice Architecture
Lohika_Odessa_TechTalks
 
Micro-frontends – is it a new normal?
Lohika_Odessa_TechTalks
 
Multithreading in go
Lohika_Odessa_TechTalks
 
Druid - Interactive Analytics At Scale
Lohika_Odessa_TechTalks
 
DevOps Odessa #TechTalks 21.01.2020
Lohika_Odessa_TechTalks
 
Jenkins' shared libraries in action
Lohika_Odessa_TechTalks
 
Prometheus: infrastructure and application monitoring in kubernetes cluster
Lohika_Odessa_TechTalks
 
Architectural peripherals of react by Vadym Zhiltsov
Lohika_Odessa_TechTalks
 
React native by example by Vadim Ruban
Lohika_Odessa_TechTalks
 
Aws lambda by Leonid Amigud
Lohika_Odessa_TechTalks
 
Congratulations, you have been promoted to a manager role. You`ve got new pro...
Lohika_Odessa_TechTalks
 
"Don't touch me and give me my money" or how motivate people who can but don...
Lohika_Odessa_TechTalks
 
Docker based Architecture by Denys Serdiuk
Lohika_Odessa_TechTalks
 
SparkSpark in the Big Data dark by Sergey Levandovskiy
Lohika_Odessa_TechTalks
 
Burnout and how to avoid it in your team. Responsible person's issue by Andre...
Lohika_Odessa_TechTalks
 
Performance evaluation process as a way to empower your employees and help th...
Lohika_Odessa_TechTalks
 
" Performance testing for Automation QA - why and how " by Andrey Kovalenko f...
Lohika_Odessa_TechTalks
 
"WEB applications security testing" by Kirill Semenov for Lohika Odessa QA Te...
Lohika_Odessa_TechTalks
 
Ad

Recently uploaded (20)

PDF
Natural_Language_processing_Unit_I_notes.pdf
sanguleumeshit
 
DOCX
SAR - EEEfdfdsdasdsdasdasdasdasdasdasdasda.docx
Kanimozhi676285
 
PDF
Construction of a Thermal Vacuum Chamber for Environment Test of Triple CubeS...
2208441
 
PPTX
Water resources Engineering GIS KRT.pptx
Krunal Thanki
 
PPTX
cybersecurityandthe importance of the that
JayachanduHNJc
 
PPTX
business incubation centre aaaaaaaaaaaaaa
hodeeesite4
 
PDF
CAD-CAM U-1 Combined Notes_57761226_2025_04_22_14_40.pdf
shailendrapratap2002
 
PPTX
Online Cab Booking and Management System.pptx
diptipaneri80
 
PDF
All chapters of Strength of materials.ppt
girmabiniyam1234
 
PDF
Biodegradable Plastics: Innovations and Market Potential (www.kiu.ac.ug)
publication11
 
PPTX
22PCOAM21 Session 1 Data Management.pptx
Guru Nanak Technical Institutions
 
PPTX
ETP Presentation(1000m3 Small ETP For Power Plant and industry
MD Azharul Islam
 
PPTX
IoT_Smart_Agriculture_Presentations.pptx
poojakumari696707
 
PPTX
Chapter_Seven_Construction_Reliability_Elective_III_Msc CM
SubashKumarBhattarai
 
PDF
2025 Laurence Sigler - Advancing Decision Support. Content Management Ecommer...
Francisco Javier Mora Serrano
 
PDF
67243-Cooling and Heating & Calculation.pdf
DHAKA POLYTECHNIC
 
PPTX
ENSA_Module_7.pptx_wide_area_network_concepts
RanaMukherjee24
 
PDF
Zero carbon Building Design Guidelines V4
BassemOsman1
 
PPTX
filteration _ pre.pptx 11111110001.pptx
awasthivaibhav825
 
PPTX
Ground improvement techniques-DEWATERING
DivakarSai4
 
Natural_Language_processing_Unit_I_notes.pdf
sanguleumeshit
 
SAR - EEEfdfdsdasdsdasdasdasdasdasdasdasda.docx
Kanimozhi676285
 
Construction of a Thermal Vacuum Chamber for Environment Test of Triple CubeS...
2208441
 
Water resources Engineering GIS KRT.pptx
Krunal Thanki
 
cybersecurityandthe importance of the that
JayachanduHNJc
 
business incubation centre aaaaaaaaaaaaaa
hodeeesite4
 
CAD-CAM U-1 Combined Notes_57761226_2025_04_22_14_40.pdf
shailendrapratap2002
 
Online Cab Booking and Management System.pptx
diptipaneri80
 
All chapters of Strength of materials.ppt
girmabiniyam1234
 
Biodegradable Plastics: Innovations and Market Potential (www.kiu.ac.ug)
publication11
 
22PCOAM21 Session 1 Data Management.pptx
Guru Nanak Technical Institutions
 
ETP Presentation(1000m3 Small ETP For Power Plant and industry
MD Azharul Islam
 
IoT_Smart_Agriculture_Presentations.pptx
poojakumari696707
 
Chapter_Seven_Construction_Reliability_Elective_III_Msc CM
SubashKumarBhattarai
 
2025 Laurence Sigler - Advancing Decision Support. Content Management Ecommer...
Francisco Javier Mora Serrano
 
67243-Cooling and Heating & Calculation.pdf
DHAKA POLYTECHNIC
 
ENSA_Module_7.pptx_wide_area_network_concepts
RanaMukherjee24
 
Zero carbon Building Design Guidelines V4
BassemOsman1
 
filteration _ pre.pptx 11111110001.pptx
awasthivaibhav825
 
Ground improvement techniques-DEWATERING
DivakarSai4
 

Selenium with py test by Alexandr Vasyliev for Lohika Odessa Python TechTalks

  • 2. • Selenium overwiew • Some Samples • Actions • Fixtures • Travis CI • Jenkins CI Agenda
  • 3. Parts of Selenium: •Selenium Webdriver (Selenium 2) •Selenium IDE •Selenium Server •Selenium-Grid Selenium Overview
  • 4. • Google Chrome • Internet Explorer 6, 7, 8, 9, 10 - 32 and 64-bit where applicable • Firefox: latest ESR, previous ESR, current release, one previous release • Safari • Opera • HtmlUnit • phantomjs • Android (with Selendroid or appium) • iOS (with ios-driver or appium) Selenium Overview
  • 6. • find_element_by_id • find_element_by_name • find_element_by_xpath • find_element_by_link_text • find_element_by_partial_link_text • find_element_by_tag_name • find_element_by_class_name • find_element_by_css_selector Find & Interact
  • 7. def login_field(self): return self.wait.until(EC.element_to_be_clickable((By.NAME, 'Login'))) def password_field(self): return self.wait.until(EC.element_to_be_clickable((By.NAME, 'Password'))) def login_button(self): return self.wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']"))) def error_message(self): return self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='error-text']"))) def login_username(self): return self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "username"))) def logout_button(self): return self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "logout"))) Find
  • 8. Interact def login(self, name, password): self.login_field().send_keys(name) self.password_field().send_keys(password) self.login_button().click()
  • 9. Actions actions = ActionChains(driver) test_plan = wait.until(EC.presence_of_element_located((By.XPATH, ".//ul/li[1]"))) actions.move_to_element(test_plan) actions.click(test_plan) actions.perform()
  • 10. Asserts Asserts •assertEqual(a, b) •assertNotEqual(a, b) •assertTrue(x) •assertFalse(x) error_message = self.wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='error- text']"))) unittest.TestCase.assertEqual(error_message.is_displayed(), True, "Should return error- message")
  • 11. All together import pageObjects.login_page import unittest from selenium import webdriver from selenium.webdriver.common.keys import Keys class TestClass(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.wait = WebDriverWait(self.driver, 10) def tearDown(self): self.driver.quit() pass def test_input_field(self): self.driver.get("http://www.ukr.net") login_page.login("name", "pasword") unittest.TestCase.assertEqual(login_page.error_message().is_displayed(), True, "Should return error- message") if __name__ == '__main__': unittest.main()
  • 12. setUp&tearDown def setUp(self): self.driver = webdriver.Firefox() self.wait = WebDriverWait(self.driver, 10) def tearDown(self): self.driver.quit() pass
  • 13. py.test http://pytest.org/ The pytest testing tool makes it easy to write small tests, yet scales to support complex functional testing. It provides •auto-discovery of test modules and functions, •detailed info on failing assert statements (no need to remember self.assert* names) •fixtures for managing small or parametrized long-lived test resources. •you can use pytest to run test suites based on unittest (or trial), nose •single-source compatibility from Python2.6 all the way up to Python3.4, PyPy-2.3 •many external plugins.
  • 14. py.test test discovery pytest implements the following standard test discovery: •collection starts from the initial command line arguments which may be directories, filenames or test ids. •recurse into directories, unless they match norecursedirs •test_*.py or *_test.py files, imported by their test package name. •Test prefixed test classes (without an __init__ method) •test_ prefixed test functions or methods are test items
  • 15. py.test asserts def test_set_comparison(): set1 = set("1308") set2 = set("8035") assert set1 == set2
  • 16. py.test asserts ================================= FAILURES ================================= ___________________________ test_set_comparison ____________________________ def test_set_comparison(): set1 = set("1308") set2 = set("8035") > assert set1 == set2 E assert set(['0', '1', '3', '8']) == set(['0', '3', '5', '8']) E Extra items in the left set: E '1' E Extra items in the right set: E '5' E Use -v to get the full diff test_assert2.py:5: AssertionError ========================= 1 failed in 0.01 seconds =========================
  • 17. py.test asserts Special comparisons are done for a number of cases: •comparing long strings: a context diff is shown •comparing long sequences: first failing indices •comparing dicts: different entries
  • 18. py.test fixtures The purpose of test fixtures is to provide a fixed baseline upon which tests can reliably and repeatedly execute. pytest fixtures offer advantage over the classic xUnit style of setup/teardown functions: •fixtures have explicit names and are activated by declaring their use from test functions, modules, classes or whole projects. •fixtures are implemented in a modular manner, as each fixture name triggers a fixture function which can itself use other fixtures. •fixture management scales from simple unit to complex functional testing, allowing to parametrize fixtures and tests according to configuration and component options, or to re-use fixtures across class, module or whole test session scopes.
  • 19. py.test fixtures discovery The discovery of fixtures functions starts at test classes, then test modules, then conftest.py files and finally built-in and third party plugins.
  • 20. py.test fixtures @pytest.fixture def driver(): _driver = webdriver.Firefox() def driver_teardown(): _driver.quit() request.addfinalizer(driver_teardown) return _driver def test_server_connect(driver): driver.get("ukr.net") assert "UKR" in driver.title
  • 21. py.test fixtures @pytest.yield_fixture def driver(): _driver = webdriver.Firefox() yield _driver _driver.quit() def test_server_connect(driver): driver.get("ukr.net") assert "UKR" in driver.title
  • 22. py.test parameterize chrome_driver = webdriver.Remote(selenium_grid_url, desired_capabilities={'platform': 'ANY', 'browserName': 'chrome', 'version': '', 'javascriptEnabled': True}) firefox_driver = webdriver.Remote(selenium_grid_url, desired_capabilities={'platform': 'ANY', 'browserName': 'firefox', 'version': '', 'javascriptEnabled': True}) @pytest.mark.parametrize('driver', [chrome_driver, firefox_driver]) def test_login(driver): login_page = LoginPage(driver) driver.get("http://www.ukr.net") login_page.login(login, password) assert login_page.login_username().is_displayed() is True
  • 23. py.test pytest-xdist The pytest-xdist plugin extends py.test with some unique test execution modes: •test run parallelization: if you have multiple CPUs or hosts you can use those for a combined test run. This allows to speed up development or to use special resources of remote machines. •--boxed: (not available on Windows) run each test in a boxed subprocess to survive SEGFAULTS or otherwise dying processes •--looponfail: run your tests repeatedly in a subprocess. After each run py.test waits until a file in your project changes and then re-runs the previously failing tests. This is repeated until all tests pass after which again a full run is performed. •Multi-Platform coverage: you can specify different Python interpreters or different platforms and run tests in parallel on all of them.
  • 24. py.test pytest-xdist Localy : py.test -n5 test_ukrnet.py Distribute: py.test -d --tx socket=192.168.1.102:8888 --rsyncdir mypkg mypkg
  • 25. py.test CI-Travis Travis CI is a hosted continuous integration service. It is integrated with GitHub. Travis CI's build environment provides different runtimes for different languages, for instance multiple versions of Python, Ruby, PHP, Node.js. It also comes preinstalled with a variety of data stores and common tools like message brokers.
  • 26. py.test CI-Travis language: python python: - "2.7" before_install: - "sh -e /etc/init.d/xvfb start" - "export DISPLAY=:99.0" - "wget http://selenium-release.storage.googleapis.com/2.44/selenium-server-standalone-2.44.0.ja - "java -jar selenium-server-standalone-2.44.0.jar > /dev/null &" - "sleep 10" # command to install dependencies install: - "pip install -r requirements.txt" # command to run tests script: py.test
  • 27. py.test SauceLabs https://docs.saucelabs.com/tutorials/python/ from selenium import webdriver sauce_url = "http://YOUR_USERNAME:[email protected]:80/wd/hub" desired_capabilities = { 'platform': "Mac OS X 10.9", 'browserName': "chrome", 'version': "31", } driver = webdriver.Remote(desired_capabilities=desired_capabilities, command_executor=sauce_url) driver.implicitly_wait(10)