Selenium WebDriver - это набор многофункциональных библиотек, используя которые в вашем проекте вы можете писать GUI-тесты для web-приложений. При этом каждый тест запускается в реальном браузере и команды Selenium позволяют имитировать действия пользователя с web-приложением. Подробнее об установке и настройке Selenium WebDriver можно почитать в статье: "Работа с Selenium Web Driver". А в этой будет показано, как можно написать свой фреймворк на Python для GUI-тестирования используя WebDriver.
Год назад нашей команде была поставлена задача написания фреймворка для GUI-тестирования web-приложения. Требования, которым должен был обладать такой фреймворк в то время:
Структура файлов и каталогов по умолчанию:
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 и т. п.
python tester.py
Настройки по умолчанию можно указать в файле config.py. При запуске тестов можно использовать консольные ключи, перекрывающие действие настроек по умолчанию:
При запуске и исполнении тестов с настройками по умолчанию в каталоге reports появится файл с подробным логом прохождения тестов Test_suites_Log.txt, по которому в конце тестирования будет подготовлен обобщённый репорт с результатами прохождения тестов Test_suite_Summary.txt. В каталог logs будут помещены разобранные по номерам тредов лог-файлы. В каталоге screens появятся скриншоты тестируемых web-страничек, по которым в дальнейшем можно будет определить, что пошло не так.
Обобщая, можно отметить, что при написании с нуля своего фреймворка для функционального 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
Изменения:
Год назад нашей команде была поставлена задача написания фреймворка для 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) # Пример оформления функции - одного шага для теста и обязательные команды в теле функции:
def NameOfFunctionStep(opTimeout=10, instance=0): """ Description. """ try: # Initialization steps for function: page = browsers[instance] startTime = datetime.now() LOGGER.info('Thread #%s, command: NameOfFunctionStep, start time: %s' % (str(instance), FormatTimeString(startTime))) # Insert your steps and actions here. # Finalization steps for function: finishTime = datetime.now() LOGGER.info('Thread #%s, command: NameOfFunctionStep, finish time: %s' % (str(instance), FormatTimeString(finishTime))) LOGGER.info('Thread #%s, command: NameOfFunctionStep, duration: %s' % (str(instance), str(finishTime - startTime))) LOGGER.info('Thread #%s, command: NameOfFunctionStep, status: oK' % str(instance)) if config.takeScreensOnSteps: GetScreen('Thread_%s_command_NameOfFunctionStep_status_oK' % str(instance), instance) return 0 except exceptions.TimeoutException: reportExceptions[instance]['all'] += 1 reportExceptions[instance]['TimeoutException'] += 1 if config.takeScreensOnError: GetScreen('Thread_%s_command_NameOfFunctionStep_status_error' % str(instance), instance) return 1 except exceptions.NoSuchElementException: reportExceptions[instance]['all'] += 1 reportExceptions[instance]['NoSuchElementException'] += 1 if config.takeScreensOnError: GetScreen('Thread_%s_command_NameOfFunctionStep_status_error' % str(instance), instance) return 1 except Exception: reportExceptions[instance]['all'] += 1 LOGGER.error('Thread #%s, command: NameOfFunctionStep, status: error' % str(instance)) LOGGER.exception('Python exception: ') if config.takeScreensOnError: GetScreen('Thread_%s_command_NameOfFunctionStep_status_error' % str(instance), instance) return 1
Запуск тестов
Для пробного запуска можно перейти в основной каталог системы 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 | --URL | URL проекта. |
-e | --takeErrScr | Укажите '-e False' если вы хотите делать скриншоты только при ошибке. |
-a | --takeAllScr | Укажите '-a False' если вы хотите делать скриншоты при любых операциях. |
-s | --sortThreads | Укажите '-s <log-file>' для сортировки некоторого лог-файла по тредам, без запуска тестов. |
Находясь в корне проекта для запуска тестов можно использовать следующие команды:
Для запуска всех тестовых наборов: python tester.py [options] Примеры: python tester.py --cases=[1,2,1,2,1,2] # Запуск измененной последовательности тест-кейсов. Вводятся без пробела. python tester.py -f True # Зациклить прохождение набора тест-кейсов в тест-сьюте. python tester.py -b *ie # Запуск тестов в ie, остальные параметры по умолчанию. python tester.py -b *firefox --threads=2 --rumpUp=5 # Запуск тестов в ff, число потоков 2, время старта 5 сек, остальные параметры по умолчанию. python tester.py --browser='*chrome' -t 1 -r 1 --login=mylogin -p pass # Запуск тестов в chrome, с указанием числа потоков, времени старта, логина и пароля. python tester.py -b *chrome -T 5 # Запуск тестов в хроме с таймаутом операций в 5 сек, остальные операции по умолчанию. python tester.py -b *ie -e True -a False # Запуск тестов в ie, делать скриншоты только при ошибках, остальные операции по умолчанию. python tester.py -u https://google.ru -a False # Запустить тесты с указанием основного URL. python tester.py --sortThreads reports/Log.txt # Отсортировать и разбить указанный лог-файл по тредам. Результат идет в reports/logs/ python tester.py --sortThreads default # Отсортировать стандартный лог-файл по разным тредам. Результат идет в reports/logs/ Для запуска только одного тестового набора в один поток с указанными в config.py настройками по умолчанию: python gui_test_suites.py Для запуска только одного тест-кейса в один поток с указанными в config.py настройками по умолчанию: python tests/test_case_1_Init_test.py
При запуске и исполнении тестов с настройками по умолчанию в каталоге reports появится файл с подробным логом прохождения тестов Test_suites_Log.txt, по которому в конце тестирования будет подготовлен обобщённый репорт с результатами прохождения тестов Test_suite_Summary.txt. В каталог logs будут помещены разобранные по номерам тредов лог-файлы. В каталоге screens появятся скриншоты тестируемых web-страничек, по которым в дальнейшем можно будет определить, что пошло не так.
Пример файла Test_suites_Log.txt:
2013-06-18 18:36:05,448 - INFO: ===== Starting 3 thread(s) of test-suite ===== 2013-06-18 18:36:05,448 - INFO: Thread #0, trying to init next instance of test-suite. 2013-06-18 18:36:05,450 - INFO: Thread #0, new instance of test-suite add to thread list - oK 2013-06-18 18:36:05,450 - INFO: Thread #0, trying to start test-suite in this thread. 2013-06-18 18:36:05,450 - INFO: Thread #0, --- Start test-suite --- 2013-06-18 18:36:05,450 - INFO: Thread #0, test-suite in thread started - oK 2013-06-18 18:36:05,450 - INFO: Thread #0, test-suite start time: 18:36:05 18.06.2013 2013-06-18 18:36:05,450 - INFO: Pause until start next thread... 2013-06-18 18:36:05,450 - INFO: Thread #0, command: OpenBrowser, start time: 18:36:05 18.06.2013 2013-06-18 18:36:06,298 - INFO: Thread #0, command: OpenBrowser, finish time: 18:36:06 18.06.2013 2013-06-18 18:36:06,298 - INFO: Thread #0, command: OpenBrowser, duration: 0:00:00.848000 2013-06-18 18:36:06,298 - INFO: Thread #0, command: OpenBrowser, status: oK 2013-06-18 18:36:06,385 - INFO: Thread #0, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_05_Thread_0/18_06_2013_18_36_06_Thread_0_command_OpenBrowser_status_oK.png 2013-06-18 18:36:06,387 - INFO: Thread #0, TestCase1, start time: 18:36:06 18.06.2013 2013-06-18 18:36:06,387 - INFO: Thread #0, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:06,387 - INFO: Thread #0, command: OpenProjectAndLogin, start time: 18:36:06 18.06.2013 2013-06-18 18:36:07,075 - INFO: Thread #0, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:07,075 - INFO: Thread #0, command: OpenProjectAndLogin, finish time: 18:36:07 18.06.2013 2013-06-18 18:36:07,075 - INFO: Thread #0, command: OpenProjectAndLogin, duration: 0:00:00.689000 2013-06-18 18:36:07,075 - INFO: Thread #0, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:07,194 - INFO: Thread #0, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_05_Thread_0/18_06_2013_18_36_07_Thread_0_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:07,194 - INFO: Thread #0, command: VerifyPageContainsSomeElements, start time: 18:36:07 18.06.2013 2013-06-18 18:36:07,319 - INFO: Thread #0, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_05_Thread_0/18_06_2013_18_36_07_Thread_0_command_VerifyPageContainsSomeElements_status_oK.png 2013-06-18 18:36:07,319 - INFO: Thread #0, TestCase1, finish time: 18:36:07 18.06.2013 2013-06-18 18:36:07,319 - INFO: Thread #0, TestCase1, duration: 0:00:00.932000 2013-06-18 18:36:07,319 - INFO: Thread #0, TestCase1, status: PASS 2013-06-18 18:36:07,319 - INFO: Thread #0, TestCase2, start time: 18:36:07 18.06.2013 2013-06-18 18:36:07,319 - INFO: Thread #0, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:07,319 - INFO: Thread #0, command: OpenProjectAndLogin, start time: 18:36:07 18.06.2013 2013-06-18 18:36:07,450 - INFO: Thread #1, trying to init next instance of test-suite. 2013-06-18 18:36:07,450 - INFO: Thread #1, new instance of test-suite add to thread list - oK 2013-06-18 18:36:07,450 - INFO: Thread #1, trying to start test-suite in this thread. 2013-06-18 18:36:07,450 - INFO: Thread #1, --- Start test-suite --- 2013-06-18 18:36:07,450 - INFO: Thread #1, test-suite in thread started - oK 2013-06-18 18:36:07,450 - INFO: Thread #1, test-suite start time: 18:36:07 18.06.2013 2013-06-18 18:36:07,450 - INFO: Pause until start next thread... 2013-06-18 18:36:07,450 - INFO: Thread #1, command: OpenBrowser, start time: 18:36:07 18.06.2013 2013-06-18 18:36:07,608 - INFO: Thread #0, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:07,608 - INFO: Thread #0, command: OpenProjectAndLogin, finish time: 18:36:07 18.06.2013 2013-06-18 18:36:07,608 - INFO: Thread #0, command: OpenProjectAndLogin, duration: 0:00:00.289000 2013-06-18 18:36:07,608 - INFO: Thread #0, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:07,694 - INFO: Thread #0, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_05_Thread_0/18_06_2013_18_36_07_Thread_0_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:07,694 - INFO: Thread #0, command: CheckSearchPage, start time: 18:36:07 18.06.2013 2013-06-18 18:36:08,404 - INFO: Thread #0, command: CheckSearchPage, finish time: 18:36:08 18.06.2013 2013-06-18 18:36:08,405 - INFO: Thread #0, command: CheckSearchPage, duration: 0:00:00.711000 2013-06-18 18:36:08,405 - INFO: Thread #0, command: CheckSearchPage, status: oK 2013-06-18 18:36:08,559 - INFO: Thread #0, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_05_Thread_0/18_06_2013_18_36_08_Thread_0_command_CheckSearchPage_status_oK.png 2013-06-18 18:36:08,561 - INFO: Thread #0, TestCase2, finish time: 18:36:08 18.06.2013 2013-06-18 18:36:08,561 - INFO: Thread #0, TestCase2, duration: 0:00:01.242000 2013-06-18 18:36:08,561 - INFO: Thread #0, TestCase2, status: PASS 2013-06-18 18:36:08,561 - INFO: Thread #0, TestCase1, start time: 18:36:08 18.06.2013 2013-06-18 18:36:08,561 - INFO: Thread #0, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:08,561 - INFO: Thread #0, command: OpenProjectAndLogin, start time: 18:36:08 18.06.2013 2013-06-18 18:36:08,723 - INFO: Thread #1, command: OpenBrowser, finish time: 18:36:08 18.06.2013 2013-06-18 18:36:08,724 - INFO: Thread #1, command: OpenBrowser, duration: 0:00:01.273000 2013-06-18 18:36:08,724 - INFO: Thread #1, command: OpenBrowser, status: oK 2013-06-18 18:36:08,760 - INFO: Thread #0, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:08,760 - INFO: Thread #0, command: OpenProjectAndLogin, finish time: 18:36:08 18.06.2013 2013-06-18 18:36:08,760 - INFO: Thread #0, command: OpenProjectAndLogin, duration: 0:00:00.200000 2013-06-18 18:36:08,760 - INFO: Thread #0, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:08,813 - INFO: Thread #1, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_07_Thread_1/18_06_2013_18_36_08_Thread_1_command_OpenBrowser_status_oK.png 2013-06-18 18:36:08,815 - INFO: Thread #1, TestCase1, start time: 18:36:08 18.06.2013 2013-06-18 18:36:08,815 - INFO: Thread #1, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:08,815 - INFO: Thread #1, command: OpenProjectAndLogin, start time: 18:36:08 18.06.2013 2013-06-18 18:36:08,858 - INFO: Thread #0, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_05_Thread_0/18_06_2013_18_36_08_Thread_0_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:08,858 - INFO: Thread #0, command: VerifyPageContainsSomeElements, start time: 18:36:08 18.06.2013 2013-06-18 18:36:08,989 - INFO: Thread #0, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_05_Thread_0/18_06_2013_18_36_08_Thread_0_command_VerifyPageContainsSomeElements_status_oK.png 2013-06-18 18:36:08,989 - INFO: Thread #0, TestCase1, finish time: 18:36:08 18.06.2013 2013-06-18 18:36:08,989 - INFO: Thread #0, TestCase1, duration: 0:00:00.428000 2013-06-18 18:36:08,989 - INFO: Thread #0, TestCase1, status: PASS 2013-06-18 18:36:08,989 - INFO: Thread #0, TestCase2, start time: 18:36:08 18.06.2013 2013-06-18 18:36:08,989 - INFO: Thread #0, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:08,989 - INFO: Thread #0, command: OpenProjectAndLogin, start time: 18:36:08 18.06.2013 2013-06-18 18:36:09,171 - INFO: Thread #0, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:09,171 - INFO: Thread #0, command: OpenProjectAndLogin, finish time: 18:36:09 18.06.2013 2013-06-18 18:36:09,171 - INFO: Thread #0, command: OpenProjectAndLogin, duration: 0:00:00.183000 2013-06-18 18:36:09,171 - INFO: Thread #0, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:09,295 - INFO: Thread #0, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_05_Thread_0/18_06_2013_18_36_09_Thread_0_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:09,295 - INFO: Thread #0, command: CheckSearchPage, start time: 18:36:09 18.06.2013 2013-06-18 18:36:09,451 - INFO: Thread #2, trying to init next instance of test-suite. 2013-06-18 18:36:09,451 - INFO: Thread #2, new instance of test-suite add to thread list - oK 2013-06-18 18:36:09,451 - INFO: Thread #2, trying to start test-suite in this thread. 2013-06-18 18:36:09,451 - INFO: Thread #2, --- Start test-suite --- 2013-06-18 18:36:09,451 - INFO: Thread #2, test-suite in thread started - oK 2013-06-18 18:36:09,451 - INFO: Thread #2, test-suite start time: 18:36:09 18.06.2013 2013-06-18 18:36:09,453 - INFO: Pause until start next thread... 2013-06-18 18:36:09,453 - INFO: Thread #2, command: OpenBrowser, start time: 18:36:09 18.06.2013 2013-06-18 18:36:09,737 - INFO: Thread #1, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:09,737 - INFO: Thread #1, command: OpenProjectAndLogin, finish time: 18:36:09 18.06.2013 2013-06-18 18:36:09,737 - INFO: Thread #1, command: OpenProjectAndLogin, duration: 0:00:00.923000 2013-06-18 18:36:09,739 - INFO: Thread #1, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:09,836 - INFO: Thread #1, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_07_Thread_1/18_06_2013_18_36_09_Thread_1_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:09,838 - INFO: Thread #1, command: VerifyPageContainsSomeElements, start time: 18:36:09 18.06.2013 2013-06-18 18:36:09,994 - INFO: Thread #1, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_07_Thread_1/18_06_2013_18_36_09_Thread_1_command_VerifyPageContainsSomeElements_status_oK.png 2013-06-18 18:36:09,994 - INFO: Thread #1, TestCase1, finish time: 18:36:09 18.06.2013 2013-06-18 18:36:09,996 - INFO: Thread #1, TestCase1, duration: 0:00:01.180000 2013-06-18 18:36:09,996 - INFO: Thread #1, TestCase1, status: PASS 2013-06-18 18:36:09,996 - INFO: Thread #1, TestCase2, start time: 18:36:09 18.06.2013 2013-06-18 18:36:09,996 - INFO: Thread #1, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:09,996 - INFO: Thread #1, command: OpenProjectAndLogin, start time: 18:36:09 18.06.2013 2013-06-18 18:36:10,013 - INFO: Thread #0, command: CheckSearchPage, finish time: 18:36:10 18.06.2013 2013-06-18 18:36:10,013 - INFO: Thread #0, command: CheckSearchPage, duration: 0:00:00.718000 2013-06-18 18:36:10,013 - INFO: Thread #0, command: CheckSearchPage, status: oK 2013-06-18 18:36:10,230 - INFO: Thread #0, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_05_Thread_0/18_06_2013_18_36_10_Thread_0_command_CheckSearchPage_status_oK.png 2013-06-18 18:36:10,230 - INFO: Thread #0, TestCase2, finish time: 18:36:10 18.06.2013 2013-06-18 18:36:10,230 - INFO: Thread #0, TestCase2, duration: 0:00:01.242000 2013-06-18 18:36:10,230 - INFO: Thread #0, TestCase2, status: PASS 2013-06-18 18:36:10,233 - INFO: Thread #0, test-suite status: PASS 2013-06-18 18:36:10,233 - INFO: Thread #0, test-suite finish time: 18:36:10 18.06.2013 2013-06-18 18:36:10,233 - INFO: Thread #0, test-suite duration: 0:00:04.784000 2013-06-18 18:36:10,234 - INFO: Thread #0, Trying to publish output results of test-suite in summary file: c:\work\projects\_backup\GUItests/reports/Test_suite_Summary.txt 2013-06-18 18:36:10,240 - INFO: Thread #0, Publish summary file, status: oK 2013-06-18 18:36:10,240 - INFO: Thread #0, command: CloseBrowser, start time: 18:36:10 18.06.2013 2013-06-18 18:36:10,240 - INFO: Thread #0, command: CloseBrowser 2013-06-18 18:36:10,242 - INFO: Thread #1, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:10,243 - INFO: Thread #1, command: OpenProjectAndLogin, finish time: 18:36:10 18.06.2013 2013-06-18 18:36:10,243 - INFO: Thread #1, command: OpenProjectAndLogin, duration: 0:00:00.247000 2013-06-18 18:36:10,243 - INFO: Thread #1, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:10,395 - INFO: Thread #1, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_07_Thread_1/18_06_2013_18_36_10_Thread_1_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:10,395 - INFO: Thread #1, command: CheckSearchPage, start time: 18:36:10 18.06.2013 2013-06-18 18:36:10,446 - INFO: Thread #0, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_05_Thread_0/18_06_2013_18_36_10_Thread_0_command_CloseBrowser_status_oK.png 2013-06-18 18:36:10,463 - INFO: Thread #2, command: OpenBrowser, finish time: 18:36:10 18.06.2013 2013-06-18 18:36:10,463 - INFO: Thread #2, command: OpenBrowser, duration: 0:00:01.010000 2013-06-18 18:36:10,463 - INFO: Thread #2, command: OpenBrowser, status: oK 2013-06-18 18:36:10,609 - INFO: Thread #2, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_09_Thread_2/18_06_2013_18_36_10_Thread_2_command_OpenBrowser_status_oK.png 2013-06-18 18:36:10,611 - INFO: Thread #2, TestCase1, start time: 18:36:10 18.06.2013 2013-06-18 18:36:10,611 - INFO: Thread #2, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:10,611 - INFO: Thread #2, command: OpenProjectAndLogin, start time: 18:36:10 18.06.2013 2013-06-18 18:36:10,688 - INFO: Thread #0, command: CloseBrowser, status: oK 2013-06-18 18:36:11,201 - INFO: Thread #1, command: CheckSearchPage, finish time: 18:36:11 18.06.2013 2013-06-18 18:36:11,201 - INFO: Thread #1, command: CheckSearchPage, duration: 0:00:00.806000 2013-06-18 18:36:11,201 - INFO: Thread #1, command: CheckSearchPage, status: oK 2013-06-18 18:36:11,286 - INFO: Thread #2, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:11,286 - INFO: Thread #2, command: OpenProjectAndLogin, finish time: 18:36:11 18.06.2013 2013-06-18 18:36:11,286 - INFO: Thread #2, command: OpenProjectAndLogin, duration: 0:00:00.675000 2013-06-18 18:36:11,286 - INFO: Thread #2, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:11,362 - INFO: Thread #1, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_07_Thread_1/18_06_2013_18_36_11_Thread_1_command_CheckSearchPage_status_oK.png 2013-06-18 18:36:11,362 - INFO: Thread #1, TestCase2, finish time: 18:36:11 18.06.2013 2013-06-18 18:36:11,364 - INFO: Thread #1, TestCase2, duration: 0:00:01.367000 2013-06-18 18:36:11,364 - INFO: Thread #1, TestCase2, status: PASS 2013-06-18 18:36:11,364 - INFO: Thread #1, TestCase1, start time: 18:36:11 18.06.2013 2013-06-18 18:36:11,364 - INFO: Thread #1, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:11,364 - INFO: Thread #1, command: OpenProjectAndLogin, start time: 18:36:11 18.06.2013 2013-06-18 18:36:11,410 - INFO: Thread #2, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_09_Thread_2/18_06_2013_18_36_11_Thread_2_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:11,410 - INFO: Thread #2, command: VerifyPageContainsSomeElements, start time: 18:36:11 18.06.2013 2013-06-18 18:36:11,614 - INFO: Thread #1, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:11,618 - INFO: Thread #1, command: OpenProjectAndLogin, finish time: 18:36:11 18.06.2013 2013-06-18 18:36:11,618 - INFO: Thread #1, command: OpenProjectAndLogin, duration: 0:00:00.255000 2013-06-18 18:36:11,618 - INFO: Thread #1, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:11,618 - INFO: Thread #2, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_09_Thread_2/18_06_2013_18_36_11_Thread_2_command_VerifyPageContainsSomeElements_status_oK.png 2013-06-18 18:36:11,624 - INFO: Thread #2, TestCase1, finish time: 18:36:11 18.06.2013 2013-06-18 18:36:11,628 - INFO: Thread #2, TestCase1, duration: 0:00:01.013000 2013-06-18 18:36:11,634 - INFO: Thread #2, TestCase1, status: PASS 2013-06-18 18:36:11,634 - INFO: Thread #2, TestCase2, start time: 18:36:11 18.06.2013 2013-06-18 18:36:11,634 - INFO: Thread #2, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:11,634 - INFO: Thread #2, command: OpenProjectAndLogin, start time: 18:36:11 18.06.2013 2013-06-18 18:36:11,740 - INFO: Thread #1, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_07_Thread_1/18_06_2013_18_36_11_Thread_1_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:11,740 - INFO: Thread #1, command: VerifyPageContainsSomeElements, start time: 18:36:11 18.06.2013 2013-06-18 18:36:11,851 - INFO: Thread #2, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:11,851 - INFO: Thread #2, command: OpenProjectAndLogin, finish time: 18:36:11 18.06.2013 2013-06-18 18:36:11,855 - INFO: Thread #2, command: OpenProjectAndLogin, duration: 0:00:00.217000 2013-06-18 18:36:11,861 - INFO: Thread #2, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:11,950 - INFO: Thread #1, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_07_Thread_1/18_06_2013_18_36_11_Thread_1_command_VerifyPageContainsSomeElements_status_oK.png 2013-06-18 18:36:11,954 - INFO: Thread #1, TestCase1, finish time: 18:36:11 18.06.2013 2013-06-18 18:36:11,960 - INFO: Thread #1, TestCase1, duration: 0:00:00.591000 2013-06-18 18:36:11,964 - INFO: Thread #1, TestCase1, status: PASS 2013-06-18 18:36:11,964 - INFO: Thread #1, TestCase2, start time: 18:36:11 18.06.2013 2013-06-18 18:36:11,964 - INFO: Thread #1, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:11,964 - INFO: Thread #1, command: OpenProjectAndLogin, start time: 18:36:11 18.06.2013 2013-06-18 18:36:11,996 - INFO: Thread #2, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_09_Thread_2/18_06_2013_18_36_11_Thread_2_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:12,002 - INFO: Thread #2, command: CheckSearchPage, start time: 18:36:12 18.06.2013 2013-06-18 18:36:12,184 - INFO: Thread #1, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:12,184 - INFO: Thread #1, command: OpenProjectAndLogin, finish time: 18:36:12 18.06.2013 2013-06-18 18:36:12,184 - INFO: Thread #1, command: OpenProjectAndLogin, duration: 0:00:00.219000 2013-06-18 18:36:12,184 - INFO: Thread #1, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:12,309 - INFO: Thread #1, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_07_Thread_1/18_06_2013_18_36_12_Thread_1_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:12,309 - INFO: Thread #1, command: CheckSearchPage, start time: 18:36:12 18.06.2013 2013-06-18 18:36:12,992 - INFO: Thread #2, command: CheckSearchPage, finish time: 18:36:12 18.06.2013 2013-06-18 18:36:12,992 - INFO: Thread #2, command: CheckSearchPage, duration: 0:00:00.990000 2013-06-18 18:36:12,992 - INFO: Thread #2, command: CheckSearchPage, status: oK 2013-06-18 18:36:13,180 - INFO: Thread #1, command: CheckSearchPage, finish time: 18:36:13 18.06.2013 2013-06-18 18:36:13,180 - INFO: Thread #1, command: CheckSearchPage, duration: 0:00:00.871000 2013-06-18 18:36:13,180 - INFO: Thread #1, command: CheckSearchPage, status: oK 2013-06-18 18:36:13,246 - INFO: Thread #2, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_09_Thread_2/18_06_2013_18_36_13_Thread_2_command_CheckSearchPage_status_oK.png 2013-06-18 18:36:13,246 - INFO: Thread #2, TestCase2, finish time: 18:36:13 18.06.2013 2013-06-18 18:36:13,246 - INFO: Thread #2, TestCase2, duration: 0:00:01.613000 2013-06-18 18:36:13,246 - INFO: Thread #2, TestCase2, status: PASS 2013-06-18 18:36:13,246 - INFO: Thread #2, TestCase1, start time: 18:36:13 18.06.2013 2013-06-18 18:36:13,246 - INFO: Thread #2, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:13,246 - INFO: Thread #2, command: OpenProjectAndLogin, start time: 18:36:13 18.06.2013 2013-06-18 18:36:13,348 - INFO: Thread #1, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_07_Thread_1/18_06_2013_18_36_13_Thread_1_command_CheckSearchPage_status_oK.png 2013-06-18 18:36:13,352 - INFO: Thread #1, TestCase2, finish time: 18:36:13 18.06.2013 2013-06-18 18:36:13,358 - INFO: Thread #1, TestCase2, duration: 0:00:01.388000 2013-06-18 18:36:13,358 - INFO: Thread #1, TestCase2, status: PASS 2013-06-18 18:36:13,358 - INFO: Thread #1, test-suite status: PASS 2013-06-18 18:36:13,358 - INFO: Thread #1, test-suite finish time: 18:36:13 18.06.2013 2013-06-18 18:36:13,358 - INFO: Thread #1, test-suite duration: 0:00:05.908000 2013-06-18 18:36:13,358 - INFO: Thread #1, Trying to publish output results of test-suite in summary file: c:\work\projects\_backup\GUItests/reports/Test_suite_Summary.txt 2013-06-18 18:36:13,368 - INFO: Thread #1, Publish summary file, status: oK 2013-06-18 18:36:13,368 - INFO: Thread #1, command: CloseBrowser, start time: 18:36:13 18.06.2013 2013-06-18 18:36:13,368 - INFO: Thread #1, command: CloseBrowser 2013-06-18 18:36:13,588 - INFO: Thread #2, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:13,594 - INFO: Thread #2, command: OpenProjectAndLogin, finish time: 18:36:13 18.06.2013 2013-06-18 18:36:13,598 - INFO: Thread #2, command: OpenProjectAndLogin, duration: 0:00:00.347000 2013-06-18 18:36:13,604 - INFO: Thread #2, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:13,614 - INFO: Thread #1, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_07_Thread_1/18_06_2013_18_36_13_Thread_1_command_CloseBrowser_status_oK.png 2013-06-18 18:36:13,779 - INFO: Thread #2, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_09_Thread_2/18_06_2013_18_36_13_Thread_2_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:13,785 - INFO: Thread #2, command: VerifyPageContainsSomeElements, start time: 18:36:13 18.06.2013 2013-06-18 18:36:13,865 - INFO: Thread #1, command: CloseBrowser, status: oK 2013-06-18 18:36:14,006 - INFO: Thread #2, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_09_Thread_2/18_06_2013_18_36_13_Thread_2_command_VerifyPageContainsSomeElements_status_oK.png 2013-06-18 18:36:14,012 - INFO: Thread #2, TestCase1, finish time: 18:36:14 18.06.2013 2013-06-18 18:36:14,016 - INFO: Thread #2, TestCase1, duration: 0:00:00.765000 2013-06-18 18:36:14,022 - INFO: Thread #2, TestCase1, status: PASS 2013-06-18 18:36:14,026 - INFO: Thread #2, TestCase2, start time: 18:36:14 18.06.2013 2013-06-18 18:36:14,032 - INFO: Thread #2, command: OpenProjectAndLogin - go to project's URL: https://google.ru 2013-06-18 18:36:14,036 - INFO: Thread #2, command: OpenProjectAndLogin, start time: 18:36:14 18.06.2013 2013-06-18 18:36:14,262 - INFO: Thread #2, command: OpenProjectAndLogin, probably you are log in already. 2013-06-18 18:36:14,266 - INFO: Thread #2, command: OpenProjectAndLogin, finish time: 18:36:14 18.06.2013 2013-06-18 18:36:14,272 - INFO: Thread #2, command: OpenProjectAndLogin, duration: 0:00:00.230000 2013-06-18 18:36:14,276 - INFO: Thread #2, command: OpenProjectAndLogin, status: oK 2013-06-18 18:36:14,424 - INFO: Thread #2, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_09_Thread_2/18_06_2013_18_36_14_Thread_2_command_OpenProjectAndLogin_status_oK.png 2013-06-18 18:36:14,430 - INFO: Thread #2, command: CheckSearchPage, start time: 18:36:14 18.06.2013 2013-06-18 18:36:15,242 - INFO: Thread #2, command: CheckSearchPage, finish time: 18:36:15 18.06.2013 2013-06-18 18:36:15,246 - INFO: Thread #2, command: CheckSearchPage, duration: 0:00:00.812000 2013-06-18 18:36:15,252 - INFO: Thread #2, command: CheckSearchPage, status: oK 2013-06-18 18:36:15,477 - INFO: Thread #2, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_09_Thread_2/18_06_2013_18_36_15_Thread_2_command_CheckSearchPage_status_oK.png 2013-06-18 18:36:15,483 - INFO: Thread #2, TestCase2, finish time: 18:36:15 18.06.2013 2013-06-18 18:36:15,487 - INFO: Thread #2, TestCase2, duration: 0:00:01.456000 2013-06-18 18:36:15,493 - INFO: Thread #2, TestCase2, status: PASS 2013-06-18 18:36:15,497 - INFO: Thread #2, test-suite status: PASS 2013-06-18 18:36:15,503 - INFO: Thread #2, test-suite finish time: 18:36:15 18.06.2013 2013-06-18 18:36:15,507 - INFO: Thread #2, test-suite duration: 0:00:06.051000 2013-06-18 18:36:15,513 - INFO: Thread #2, Trying to publish output results of test-suite in summary file: c:\work\projects\_backup\GUItests/reports/Test_suite_Summary.txt 2013-06-18 18:36:15,542 - INFO: Thread #2, Publish summary file, status: oK 2013-06-18 18:36:15,548 - INFO: Thread #2, command: CloseBrowser, start time: 18:36:15 18.06.2013 2013-06-18 18:36:15,552 - INFO: Thread #2, command: CloseBrowser 2013-06-18 18:36:15,759 - INFO: Thread #2, Screenshot created: c:\work\projects\_backup\GUItests/reports/screens/18_06_2013_18_36_09_Thread_2/18_06_2013_18_36_15_Thread_2_command_CloseBrowser_status_oK.png 2013-06-18 18:36:15,948 - INFO: Thread #2, command: CloseBrowser, status: oK
Пример файла Test_suite_Summary.txt:
--- Summary Report for Test-suite by threads --- Report date and time: 18:36:15 18.06.2013 Options for all threads: - case sequence in test-suite: [1, 2, 1, 2] - project's URL: https://google.ru - browser string: *chrome - operation's timeout (sec.): 10 - threads of test suite: 3 - rump up period (sec.): 6 - take screens on error: True - take screens on steps: True Thread #0 last timeStart: 2013-06-18 18:36:05.450000 last timeStop: 2013-06-18 18:36:10.234000 last duration: 0:00:04.784000 last testStatus: PASS Summary exception's statistic for thread #0: all: 0 TimeoutException: 0 NoSuchElementException: 0 Thread #1 last timeStart: 2013-06-18 18:36:07.450000 last timeStop: 2013-06-18 18:36:13.358000 last duration: 0:00:05.908000 last testStatus: PASS Summary exception's statistic for thread #1: all: 0 TimeoutException: 0 NoSuchElementException: 0 Thread #2 last timeStart: 2013-06-18 18:36:09.452000 last timeStop: 2013-06-18 18:36:15.503000 last duration: 0:00:06.051000 last testStatus: PASS Summary exception's statistic for thread #2: all: 0 TimeoutException: 0 NoSuchElementException: 0
Обобщая, можно отметить, что при написании с нуля своего фреймворка для функционального 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
Изменения:
- Упрощены шаблоны тестов, в них не нужно больше следить за правильностью оформления сообщений от тестов. Архитектура и логика тестирования осталась прежней.
- Добавлен параметр конфига timeToStopTests: время в секундах до принудительной остановки тестов, после выхода на заданную мощность.
- Добавлен параметр конфига loggerInfoLevel: позволяет установить уровень логирования сообщений.
- Улучшена функция Cleaner(): теперь она отслеживает и закрывает незавершившиеся тестовые процессы.
- Рефакторинг функций.
Не забывайте обновлять драйвера браузеров и прикладывать собственный профиль firefox в соответствующих каталогах!