Что такое проект по автоматизации тестирования ПО?
Easy selenium test automation on python
1. A U T O M A T E D - T E S T I N G . I N F O
Easy selenium
test automation
on Python
Миша Поляруш
http://automated-testing.info
2. A U T O M A T E D - T E S T I N G . I N F O
Михаил Поляруш
Независимый консультант по
автоматизации тестирования ПО и
тренер
Имею более 7 лет опыта работы в
ИТ сфере
Увлекаюсь личностным развитием,
управлением времени и Python
2
Развитие тестирования и автоматизации
тестирования на территории Украины
http://poliarush.com
http://lessons2.ru
http://automated-testing
3. A U T O M A T E D - T E S T I N G . I N F O
Learn python online
Михаил Поляруш обучает python-у и
автоматизации тестирования на python на
онлайн сервисе практического обучения
http://lessons2.ru
Пройти «Python for testers» (unittests, py.test,
webdriver и т.д.) можно прямо сейчас.
Регистрируйся на http://lessons2.ru и окунись в
мир увлекательного python под чутким
руководством опытного тренера
3
4. A U T O M A T E D - T E S T I N G . I N F O4
COMPUTER PROGRAMMING
FOR EVERYBODY
5. A U T O M A T E D - T E S T I N G . I N F O
Сегодня мы поговорим о …
• Что такое Python?
• Как настроить Python
среду?
• Как сделать первый
Selenium тест на Python?
• Как сделать из простого
теста сложный?
5
6. A U T O M A T E D - T E S T I N G . I N F O
2 минуты простой тест
7
7. 8 A U T O M A T E D - T E S T I N G . I N F O
А за сколько
времени вы
напишите такой
тест?
8. A U T O M A T E D - T E S T I N G . I N F O9
МОЯ ЦЕЛЬ СЕГОДНЯ
Каждый сможет написать маленький тест
автоматизации веб приложения на
python и будет знать куда нужно копать
чтобы сделать python тесты еще лучше!
9. A U T O M A T E D - T E S T I N G . I N F O
Python
10
Python 1.0 - January 1994
Python 2.0 - October 16, 2000
Python 3.0 - December 3, 2008
Guido van Rossum
Middle-layer between shell
scripting and system
programming
СPython, Jython,
IronPython, PyPy
10. A U T O M A T E D - T E S T I N G . I N F O
Компании и проекты
11
11. A U T O M A T E D - T E S T I N G . I N F O15
>>> a = 6 ## set a variable in this interpreter session
>>> a ## entering an expression prints its value
6
>>> a + 2
8
>>> a = 'hi' ## a can hold a string just as well
>>> a
'hi'
>>> len(a) ## call the len() function on a string
2
>>> foo(a) ## try something that doesn't work
Traceback (most recent call last):
File "", line 1, in ?
NameError: name 'foo' is not defined
>>> ctrl-d ## type ctrl-d to exit (ctrl-z on Windows)
12. A U T O M A T E D - T E S T I N G . I N F O
Примеры простых конструкций
18
if speed >= 80:
print 'You are so busted'
else:
print 'Have a nice day'
s = 'hi'
print s[1] # i
print len(s) ## 2
print s + ' there' ## hi there
colors = ['red', 'blue', 'green']
print colors[0] ## red
print colors[2] ## green
print len(colors) ## 3
squares = [1, 4, 9, 16]
sum = 0
for num in squares:
sum += num
print sum ## 30
nums = [1, 2, 3, 4]
squares = [ n * n for n in nums ] ## [1, 4, 9, 16]
result = x if a > b else y
13. A U T O M A T E D - T E S T I N G . I N F O
Пример использования
19
# Echo the contents of a file
f = open('foo.txt', 'rU')
for line in f:
print line
f.close()
## Given a url, try to retrieve it.
def wget(url):
ufile = urllib.urlopen(url) ## get
text = ufile.read() ## read all its text
print text
14. A U T O M A T E D - T E S T I N G . I N F O
program.py
20
#!/usr/bin/python
import sys
# Gather our code in a main() function
def main():
print 'Hello there', sys.argv[1]
if __name__ == '__main__':
main()
def repeat(s, exclaim):
"""Returns the string s repeated 3 times.
If exclaim is true, adds exclamation marks.
"""
result = s + s + s
if exclaim:
result = result + '!!!'
return result
Все выполняется в runtime
Модули запускают код сверху вниз
15. A U T O M A T E D - T E S T I N G . I N F O
Class
21
class MyClass(object):
search = "result"
def my_method(self):
print(self.search)
obj = MyClass()
obj.my_method()
val = obj.search
16. A U T O M A T E D - T E S T I N G . I N F O22
ENVIRONMENT
17. A U T O M A T E D - T E S T I N G . I N F O
Для начала
23
18. A U T O M A T E D - T E S T I N G . I N F O
pip и easy_install
http://pypi.python.org
pip install packagename
easy_install packagename
24
19. A U T O M A T E D - T E S T I N G . I N F O
virtualenv
Делает
изолированный
environment
Не использует
глобальный site-
packages
Не требует root прав
25
$ virtualenv directory
$ virtualenv --
python=/path/to/dir
$ cd directory
$ . bin/activate
$ easy_install whatever
$ pip install whatever
...do stuff...
$ deactivate
21. 28 A U T O M A T E D - T E S T I N G . I N F O
dir(webdriver)
['ActionChains', 'Chrome',
'DesiredCapabilities', …,
'remote']
help(webdriver)
PACKAGE CONTENTS
chrome (package)
common (package)
…
support (package)
VERSION
2.11.0
pip install -U selenium
22. A U T O M A T E D - T E S T I N G . I N F O29
>>> from selenium import webdriver
>>> driver = webdriver.Firefox()
>>> driver.get("http://google.com")
23. A U T O M A T E D - T E S T I N G . I N F O
first_test.py
30
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
browser = webdriver.Firefox() # Get local session of firefox
browser.get("http://www.yahoo.com") # Load page
assert "Yahoo!" in browser.title
elem = browser.find_element_by_name("p") # Find the query box
elem.send_keys("seleniumhq" + Keys.RETURN)
time.sleep(0.2) # Let the page load, will be added to the API
try:
browser.find_element_by_xpath("//a[contains(@href,'http://seleniumhq.org')]")
except NoSuchElementException:
assert 0, "can't find seleniumhq"
browser.close()
24. 33 A U T O M A T E D - T E S T I N G . I N F O
advanced_test.py
def test_search(self,page=YahooHomePage()):
page.open()
page.search = "automated testing"
assert "Test automation" in page.first_link
Читабельность
Поддержка
Простота
25. A U T O M A T E D - T E S T I N G . I N F O
Learn python online
Михаил Поляруш обучает python-у и
автоматизации тестирования на python на
онлайн сервисе практического обучения
http://lessons2.ru
Пройти «Python for testers» (unittests, py.test,
webdriver и т.д.) можно прямо сейчас.
Регистрируйся на http://lessons2.ru и окунись в
мир увлекательного python под чутким
руководством опытного тренера
34
27. 37 A U T O M A T E D - T E S T I N G . I N F O
Декомпозиция
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
browser = webdriver.Firefox() # Get local session of firefox
browser.get("http://www.yahoo.com") # Load page
assert "Yahoo!" in browser.title
elem = browser.find_element_by_name("p") # Find the query box
elem.send_keys("seleniumhq" + Keys.RETURN)
time.sleep(0.2) # Let the page load, will be added to the API
try:
browser.find_element_by_xpath("//a[contains(@href,
'http://seleniumhq.org')]")
except NoSuchElementException:
assert 0, "can't find seleniumhq"
browser.close()
28. 38 A U T O M A T E D - T E S T I N G . I N F O
Singleton
class Wrapper(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Wrapper, cls).__new__(cls, *args, **kwargs)
return cls._instance
def remote_webdriver(self, *args, **kwargs):
self.connection = Firefox()
return self.connection
BaseTestCase
TestCase MyPage
Page
TextElement LinkElement
Element
29. 39 A U T O M A T E D - T E S T I N G . I N F O
class BaseTestCase(unittest.TestCase):
def setUp(self):
self.driver = Wrapper().remote_webdriver()
self.driver.implicitly_wait(10)
def tearDown(self):
self.driver.close()
BaseTestCase
TestCase MyPage
Page
TextElement LinkElement
Element
30. 40 A U T O M A T E D - T E S T I N G . I N F O
class TextElement(Element):
def __set__(self, obj, val):
e = Wrapper().connection.find_element_by_name(self._locator)
e.send_keys(val)
def __get__(self, obj, cls=None):
try:
e = Wrapper().connection.find_element_by_name(self._locator)
return str(e.text)
except Exception, err:
raise err
BaseTestCase
TestCase MyPage
Page
TextElement LinkElement
Element
page.search = "seleniumhq"
my_link = page.first_link
31. 41 A U T O M A T E D - T E S T I N G . I N F O
class GoogleHomePage(object):
_url = "http://google.com"
locators = {
"search":"q",
"result":"(//a[ancestor::div/@id='ires'])[1]"
}
search = TextElement(locators["search"])
first_link = LinkElement(locators["result"])
def open(self):
Wrapper().connection.get(self._url)
BaseTestCase
TestCase MyPage
Page
TextElement LinkElement
Element
32. 42 A U T O M A T E D - T E S T I N G . I N F O
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
browser = webdriver.Firefox()
browser.get("http://google.com")
elem = browser.find_element_by_name("q")
elem.send_keys("test automation")
WebDriverWait(browser, 30).until(
lambda driver: driver.find_element_by_xpath("(//a[ancestor::div/@id='ires'])[1]")
)
first_link = browser.find_element_by_xpath("(//a[ancestor::div/@id='ires'])[1]")
assert "Test automation" in first_link.text
browser.close()
BaseTestCase
TestCase MyPage
Page
TextElement LinkElement
Element
def test_search1(self,page=GoogleHomePage()):
page.open()
page.search = "automated testing"
assert "Test automation" in page.first_link
33. 43 A U T O M A T E D - T E S T I N G . I N F O
34. A U T O M A T E D - T E S T I N G . I N F O
Learn python online
Михаил Поляруш обучает python-у и
автоматизации тестирования на python на
онлайн сервисе практического обучения
http://lessons2.ru
Пройти «Python for testers» (unittests, py.test,
webdriver и т.д.) можно прямо сейчас.
Регистрируйся на http://lessons2.ru и окунись в
мир увлекательного python под чутким
руководством опытного тренера
44
35. A U T O M A T E D - T E S T I N G . I N F O
Библиотеки
• Py.test
• Nose
• PyYaml
• Sphinx
• Harmcrest
• …
45
36. 46 A U T O M A T E D - T E S T I N G . I N F O
Py.test параметризация
# ./test_example.py
def pytest_generate_tests(metafunc):
if "numiter" in metafunc.funcargnames:
for i in range(10):
metafunc.addcall(funcargs=dict(numiter=i))
def test_func(numiter):
assert numiter < 9
37. 49 A U T O M A T E D - T E S T I N G . I N F O
Py.test marks
@py.test.mark.bugs
def test_untitled(self):
sel = self.selenium
C:>py.test -kbugs parameters_tests.py
C:>py.test -k-bugs parameters_tests.py
38. 50 A U T O M A T E D - T E S T I N G . I N F O
Py.test parallel run
C:>py.test –n 10 test.py
39. A U T O M A T E D - T E S T I N G . I N F O
Py.test, а также …
Выгружать результаты в Pocoo pastebin service
Вывод в формате JUnit
Интерактивный дебаг
Прекращение прогона при определенных условиях
Расширенное логирование
Измерение покрытия
и многое другое
51
40. 52 A U T O M A T E D - T E S T I N G . I N F O
Py.yaml
import yaml
class BaseTestCase(unittest.TestCase):
def _read_configuration(self, path="common/conf.yaml"):
return yaml.load(file(path, 'r'))["selenium"]
def setUp(self):
conf = self._read_configuration()
self.selenium = selenium(
conf['host'],
conf['port'],
'*'+conf['browser'],
conf['url'])
self.selenium.start()
selenium:
host: localhost
port: 4444
browser: firefox
url: http://localhost:8082/app/
41. 53 A U T O M A T E D - T E S T I N G . I N F O
Sphinx
42. 54 A U T O M A T E D - T E S T I N G . I N F O
Logging
Continuous
integration
Parameterization
Parallel run
Documentation
Coverage
Debugging
def test_search(self,page=GoogleHomePage()):
page.open()
page.search = "automated testing"
assert "Test automation" in page.first_link
43. A U T O M A T E D - T E S T I N G . I N F O55
• Быстрое развёртывание
• Гибкость языка программирования
• Легкость написания тестов
• Обширное количество дополнительных
библиотек
• Интеграция с другими приложениями и
инструментами
44. A U T O M A T E D - T E S T I N G . I N F O
Что еще ?
• Sikuli
• RobotFramework
• Lettuce
• SST
• Pywinauto
• TextTest
56
45. 57 A U T O M A T E D - T E S T I N G . I N F O
Открой интерпретатор и
напиши Selenium тест на Python
Все что вы увидели дает отличные результаты на практике.
С радостью помогу всем и хочу чтобы питонистов стало
больше
46. A U T O M A T E D - T E S T I N G . I N F O
Learn python online
Михаил Поляруш обучает python-у и
автоматизации тестирования на python на
онлайн сервисе практического обучения
http://lessons2.ru
Пройти «Python for testers» (unittests, py.test,
webdriver и т.д.) можно прямо сейчас.
Регистрируйся на http://lessons2.ru и окунись в
мир увлекательного python под чутким
руководством опытного тренера
58
47. 59 A U T O M A T E D - T E S T I N G . I N F O
Михаил Поляруш
Независимый консультант по
автоматизации тестирования
ПО и тренер
телефон: +380501716246
email: mykhailo.poliarush@gmail.com
skype: mykhailo.poliarush
twitter: @mpoliarush
http://poliarush.com
http://automated-testing.info
http://lessons2.ru