пятница, 31 мая 2013 г.

Python + Selenium WebDriver: фреймворк для тестирования web-приложений

Selenium WebDriver - это набор многофункциональных библиотек, используя которые в вашем проекте вы можете писать GUI-тесты для web-приложений. При этом каждый тест запускается в реальном браузере и команды Selenium позволяют имитировать действия пользователя с web-приложением. Подробнее об установке и настройке Selenium WebDriver можно почитать в статье: "Работа с Selenium Web Driver". А в этой будет показано, как можно написать свой фреймворк на Python для GUI-тестирования используя WebDriver.

Год назад нашей команде была поставлена задача написания фреймворка для GUI-тестирования web-приложения. Требования, которым должен  был обладать такой фреймворк в то время:
  • он должен был позволять запускать несколько браузеров для тестирования в отдельных потоках;
  • он должен был иметь библиотеку стандартных действий над тестируемым приложением;
  • тест-кейсы должны иметь единый формат;
  • фреймворк должен был позволять объединять тест-кейсы в тест-сьюты, иметь как единый способ их запуска через раннер, так и отдельными файлами;
  • он должен был иметь подсистему вывода отчетов, содержащих достаточно информации о прохождении тестов, в том числе, делать скриншоты для GUI-тестов.

Архитектура фреймворка

Была разработана следующая архитектура для фреймворка:


Структура файлов и каталогов по умолчанию:

GUItests - корень проекта.
        /tests - пакет, в которых хранятся отдельные тест-кейсы.
                test_case_1_Init_test.py - один тест-кейс, составленный из отдельных шагов.
        /ff_profile - каталог с необходимым профилем для mozilla.
        /reports - каталог с логами и результатами.
        /screens - каталог со скриншотами.
                /<date_time>_thread## - каталоги со скриншотами для различных тредов.
                <date_time>_thread##_Step_<name>_command_<name>_status_<status>.png - скриншот.
        readme.txt - описание по использованию тестовой системы
        config.py - сюда вынесены все глобальные настройки для тестов.
        steps_Lib.py - библиотека шагов для тестов и вспомогательных функций.
        gui_Test_suite.py - здесь описывается тест-сьют, в котором вызываются кейсы.
        tester.py - скрипт для многопоточного запуска тест-сьютов с настройками из config.py.

Добавлять свои тестовые шаги и вспомогательные функции необходимо в библиотеку steps_Lib.py. Начинать имена тестовых шагов лучше по смыслу: GoTo, Edit, Verify, Click и т. п.

NameOfFunctionStep(opTimeout=10, instance=0)  # Пример оформления функции - одного шага для теста и обязательные команды в теле функции:

Запуск тестов

Для пробного запуска можно перейти в основной каталог системы GUItests и, используя 64-битный Python, дать команду:
python tester.py

Настройки по умолчанию можно указать в файле config.py. При запуске тестов можно использовать консольные ключи, перекрывающие действие настроек по умолчанию:

КлючСлово        Описание
-h
--helpПоказать подсказку по опциям.
-c--casesИзменить набор тест-кейсов в тест-сьюте. Строка чисел через запятую, без пробела.
-f--flagToRepeatФлаг для зацикливания последовательности тест-кейсов в тест-сьюте. Укажите 'True' для зацикливания.
-b
--browser
Строка браузера (*firefox, *chrome, *ie), показывающая, какой браузер запустить.
-t
--threadsЧисло потоков для параллельного запуска.
-r
--rumpUpПериод (сек.), в течении которого все потоки должны быть запущены.
-l
--loginЛогин пользователя.
-p
--passwordПароль пользователя.
-T
--timeoutТаймаут операций в сек.
-u
--URLURL проекта.
-e
--takeErrScrУкажите '-e False' если вы хотите делать скриншоты только при ошибке.
-a
--takeAllScrУкажите '-a False' если вы хотите делать скриншоты при любых операциях.
-s
--sortThreadsУкажите '-s <log-file>' для сортировки некоторого лог-файла по тредам, без запуска тестов.

Находясь в корне проекта для запуска тестов можно использовать следующие команды:

При запуске и исполнении тестов с настройками по умолчанию в каталоге reports появится файл с подробным логом прохождения тестов Test_suites_Log.txt, по которому в конце тестирования будет подготовлен обобщённый репорт с результатами прохождения тестов Test_suite_Summary.txt. В каталог logs будут помещены разобранные по номерам тредов лог-файлы. В каталоге screens появятся скриншоты тестируемых web-страничек, по которым в дальнейшем можно будет определить, что пошло не так.

Пример файла Test_suites_Log.txt:

Пример файла Test_suite_Summary.txt:

Обобщая, можно отметить, что при написании с нуля своего фреймворка для функционального GUI-тестирования, приходится продумывать множество мелочей, начиная от формата тестов и заканчивая подсистемой вывода отчётов. Такой фреймворк не лишен недостатков: он получился громоздким, имеет сложную структуру тестовых функций, но тем не менее его  можно брать за основу и использовать при разработке своей тестовой системы, заменяя и добавляя при необходимости свои параметры. Он был успешно использован при  тестировании одного из продуктов компании Positive Technologies.

В одной из следующих статей будет показано, как можно использовать функциональность стандартной библиотеки python unittest и написать на его основе более мощный и устойчивый фреймворк для любых видов функциональных тестов, а не только для тестирования GUI, причем он будет обладать более продвинутой подсистемой контроля за тестами и более  гибкой подсистемой отчетов. Наработки из данной статьи, библиотека шагов и Selenium WebDriver, легко могут быть перенесены и в новый фреймворк.



Актуальный код GUItests, версий старше 1.1, на GitHub:
https://github.com/Tim55667757/GUItests

Версия GUItests 1.0 доступна архивом по ссылке:
https://docs.google.com/file/d/0B-1rf8K04ZS5UzlwWEpMMVhVR3c/edit?usp=sharing

Скачать архив с полным примером отчёта по тестированию можно также по ссылке:
https://docs.google.com/file/d/0B-1rf8K04ZS5LW1QUnNXVEFxZU0/edit?usp=sharing

Драйвера браузеров для Selenium WebDriver можно найти на страничке:
http://docs.seleniumhq.org/download/

upd, 21.07.2013: Версия GUItests 1.1 доступна архивом по ссылке:
https://docs.google.com/file/d/0B-1rf8K04ZS5cEhvYXk0R0dzTDQ/edit?usp=sharing
Изменения:
  1. Упрощены шаблоны тестов, в них не нужно больше следить за правильностью оформления сообщений от тестов. Архитектура и логика тестирования осталась прежней.
  2. Добавлен параметр конфига timeToStopTests: время в секундах до принудительной остановки тестов, после выхода на заданную мощность.
  3. Добавлен параметр конфига loggerInfoLevel: позволяет установить уровень логирования сообщений.
  4. Улучшена функция Cleaner(): теперь она отслеживает и закрывает незавершившиеся тестовые процессы.
  5. Рефакторинг функций.
Не забывайте обновлять драйвера браузеров и прикладывать собственный профиль firefox в соответствующих каталогах!