71

Тестирование безDOMных объектов

  • Upload
    sqalab

  • View
    363

  • Download
    1

Embed Size (px)

DESCRIPTION

Доклад Алексея Емелина на конференции SQA Days-12, 30 ноября-1 декабря, Минск

Citation preview

Page 1: Тестирование безDOMных объектов
Page 2: Тестирование безDOMных объектов

Алексей Емелин Инженер по автоматизации тестирования

Тестирование безDOMных объектов современных веб-интерфейсов

Page 3: Тестирование безDOMных объектов

3

Современные веб-интерфейсы

http://www.lw-zone.org/word/

<html>! <head>! …! </head>! <body>! …! <canvas>! </canvas>! …! </body>!</html>!

Page 4: Тестирование безDOMных объектов

4

Результат работы API Яндекс.Карт

DOM-элементы

безDOMные элементы (canvas)

Page 5: Тестирование безDOMных объектов

5

Этапы тестирования

Интерфейс  

Page 6: Тестирование безDOMных объектов

6

Этапы тестирования

Интерфейс  

unit  тесты  

Page 7: Тестирование безDOMных объектов

7

Этапы тестирования

Интерфейс  

unit  тесты  

ручные  тесты  

Page 8: Тестирование безDOMных объектов

8

Этапы тестирования

Интерфейс  

unit  тесты  

ручные  тесты  

авто  тесты  

Page 9: Тестирование безDOMных объектов

9

Требования к автоматизации

• Запуск тестов во всех популярных браузерах

Page 10: Тестирование безDOMных объектов

10

Требования к автоматизации

• Запуск тестов во всех популярных браузерах

• Взаимодействие с JavaScript API

Page 11: Тестирование безDOMных объектов

11

Требования к автоматизации

• Запуск тестов во всех популярных браузерах

• Взаимодействие с JavaScript API

• Взаимодействие с пользовательским интерфейсом (DOM, CANVAS)

Page 12: Тестирование безDOMных объектов

12

Требования к автоматизации

• Запуск тестов во всех популярных браузерах

• Взаимодействие с JavaScript API

• Взаимодействие с пользовательским интерфейсом (DOM, CANVAS)

• Проверка визуального отображения

Page 13: Тестирование безDOMных объектов

13

Требования к автоматизации

• Запуск тестов во всех популярных браузерах

• Взаимодействие с JavaScript API

• Взаимодействие с пользовательским интерфейсом (DOM, CANVAS)

• Проверка визуального отображения

• Отслеживание JavaScript ошибок

Page 14: Тестирование безDOMных объектов

Запуск тестов во всех популярных браузерах

Page 15: Тестирование безDOMных объектов

15

Запуск тестов во всех популярных браузерах. WebDriver

• Нативный интерфейс для взаимодействия с браузером

Page 16: Тестирование безDOMных объектов

16

• Нативный интерфейс для взаимодействия с браузером

• Есть для всех популярных браузеров

Запуск тестов во всех популярных браузерах. WebDriver

Page 17: Тестирование безDOMных объектов

17

• Нативный интерфейс для взаимодействия с браузером

• Есть для всех популярных браузеров

• Поиск элемента в DOM-дереве по имени, по названию класса, по id, по css или xpath селектору и взаимодействие с ним

Запуск тестов во всех популярных браузерах. WebDriver

Page 18: Тестирование безDOMных объектов

18

• Нативный интерфейс для взаимодействия с браузером

• Есть для всех популярных браузеров

• Поиск элемента в DOM-дереве по имени, по названию класса, по id, по css или xpath селектору и взаимодействие с ним

• Чтение и запись параметров DOM-элемента

Запуск тестов во всех популярных браузерах. WebDriver

Page 19: Тестирование безDOMных объектов

19

• Нативный интерфейс для взаимодействия с браузером

• Есть для всех популярных браузеров

• Поиск элемента в DOM-дереве по имени, по названию класса, по id, по css или xpath селектору и взаимодействие с ним

• Чтение и запись параметров DOM-элемента

• Выполнение JavaScript кода

Запуск тестов во всех популярных браузерах. WebDriver

Page 20: Тестирование безDOMных объектов

20

Требования к автоматизации

• Запуск тестов во всех популярных браузерах

• Взаимодействие с JavaScript API

• Взаимодействие с пользовательским интерфейсом (DOM, CANVAS)

• Проверка визуального отображения

• Отслеживание JavaScript ошибок

Page 21: Тестирование безDOMных объектов

Взаимодействие с JavaScript API

Page 22: Тестирование безDOMных объектов

22

Выполнение JS кода.

