Автоматизируем тестирование с помощью Lettuce
Для автоматизации проведения тестов QA существует множество различных инструментов, они предлагают разный функционал и обладают различными возможностями.
Lettuce — это инструмент тестирования на Python, который предоставляет высокоуровневый API для написания тестов. Он предоставляет понятный и простой интерфейс API для тестирования с такими функциями, как автоматическое редактирование, шаблоны тестов и многое другое. Lettuce также построен на базе платформы Behavior Driven Development (BDD), которая помогает упростить разработку тестов, предоставляя клиентам общие утверждения BDD, такие как @given или @when.
Вообще методология Behavior-driven development (BDD) — это гибкий инструмент разработки программного обеспечения, в котором приложение документируется и проектируется с учетом поведения, которое пользователь ожидает испытать при взаимодействии с ним. Поощряя разработчиков сосредотачиваться только на требуемом поведении приложения или программы, BDD помогает избежать избыточности кода, ненужных функций или рассеянности.
Возвращаясь к Lettuce отметим, что данное средство поддерживает множество популярных платформ тестирования, таких как pytest, nose и unittest2, но может быть легко интегрировано с любым рабочим процессом, который вы предпочитаете, с помощью таких плагинов, как pytest-plugin-lint, pylint, tox или cProfile.
Основная концепция
Методология BDD, которая в основном используется в Agile разработке, и основана на том же принципе, что и TDD (Test Driven Development, разработка, управляемая тестами), — написание теста перед написанием кода.
Ключевым моментом является не только тестирование с помощью модульного теста, но и комплексное тестирование приложения с помощью приемочных тестов. Процесс можно просто определить как:
Написание тестов, завершающихся ошибками
Написание цикла TDD (Тест завершается неудачей, выполнить его прохождение, реорганизовать код).
Проведение приемочного теста должно пройти успешно
В приемочных тестах используется английский (или, возможно, альтернативный) языковой формат, называемый синтаксисом Gherkin в файле функций, описывающий, что охватывает тест, и сами отдельные тесты.
Gherkin — человеко-читаемый язык для описания поведения системы, который использует отступы для задания структуры документа, (пробелы или символы табуляции). Каждая строчка начинается с одного из ключевых слов и описывает один из шагов. Файл с тестами в свою очередь разбивается на функции, сценарии и входящие в них шаги.
Функция — это короткое, но исчерпывающее описание требуемого функционала. Сценарий, в свою очередь это какая-то определенная бизнес-ситуация, которая его начинает и содержит описание.
Рассмотрим пример.
В первой строке мы приводим функцию теста:
Feature: Google Searching
As a web surfer, I want to search Google, so that I can learn new things.
А здесь уже приводится сам сценарий, в котором мы указываем, что конкретно собираемся делать, какие тесты выполнять.
Scenario: Simple Google search
Given a web browser is on the Google page
When the search phrase «panda» is entered
Then results for «panda» are shown
При этом, каждый сценарий состоит из списка шагов, каждый из которых должен начинаться с одного из ключевых слов (приведем русскоязычные термины):
Дано
Когда
То
Но
И
Шаги «Но» и «И» существуют исключительно для удобства чтения и по своим функциям повторяют ключевое слово, с которого начиналась предыдущая строчка. Описание функционала может содержать в себе один или больше сценариев, и каждый сценарий состоит из одного или более шага.
Разобравшись с синтаксисом Gherkin перейдем непосредственно к написанию тестов.
Установка Lettuce
Для установки Lettuce нам достаточно воспользоваться менеджером пакетов pip:
pip install lettuce lettuce_webdriver nose
Для запуска тестов достаточно просто выполнить команду:
lettuce
Написание тестов
Когда все необходимые компоненты развернуты, мы можем приступить к написанию тестов. В качестве примера мы напишем тест, который будет заходить на веб страницу, вводить учетные данные пользователя и логиниться под ними. Этот файл мы назовем login.feature.
Feature: Test the features of our Login Form
Scenario: Test Login Form
Given I go to "http://crossbrowsertesting.github.io/login-form.html"
The title of the page should become "Login Form - CrossBrowserTesting.com"
And when I fill in "username" with "tester@crossbrowsertesting.com"
And when I fill in "password" with "test123"
When I press "Login"
I should see "You are now logged in!" within 10 seconds
Then the browser should close
В строке, начинающейся с Given мы фиксируем адрес веб ресурса, который необходимо посетить. Действие мы указываем в строке, начинающейся с When. А результат у нас появляется в строке Then.
Это был файл описания. Теперь нам необходимо добавить файл с кодом, который будет выполняться. Этот файл должен называться steps.py
from lettuce import *
from lettuce_webdriver.util import assert_true
from lettuce_webdriver.util import AssertContextManager
from lettuce import step
@step(u'The title of the page should become "([^"]*)"')
def the_title_of_the_page_should_become(step, result):
title = world.browser.title
try:
assert_true(step, title == result)
except AssertionError as e:
world.browser.quit()
@step(u'when I fill in "([^"]*)" with "([^"]*)"')
def when_i_fill_in(step, locator, username):
try:
world.browser.find_element_by_name(locator).sendkeys(username)
except AssertionError as e:
world.browser.quit()
@step(u'When I click "([^"]*)"')
def when_i_press(step, locator):
try:
world.browser.find_element_by_link_text(locator).click()
except AssertionError as e:
world.browser.quit()
@step(u'the browser should close')
def browser_should_close(step):
world.browser.quit()
Мы написали обработчики для каждой строки из нашего сценария и теперь мы практически готовы к тестированию, но нам необходимо еще указать различные параметры, которые должны использоваться при подключении. Lettuce использует python для создания экземпляра RemoteWebDriver, и нам нужно убедиться, что использует наши имена API для выбора конфигурации ОС/браузера.
Для этого создадим файл terrain.py.
from lettuce import *
from selenium import webdriver
import lettuce_webdriver.webdriver
username = ‘you@yourdomain.com' # make sure to change this to your username
authkey = ‘12345' # make sure to change this to your authkey
@before.all
def setUp():
caps = {}
caps['name'] = 'First Lettuce Test'
caps['build'] = '1.0'
caps['browserName'] = 'Firefox' # request the latest version of firefox by default
caps['platform'] = 'Windows 7' # To specify a version, add caps['version'] = 'desired version'
caps['screen_resolution'] = '1024x768'
caps['record_video'] = 'true'
caps['record_network'] = 'false'
world.browser = webdriver.Remote(
desired_capabilities = caps,
command_executor="http://%s:%s@hub.crossbrowsertesting.com:80/wd/hub"%(username, authkey)
)
def tearDown():
world.browser.quit()
Теперь все готово к запуску тестов. В том каталоге, где мы создали наши файлы запустим команду lettuce:
Заключение
Как можно было убедиться в этой статье, автоматизация тестирования с помощью Lettuce не является чрезмерно сложной задачей. Грамотная связка описания тестовых задач и кода на Python позволяет существенно автоматизировать процесс тестирования.
Больше практических навыков и инструментов для тестирования вы можете получить в рамках практических онлайн-курсов от экспертов отрасли.