1. Введение
Данной статья является введением в такую интересную и, на сегодняшний момент весьма актуальную тему, как автоматизация web-приложений. Я постараюсь рассказать как и с помощью каких инструментов можно научиться писать автотесты. Вы запустите готовые тесты и увидите как они работают на самом деле. В конце статьи вы можете найти полезные для вас ссылки.
2. Давайте уже начнем
Для написания автотестов мы будет использовать связку Selenium + Toolium + Behave. В нашем случае, наиболее удобно будет писать тесты в IDE Pycharm Professional edition, поскольку в ней присутствует поддержка Behave. Вы можете скачать ее с официального сайта и использовать бесплатно в течение 30 дней, тем не менее, вы также можете запустить тесты и в Community edition прочитав данное руководство. Я же воспользуюсь Visual Studio Code, поскольку так вам будет проще всего следовать за мной.
3. Тестовый шаблон
Если вы уже установили Visual Studio Code или PyCharm, то вам понадобиться скачать тестовый шаблон с GitHub. Нажмите Clone or download, а затем Download ZIP.
Распакуйте архив в удобное для вас место и откройте извлеченную папку в вашем редакторе.
4. Environment
Нам понадобиться установить некоторые зависимости, перечисленные в файле requirements.txt. Если вы не хотите устанавливать их глобально, не забудьте создать и активировать виртуальное окружение.
Чтобы создать виртуальное окружение, откройте терминал, используя комбинацию клавиш Ctrl+~ или нажав в меню VS Code на Terminal -> New Terminal. Затем введите
python -m venv env
или
python3 -m venv env
Вы увидите новую папку env у себя в проекте.
Для активации окружения, введите в терминал
source env/bin/activate
Если вы все сделали правильно, то в терминале появится (env) слева от предложения к вводу новой команды. Для деактивации окружения используйте
deactivate
5. Requirements
Для установки необходимых зависимостей введите в терминал следующую команду:
pip3 install -r "requirements.txt"
или
pip install -r "requirements.txt"
6. Скачиваем web driver
Для запуска автотестов нам понадобиться установить web driver. Если вы используете Chrome в качестве основного браузера, то скачайте chromedriver с учетом версии вашего браузера (у меня, например, версия 76.0.3809.87), для Firefox скачайте geckodriver. Вы также можете самостоятельно найти подходящий web driver в случае, если вы используете другой браузер: iexplore, edge, safari или opera.
После того как вы скачали web driver, вам нужно будет вставить путь до вашего файла в конфигурационный файл в вашем проекте. Откройте папку conf, затем файл properties.cfg. Найдите строчку chrome_driver_path или аналогичную ей с учетом вашего браузера и вставьте туда путь до web driver-а. На Linux это может выглядеть, например так:
chrome_driver_path: /usr/local/bin/chromedriver
В Windows путь к драйверу может выглядеть примерно так:
C:\\Files\\chromedriver.exe
Не забудьте указать в поле type название вашего браузера. Если у вас chrome, то ничего менять не нужно, в противном случае, просто скопируйте соответствующее название вашего браузера из 2 строки конфигурационного файла.
7. Запускаем тесты
На этом этапе мы уже сделали все приготовления и можем попробовать запустить тесты.
7.1 Scenario
Откройте файл login.feature в папке feature вашего проекта. В нем вы увидите 2 готовых теста, каждый из которых начинается с ключевого слова Scenario за которым следует двоеточие и название теста. В верхней части файла есть ключевое слово Feature и ее название.
7. 2 Feature
Feature - это то, что позволяет вам сгруппировать тесты, относящиеся к какой-то конкретной части ваше приложения, будь то логин, фильтрация, покупка товара и тому подобное. В feature файле вы можете написать тесты на естественном языке, по умолчанию используется английский язык, но если вы введете в терминал следующую команду:
behave --lang-list
то получите список всех поддерживаемых языков, их тут немало.
Для смены языка, например на русский, введите в терминал:
behave --lang=ru
В конце статьи вы найдете ссылку, если вдруг захотите использовать русский язык.
Остальные ключевые слова, которые тут остались (но далеко не все) - это Given, When, Then и And.
7.3 Given, When, Then, And.
Ключевое слово Given позволяет вам описать то, что дано или, другими словами, предусловия теста.
В секции When описываются действия, совершаемые пользователем.
Then - это результаты, то, что должно произойти когда пользователь выполнит шаги When.
Ключевое слово And позволяет добавить дополнительные шаги в любую из секций, либо вы можете написать, например, 2 предусловия, используя повторно слово Given, вместо Given + And.
Вы не обязаны следовать четкой структуре Given, When, Then и можете опустить те ключевые слова которые не требуются для вашего теста.
7.4 Behave
Теперь, когда мы прояснили некоторые моменты, давайте запустим все тесты, которые у нас находятся в feature файле. Для этого введите в терминал следующую команду и нажмите Enter:
behave
Эта команда запустить тесты во всех feature файлах, а так как у нас только 1 такой файл, то будут запущены тесты только из login.feature.
Если же вы хотите запустить все тесты из конкретного feature файла, вы можете воспользоваться примерно такой командой:
behave -i login.feature
А для запуска определенного теста, такой:
behave -n "successful login"
Где, successful login - это, как вы уже поняли, полное название вашего теста, т.е. то, что идет после "Scenario: ".
8. Как это работает
Но как python понимает, что он должен открыть страничку с определенным url, заполнить логин и пароль ?
К сожалению, языки программирования еще не настолько далеко ушли вперед, чтобы делать за нас всю работу, поэтому, для каждой строки вашего теста, будь-то Given, Then, When или And необходимо написать реализацию - шаги.
8.1 Steps
Все шаги находятся в папке steps; в нашем случае там лежит файл login.py который и отвечает за реализацию всех шагов наших тестов из login.feature (к слову, мы не обязаны называть его login.py, просто в данном случае, так более явно прослеживается связь с login.feature).
В login.py вы можете увидеть 4 реализованных шага, хотя в feature файле их 7. Очевидно, что написав 1 раз реализацию для конкретного шага вашего теста, вы можете использовать её в другом тесте.
А для еще большей гибкости, вы можете передать параметры из feature файла в step-ы как это сделано ниже.
8.2 Contex
Вы могли заметить, что у каждого step-а есть параметр contex. Это глобальная переменная, которую вы можете использовать для передачи информации между вашими step-ами, посредством присоединения к ней любых атрибутов, например, current_page. Current_page это не какое-то зарезервированное имя, а просто удобное название, которое мы решили использовать в качестве атрибута у переменной contex для хранения текущей web страницы. Аналогичным образом мы могли бы присоединить, например, атрибут actual_result:
contex.actual_result = "результат вашей-тестируемой функции"
И сравнить его с ожидаемым результатом в другом шаге, например в том, который реализует Then:
context.actual_result == какой-то expected_result
8.3 url
Мы еще не успели заглянуть в папку pageobjects и сегодня уже делать этого не будем. Но чтобы завершить эту вводную статью, я хочу отметить еще один момент.
Если вы самостоятельно захотите изучить папку pajeobjects, то найдете нам вот такую строчку:
self.driver.get('{}/login'.format(self.config.get('Test', 'url')))
Эта строчка открывает соответствующую web страничку. На место {} подставляется значение переменной url, которую вы сможете найти в вашем конфигурационном файле properties.cfg в папке conf в конце файла в разделе [Test].
Вы можете дописать в этот раздел еще одну переменную, например так:
[Test]
url: http://the-internet.herokuapp.com
url_google: https://www.google.com
Тогда открыть другую страничку будет так же просто:
self.driver.get('{}'.format(self.config.get('Test', 'url_google')))
Заметьте, что я удалил /login, поскольку в переменной url_google уже содержится тот адрес, который нам нужен и добавлять к нему еще и /login привело бы к ошибке, ведь такой странички не существует, можете сами проверить -> https://www.google.com/login.
Заключение
Спасибо, что дочитали до конца. Ставьте лайки и подписывайтесь на мой канал.
Если какой-то шаг выполнить у вас не получилось - не сдавайтесь. Попробуйте найти решение самостоятельно, наверняка вы сможете отыскать более подробный ответ в интернете и в следующий раз уже будете знать решений данной проблемы.
Полезные ссылки
3. Бесплатный курс по Selenium на Stepik.org
6. Chromedriver
7. Geckodriver
9. CrazyPython