JavascriptExecutor js =(JavascriptExecutor) driver;!!String script = "return map.getCenter();";!!Float[] center = js.executeScript(script);!

Page 23: Тестирование безDOMных объектов

23

Требования к автоматизации

• Запуск тестов во всех популярных браузерах

• Взаимодействие с JavaScript API

• Взаимодействие с пользовательским интерфейсом (DOM, CANVAS)

• Проверка визуального отображения

• Отслеживание JavaScript ошибок

✓ ✓

Page 24: Тестирование безDOMных объектов

Взаимодействие с пользовательским интерфейсом

Page 25: Тестирование безDOMных объектов

25

Элементы веб-интерфейса

DOM-элементы

безDOMные элементы (canvas)

Page 26: Тестирование безDOMных объектов

26

Структура карты

подложка

Page 27: Тестирование безDOMных объектов

27

Структура карты

подложка

слой графики

Page 28: Тестирование безDOMных объектов

28

Структура карты

подложка

слой графики

слой событий

Page 29: Тестирование безDOMных объектов

29

Структура карты

подложка

слой графики

слой событий

слой контролов

Page 30: Тестирование безDOMных объектов

30

Хотспоты

слой графики

!RenderedGeometry: {! type: "Circle",! coordinates: [141, 208],!

!radius: 40! } !

слой событий

Page 31: Тестирование безDOMных объектов

31

Взаимодействие с безDOMными объектами

Page 32: Тестирование безDOMных объектов

32

Взаимодействие с безDOMными объектами

Page 33: Тестирование безDOMных объектов

33

Взаимодействие с безDOMными объектами

Page 34: Тестирование безDOMных объектов

34

Работа с сеткой

click(11, 11);

11

11

Ширина клетки: 32

x = 11 * 32 + 32 / 2 y = 11 * 32 + 32 / 2

click(368, 368);

Page 35: Тестирование безDOMных объектов

35

Способы взаимодействия с интерфейсом

• DOM-элемент – классический подход

• БезDOMный элемент – координатный подход

Два различных подхода – это слишком!

Page 36: Тестирование безDOMных объектов

36

Выбираем элемент для клика

document.elementFromPoint(x, y)!

Page 37: Тестирование безDOMных объектов

37

Требования к автоматизации

• Запуск тестов во всех популярных браузерах

• Взаимодействие с JavaScript API

• Взаимодействие с пользовательским интерфейсом (DOM, CANVAS)

• Проверка визуального отображения

• Отслеживание JavaScript ошибок

✓ ✓ ✓

Page 38: Тестирование безDOMных объектов

Проверка визуального представления

Page 39: Тестирование безDOMных объектов

39

Проверка визуального представления

Как проверить содержимое canvas?

DOM-элементы

безDOMные элементы(canvas)

Page 40: Тестирование безDOMных объектов

40

Проверка canvas через JS объект

var placemark = new ymaps.Placemark([54, -8]);!var options = placemark.options;!var style = options.get(‘preset’); !

placemark !

А если разработчик ошибся?

Page 41: Тестирование безDOMных объектов

41

Проверка canvas через пиксели

var pixel = canvas.getImageData(x, y, 1, 1).data; !

Не лучший вариант

Page 42: Тестирование безDOMных объектов

42

Проверка canvas сравнением скриншотов 1.  Подготовить эталонное изображение

2.  Сравнить проверяемое с эталоном

3.  ???

4.  PROFIT эталон.png тест.png

Page 43: Тестирование безDOMных объектов

43

Проблемы работы с эталоном

• Редактируем сценарий теста – создаем новый эталон

Page 44: Тестирование безDOMных объектов

44

Проблемы работы с эталоном

• Редактируем сценарий теста – создаем новый эталон

• Информация, меняющаяся со временем

Page 45: Тестирование безDOMных объектов

45

Проблемы работы с эталоном

• Редактируем сценарий теста – создаем новый эталон

• Информация, меняющаяся со временем

• Разные браузеры – разные скриншоты

Page 46: Тестирование безDOMных объектов

46

Проблемы работы с эталоном

• Редактируем сценарий теста – создаем новый эталон

• Информация, меняющаяся со временем

• Разные браузеры – разные скриншоты

Page 47: Тестирование безDOMных объектов

47

Генерируем эталоны на лету

Запускаем

• в то же время

Page 48: Тестирование безDOMных объектов

48

Генерируем эталоны на лету

Запускаем

• в то же время

• в той же версии браузера

Page 49: Тестирование безDOMных объектов

49

Генерируем эталоны на лету

Запускаем

• в то же время

