Применение behave+webdriver для тестирования web-проектов
TRANSCRIPT
6
Behave
BDD фреймворк для тестирования на python. Поддержка большого числа языков для
описания feature-файлов. Возможно добавить пред- и пост-действия,
выполняемые относительно шага, сценария, функциональности или всего запуска.
Возможно отмечать отдельные функциональности и сценарии тэгами.
7
Структура файлов
features_selenium/
├── 0.positions_and_rights.feature
├── 1.institutions_and_preiods.feature
├── environment.py
├── __init__.py
├── steps
│ ├── constants.py
│ ├── edo.py
│ ├── __init__.py
│ ├── settings.py
│ └── webservice.py
├── z.webservice.feature
8
environment.py
before_step, after_step before_scenario, after_scenario before_feature, after_feature before_tag, after_tag before_all, after_all
9
Пример
def before_all(context): context.personal_area_interface = False
context.firefox_binary = FirefoxBinary(firefox_path=settings.FIREFOX_BIN)
context.settings = settings
10
Состав feature-файла
Описание тестируемого функционала. Описание предусловий, если есть. Описание сценария. Описание шагов.
11
ПримерФункционал: Авторизация
Предыстория:
Дано страница приветствия
Сценарий: авторизация супер-администратора
Если Ввести в поле login_login значение admin
И Ввести в поле login_password значение admin
И Авторизоваться в системе, нажав кнопку Войти на странице приветствия
То откроется страница рабочего стола
12
Обработка шаговСценарий: Список классов Если нажать на кнопку выбора в поле "Предмет / Группа (Класс)" То откроется окно "Выбор группы учеников"_____________________________________________
@when(u'нажать на кнопку выбора в поле "Предмет / Группа (Класс)"')
def step(context): url = get_action_url('select_window_action') resp = get_response_with_status_200(context, url) title = "title:'Выбор группы учеников" window_title = resp.content[resp.content.find(title):resp.content.find(
title)+len(title)] context.acd['window_title'] = window_title
@then(u'откроется окно "Выбор группы учеников"')def step(context): assert 'Выбор группы учеников' in context.acd['window_title']
13
Сценарий: Авторизация Когда я ввожу логин "admin" и пароль "admin" И нажимаю кнопку "Войти" То мне открывается страница личного кабинета
_______________________________________
@when(u'я ввожу логин "{login}" и пароль "{password}"')
def step(context, login, password): context.login = login context.password = password
15
Типичный шаг Если в поле Дата с окна Классный журнал установить
значение 16.03.2015
_______________________________________________________
@step(u'в поле {field_label} окна {win_name} установить значение {value}')
def step_find_and_fill_field(context, field_label, win_name, value):
win = get_win_object(context, win_name) field = win.get_field_by_name(field_label) field.set_value(value)
17
Page Elements
Объект окна Объект текстового поля Объект поля ввода даты Объект кнопки Объект грида
18
Windowclass Window(object):
def __init__(self, win_id, title, driver): self.win_id = win_id self.title = title self.driver = driver # Словарь вида {field_label: field_id} self.fields_init_data = {} # Словарь вида {field_label: FieldObj} self.init_fields = {} self.__init_win_fields() ...
19
Window
def close(self): self.driver.execute_script(u""" Ext.getCmp('{0}').close() """.format(self.win_id))
20
Window
def get_field_by_name(self, field_label): if field_label in self.init_fields: return self.init_fields[field_label] else: self.__init_field(field_label) return self.init_fields[field_label]
21
Field
class Field(object):
def __init__(self, field_id, driver, field_label=None):
self.field_id = field_id self.label = field_label self.driver = driver ...
22
Field
def set_value(self, value): self.field_object.click() self.field_object.clear() self.field_object.send_keys(value) self.field_object.send_keys(Keys.ENTER)
25
Зависимость тестов
class UserFact(factory.django.DjangoModelFactory): class Meta: model = 'myapp.User' django_get_or_create = ('username',)
username = 'john'
26
Параллельный запуск тестов
Число потоков
Определяем feature-файлы для каждого потока
Запускаемbehave
27
Что получилось
С помощью FactoryBoy создали начальные данные, что позволило делать независимыми тесты отдельной функциональности.
Параллельный запуск позволил снизить время прохождения тестов.
28
Полезные ссылки
http://pythonhosted.org/behave/ - behave документация
http://selenium-python.readthedocs.io/ - python + selenium webdriver
https://factoryboy.readthedocs.io - FactoryBoy документация