Игорь Любин -- Об опыте тестирования программного...

Preview:

Citation preview

Об опыте тестирования программного компонента без UI

Игорь Любин, Казань

Вступительное словоНемного о Казани

2

Вступительное словоНемного о себе

3

Закончил КГУ, ФизФак

В тестировании с 2007 г.

Руководитель группы тестирования в iiko

Опыт автоматизации• Selenium, TestComplete• Собственные разработки

Программный компонент– это «кубик» программы

4

Программный компонентПримеры

• API приложений• WEB-сервисы• «Внутренности» приложения

5

Программный компонент– это чёрный ящик

6

Постановка задачиПроект

• Профили пользователей• Лента новостей• Блоги• Друзья, Фотки• Избранное• …

7

Интернет газета с сервисами блогосферы

Постановка задачиПроект развивается

• Профили пользователей• Лента новостей• Блоги• Друзья, Фотки• Избранное, Теги• …

8

Расширяет возможности доступа

Постановка задачиНа проекте идет разработка

9

Появляется API (Программный компонент)

Постановка задачиИмеем картину

• Профили пользователей• Лента новостей• Блоги• Друзья, Фотки• Избранное, Теги• …

10

Постановка задачиНа входе POST запрос

11

• ~40 команд– login / logoff– blog– friends– favorite– …

POST — метод запроса для передачи данных заданному ресурсу

Постановка задачиНа входе POST запрос

12

• ~40 команд• Параметры

/login?username=user@mail.ru&password=123

Пример визуализации POSТ запроса в виде GET

POST — метод запроса для передачи данных заданному ресурсу

Постановка задачиНа выходе JSON

13

• {} – объект• [] – массив

JSON — текстовый формат обмена данными

{ "ключ1" : "значение1", "ключ2" : "значение2"}

Постановка задачиНа выходе JSON

14

• Статус• Данные

{ "status": 0, "data": {"id_user": 1024} }

JSON — текстовый формат обмена данными

Постановка задачиНадо тестировать!?

• Профили пользователей• Лента новостей• Блоги• Друзья, Фотки• Избранное, Теги• …

15

• Уверенность, что API работает

• Обратная совместимость API с моб. клиентом

Постановка задачиПочему надо тестировать API?

16

Для команды разработки API

Постановка задачиПочему надо тестировать API?

• Профили пользователей• Лента новостей• Блоги• Друзья, Фотки• Избранное, Теги• …

17

Для команды разработки моб. клиента

• Пример использования• Документация

Постановка задачиЦель

Проверить работу команд API сервиса

18

РешениеПрограммировать

Тестовый инструмент– Управление набором

тестов– Запуск/остановка– Отчетность– Конфигурирование

19

РешениеИнструмент должен уметь

20

Формировать запрос

Проверять результат

РешениеОрганизация тестов

Отделить тесты от инструмента

21

РешениеИнструмент должен уметь

22

Загружать

тесты

РешениеОрганизация тестов

1 тест = 1 файлСледствие• Управление тестами сводится к управлению файлами

23

РешениеОрганизация тестов

24

Формат тестов задает API

РешениеПример тест-кейса

{ "name" : "Вход пользователя на сайт",

"command" : "login",

"input" : { "username": "user@mail.ru", "password":

"123" },

"assert" : "equal",

"output" : { "status": 0, "data":

{"id_user": 1024} }}

25

РешениеФормирование POST запроса

{ "name" : "Вход пользователя на сайт",

"command" : "login",

"input" : { "username": "user@mail.ru", "password":

"123" },

"assert" : "equal",

"output" : { "status": 0, "data":

{"id_user": 1024} }}

26

/login?username=user@mail.ru&password=123

РешениеПроверка результата

{ "name" : "Вход пользователя на сайт",

"command" : "login",

"input" : { "username": "user@mail.ru", "password":

"123" },

"assert" : "equal",

"output" : { "status": 0, "data":

{"id_user": 1024} }}

27

РешениеПример тест-сценария

{ "testsuite_name" : "Название сценария", "testcases": [ { "name" : "Тест-кейс 1", "command": "login", "input" : {"username":"user@mail.ru","password":"123"}, "output" : {"status": 0, "data": []} }, { "name" : "Тест-кейс 2", "command": "logoff", "input" : {}, "output" : {"status": 0, "data": []} } ]}

28

РешениеТестовый инструмент

29

РешениеФормирование POST запроса

30

РешениеПроверка результата

31

array_diff_assoc($array1, $array2)

РешениеСхема тестового инструмента

32

РешениеЛог

20.06.2010 06:15:49 Run test case: Вход пользователя Request: /login?username=user@mail.ru&password=12320.06.2010 06:15:50 End test case. Response: {"status":0,"data":{"id_user":1024}}20.06.2010 06:15:50 TEST PASSED

33

РешениеЛог

20.06.2010 06:15:49 Run test case: Вход пользователя Request: /login?username=user@mail.ru&password=12320.06.2010 06:15:50 End test case. Response: {"status":1,"data":[]}20.06.2010 06:15:50 TEST FAILED Expected: {"status":0,"data":{"id_user":1024}}

Разница cur-exp: [status => 1] Разница exp-cur: [status => 0]

34

РешениеЛог

20.06.2010 06:15:49 Run test case: Вход пользователя Request: /login?username=user@mail.ru&password=12320.06.2010 06:15:50 End test case. Response: {"status":0,"data":{"id_user":1024}}20.06.2010 06:15:50 TEST PASSED

...

**********************************Time: 268 sec.Tests: 199, Passed: 191, Failed: 8**********************************

35

РезультатСтатистика

36

Время разработки инструмента 14 д.Первая версия инструмента через 5 д.

Время разработки тестов 13 д.Время подготовки документации 2 д.

Количество тест-кейсов ~300Количество тест-сценариев 63

1 д. = 8 ч.

Другие примерыПроект экстрактор

37

Другие примерыПроект сбора статистики

38

РезультатРезюмируем

39

DoRequest() Diff()

Recommended