• в той же версии браузера

•  тот же тест

Page 50: Тестирование безDOMных объектов

50

Генерируем эталоны на лету

Запускаем

• в то же время

• в той же версии браузера

•  тот же тест

•  с проверенной версией АПИ

Page 51: Тестирование безDOMных объектов

51

Проверка визуального отображения

сравниваем

testing production

Page 52: Тестирование безDOMных объектов

52

Требования к автоматизации

• Запуск тестов во всех популярных браузерах

• Взаимодействие с JavaScript API

• Взаимодействие с пользовательским интерфейсом (DOM, CANVAS)

• Проверка визуального отображения

• Отслеживание JavaScript ошибок

✓ ✓ ✓ ✓

Page 53: Тестирование безDOMных объектов

Отслеживание JavaScript ошибок

Page 54: Тестирование безDOMных объектов

54

Отслеживание JavaScript ошибок

window.onerror = function(message, url, line){}

Page 55: Тестирование безDOMных объектов

55

Разные хосты – разный текст ошибок

http://clck.ru/28EY9

Тот же хост

Другой хост

Page 56: Тестирование безDOMных объектов

56

Решение проблемы описания JS ошибок

•  http://enable-cors.org/

Access-Control-Allow-Origin: *!Access-Control-Allow-Origin: http://testhost.ru !

Page 57: Тестирование безDOMных объектов

57

FirefoxProfile ffProfile = new FirefoxProfile(); JavaScriptError.addExtension(ffProfile); !final WebDriver driver = new FirefoxDriver(ffProfile); !!driver.get("http://somesite"); !!final List<JavaScriptError> jsErrors = !JavaScriptError.readErrors(driver); !

assertTrue(jsErrors.toString(), jsErrors.isEmpty());!

Если нет доступа к серверу

•  https://github.com/mguillem/JSErrorCollector

Page 58: Тестирование безDOMных объектов

58

Требования к автоматизации

• Запуск тестов во всех популярных браузерах

• Взаимодействие с JavaScript API

• Взаимодействие с пользовательским интерфейсом (DOM, CANVAS)

• Проверка визуального отображения

• Отслеживание JavaScript ошибок

✓ ✓ ✓ ✓ ✓

Page 59: Тестирование безDOMных объектов

Архитектура

Page 60: Тестирование безDOMных объектов

60

Архитектура тестирования

*.html

Java движок

•  карта •  описание теста •  сценарий теста

•  выполнение теста •  проверка результатов •  построение отчета

Page 61: Тестирование безDOMных объектов

61

<!doctype html>!<!--(description)!проверяем опцию ZIndex!-->!<!--(version)!2.0.13!-->!<!--(commands)!click(12, 11); // кликаем по объекту!test();!drag([10, 0], [14, 0]); // перетаскиваем метку!test();!-->!<html>! <head>!! ! !<script src=“/dynamic_api_loader.js"></script>!

<script type="text/javascript">! function init(ymaps){! myMap = new ymaps.Map(‘map’);! ...!

html. Что внутри?

Page 62: Тестирование безDOMных объектов

62

тест движок

Page 63: Тестирование безDOMных объектов

63

Доступные команды

• mousedown(x, y) • mouseup(x, y) •  click(x, y) • dblclick(x, y) • mouseover(x, y) • mouseout(x, y) • mousemove(x, y)

•  test() •  center(lat, long) •  zoom(z) •  sleep(s) • drag([x1, y1], [x2, y2])

Page 64: Тестирование безDOMных объектов

64

click(10, 0); sleep(1000);

Page 65: Тестирование безDOMных объектов

65

click(10, 0); sleep(1000); click(8, 7); sleep(1000);

Page 66: Тестирование безDOMных объектов

66

click(10, 0); sleep(1000); click(8, 7); sleep(1000); test();

Page 67: Тестирование безDOMных объектов

67

Эталон Версия для проверки Разница

Page 68: Тестирование безDOMных объектов

68

click(0, 15); test();

Page 69: Тестирование безDOMных объектов

69

Эталон Версия для проверки Разница

Page 70: Тестирование безDOMных объектов

70

Итого

• Рабочий прототип системы автоматического тестирования

• Удовлетворяющий требованиям: –  Запуск тестов во всех популярных браузерах

–  Взаимодействие с JavaScript API

–  Взаимодействие с пользовательским интерфейсом (DOM, CANVAS)

–  Проверка визуального отображения

–  Отслеживание JavaScript ошибок

Page 71: Тестирование безDOMных объектов

Емелин Алексей

Инженер по автоматизации тестирования

[email protected] twitter:aemelin