Автоматизируем тестирование с помощью 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:

e9308ec8b925e45fbcc1864417e766f2.png

Заключение

Как можно было убедиться в этой статье, автоматизация тестирования с помощью Lettuce не является чрезмерно сложной задачей.  Грамотная связка описания тестовых задач и кода на Python позволяет существенно автоматизировать процесс тестирования.

Больше практических навыков и инструментов для тестирования вы можете получить в рамках практических онлайн-курсов от экспертов отрасли.

© Habrahabr.ru