Lettuce Python
Готовился я как-то к презентации по Behaviour Driven Development, готовил практические примеры по различным тулам и решил показать пример того как можно реализовать BDD с помощью Python. Посмотрел на Behave и на Lettuce см тут. Мой выбор пал на второй инструмент, не знаю почему, видимо потому что тесты писать проще и быстрее. Дабы не быть голословным приведу пример. Начнем с установки. Ставим Python 2.7 (Это ВАЖНО - на Python 3 работать не будет). Ставим lettuce и selenium:
pip install lettuce
pip install selenium
pip install PyHumcrest
Создадим иерархию папок:
lettuce_demo
| features
В корневом каталоге создадим файлик terrain.py, он будет содержать команды, которые будут выполнять на разных стадиях исполнения тестов, в данном случае файл имеет такое содержание:
from lettuce import before, after, world
from selenium import webdriver
from mapping import site_mapping
@before.each_feature
def setup(server):
world.browser = webdriver.Firefox()
world.mapping = site_mapping
@after.all
def tear_down(total):
world.browser.close()
Затем, в корне,создаем файл mapping.py. Этой файл содержит локаторы элементов, такой себе PageObject, только необычный:
host_url = "http://pn.com.ua"
site_mapping = {
"pc_search": {
"url": host_url,
"computers": ".//*[@id='page-content-wrap']/div/div[1]/div/h1[1]/a",
"notebook": ".//*[@id='page-content-wrap']/div[3]/div[1]/div/div[2]/a",
"model_number": ".//*[@id='page-content-wrap']/div[3]/div[1]/div[1]/div/div[2]/div[1]/b"
}
}
В локаторых можно использовать как XPath так и СSS Selectors. В папке features создаем pc.feature - этот файл содержит описание теста.
Feature: search
Scenario: Search pc
Open "pc_search" page
Click "computers"
Click "notebook"
See "2703" in "model_number"
Scenario: Search pc fail
Open "pc_search" page
Click "computers"
Click "notebook"
See "27012" in "model_number"
В создаем features/steps.py - файл содержит описания шагов, используемых в *.feature файлах
from lettuce import step, world
from hamcrest import *
@step(r'Open "(.*)" page')
def should_open_main_page(step, page):
world.current_page = world.mapping[page]
world.browser.get(world.current_page['url'])
@step(u'Click "([^"]*)"')
def click_group1(step, element):
el = world.browser.find_element_by_xpath(world.current_page[element])
el.click()
@step(u'See "([^"]*)" in "([^"]*)"')
def see_group1_in_group2(step, text, element):
el = world.browser.find_element_by_xpath(world.current_page[element])
assert_that(el.text, equal_to(text))
Вот и все. В консоли в корне проекта пишем: lettuce - вуаля видим как запускается браузер и проходят тесты.
Вывод:
-
Lettuce могут использовать как тестировщики так и разработчики.
-
Высокая устойчивость к изменениям в верстке и структуре сайта в целом благодоря mapping.py