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