Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[ru] Backend Testing Intro

alexvox
April 21, 2016

[ru] Backend Testing Intro

alexvox

April 21, 2016
Tweet

More Decks by alexvox

Other Decks in Education

Transcript

  1. Тестирование бэкенда и что такое API Алексей Вовк, руководитель группы

    тестирования Школа автоматизации тестирования 2016
  2. Содержание • Зачем нужен бэкенд? • Что такое API? •

    Спецификации API • Форматы данных • Тестирование бэкенда через его API 4
  3. • Внутренняя логика • Сложные вычисления • Запросы в базу

    данных, другие сервисы • … Бэкенд 6 Backend Frontend • Взаимодействие с пользователем
  4. API. Спецификации 17 Wie geht es lhnen? Sehr gut Как

    ваше ничего? Норм How are you today? Great! Английский Русский Немецкий
  5. REST 30 Объект GET PUT POST DELETE /database /table Получаем

    записи таблицы Создаем таблицу Изменяем таблицу Удаляем таблицу REST API table database
  6. Форматы данных 32 Э т о т т е к

    с т д о л ж н о б ы т ь н е у д о б н о ч и т а т ь
  7. JSON (JavaScript Object Notation) { “cat”: “white” } { “age”:

    5 } { “weight”: 8.2 } { “names”: [“kitty”, “missis”, “bad”] } 35
  8. JSON { “type”: “persian”, “measures”: { “length”: 45 “height”: 22

    “weight”: 8 }, “color”: { “main”: “white” “spots”: “brown” } } 36
  9. API • API – для общения программ между собой •

    Спецификация API – набор правил, «язык» на котором общаются программы • Формат данных – в каком виде передаются данные 37
  10. 40

  11. > < HTTP/1.1 401 UNAUTHORIZED < Server: nginx < Date:

    Wed, 16 Mar 2016 16:25:47 GMT < Content-Type: application/json < Content-Length: 99 < Connection: keep-alive < Access-Control-Allow-Origin: * < Access-Control-Allow-Headers: Accept-Language, Accept, X-HTTP-Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Credentials: true < {"message":"Не авторизован.","description":"Unauthorized", "error":"UnauthorizedError"}
  12. OAuth авторизация 51 App A • Только чтение • Выдан

    до 01.01.2018 App B • Только запись • Выдан до 15.04.2017 App C • Полный доступ • Выдан бессрочно
  13. > < HTTP/1.1 200 OK < Server: nginx < Date:

    Wed, 16 Mar 2016 16:30:59 GMT < Content-Type: application/json; charset=utf-8 < Content-Length: 165 < Connection: keep-alive < Vary: Accept-Encoding < Access-Control-Allow-Origin: * < Access-Control-Allow-Headers: Accept-Language, Accept, X-HTTP- Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Methods: GET, OPTIONS < Access-Control-Allow-Credentials: true < {"trash_size":0,"total_space":10737418240,"used_space":83291316,"s ystem_folders":{"applications":"disk:/Приложения","downloads":"dis k:/Загрузки/"}}
  14. 55

  15. 56

  16. 57

  17. 58

  18. 59

  19. 60

  20. > < HTTP/1.1 200 OK …………………………………………………………………………………………………………………………………………………………………………… < Access-Control-Allow-Origin: * <

    Access-Control-Allow-Headers: Accept-Language, Accept, X-HTTP- Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Methods: GET, OPTIONS < Access-Control-Allow-Credentials: true < { "system_folders": { "applications": "disk:/Приложения", "downloads": "disk:/Загрузки/" }, "total_space": 10737418240, "trash_size": 0, "used_space": 83291316 }
  21. > < HTTP/1.1 200 OK …………………………………………………………………………………………………………………………………………………………………………………………… < Access-Control-Allow-Origin: * <

    Access-Control-Allow-Headers: Accept-Language, Accept, X-HTTP-Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Methods: PUT, PATCH, DELETE, GET, OPTIONS < Access-Control-Allow-Credentials: true < { "created": "2016-03-15T17:43:48+00:00", "md5": "0c2fdbeced2f07c68e8ddc85698ea643", "media_type": "document", "mime_type": "text/plain", "modified": "2016-03-15T17:43:48+00:00", "name": "myfile.txt", "path": "disk:/folder1/myfile.txt", "size": 126976, "type": "file" }
  22. > < HTTP/1.1 200 OK ……………………………………………………………………………………………………………………………………………………… < Access-Control-Allow-Origin: * <

    Access-Control-Allow-Headers: Accept-Language, Accept, X-HTTP-Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Methods: PUT, PATCH, DELETE, GET, OPTIONS < Access-Control-Allow-Credentials: true < { "name": "myfile.txt" }
  23. URLEncode • В url’е передаем только латинские символы • Остальные

    символы заменяем на соответствующий им код 69 @ %40
  24. ~$ curl -v -H 'Authorization: OAuth fe2cb3fc66e34eb4910137cae4ca9bc8' 'https://cloud- api.yandex.ru/v1/disk/resources/?path=/folder1/ myfile&1.txt'

    | python -m json.tool ~$ curl -v -H 'Authorization: OAuth fe2cb3fc66e34eb4910137cae4ca9bc8' 'https://cloud- api.yandex.ru/v1/disk/resources/?path=/folder1/ myfile%261.txt' | python -m json.tool myfile&1 myfile%261
  25. ~$ curl -v -H 'Authorization: OAuth fe2cb3fc66e34eb4910137cae4ca9bc8' 'https://cloud- api.yandex.ru/v1/disk/resources/?path=/folder1/ myfile

    1.txt' | python -m json.tool ~$ curl -v -H 'Authorization: OAuth fe2cb3fc66e34eb4910137cae4ca9bc8' https://cloud- api.yandex.ru/v1/disk/resources/?path=/folder1/ myfile%201.txt | python -m json.tool myfile 1 myfile%201
  26. ~$ curl -v -H 'Authorization: OAuth fe2cb3fc66e34eb4910137cae4ca9bc8' 'https://cloud- api.yandex.ru/v1/disk/resources/?path=/folder1/ мой

    файл.txt' ~$ curl -v -H 'Authorization: OAuth fe2cb3fc66e34eb4910137cae4ca9bc8' 'https://cloud- api.yandex.ru/v1/disk/resources/?path=/folder1/ %D0%BC%D0%BE%D0%B9%20%D1%84%D0%B0%D0%B9%D0%BB.txt' мой файл %D0%BC%D0%BE%D0%B9%20%D1%84%D0%B0%D0%B9%D0%BB
  27. > < HTTP/1.1 200 OK < Access-Control-Allow-Origin: * < Access-Control-Allow-Headers:

    Accept-Language, Accept, X-HTTP-Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Methods: PUT, PATCH, DELETE, GET, OPTIONS < Access-Control-Allow-Credentials: true < { "created": "2016-03-15T17:43:48+00:00", "md5": "0c2fdbeced2f07c68e8ddc85698ea643", "media_type": "document", "mime_type": "text/plain", "modified": "2016-03-15T17:43:48+00:00", "name": "myfile.txt", "path": "disk:/folder1/myfile.txt", "size": 126976, "type": "file" } Код ответа Заголовки Тело ответа
  28. > < HTTP/1.1 200 OK < Access-Control-Allow-Origin: * < Access-Control-Allow-Headers:

    Accept-Language, Accept, X-HTTP-Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Methods: PUT, PATCH, DELETE, GET, OPTIONS < Access-Control-Allow-Credentials: true < { "created": "2016-03-15T17:43:48+00:00", "md5": "0c2fdbeced2f07c68e8ddc85698ea643", "media_type": "document", "mime_type": "text/plain", "modified": "2016-03-15T17:43:48+00:00", "name": "myfile.txt", "path": "disk:/folder1/myfile.txt", "size": 126976, "type": "file" } Код ответа Заголовки Тело ответа
  29. Коды ответов • 1xx – информационные • 2xx – успех

    • 3xx – перенаправление • 4xx – ошибка клиента • 5xx – ошибка сервера 80
  30. 81

  31. > < HTTP/1.1 200 OK < Access-Control-Allow-Origin: * < Access-Control-Allow-Headers:

    Accept-Language, Accept, X-HTTP-Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Methods: PUT, PATCH, DELETE, GET, OPTIONS < Access-Control-Allow-Credentials: true < { "created": "2016-03-15T17:43:48+00:00", "md5": "0c2fdbeced2f07c68e8ddc85698ea643", "media_type": "document", "mime_type": "text/plain", "modified": "2016-03-15T17:43:48+00:00", "name": "myfile.txt", "path": "disk:/folder1/myfile.txt", "size": 126976, "type": "file" } Код ответа Заголовки Тело ответа
  32. > < HTTP/1.1 200 OK < Access-Control-Allow-Origin: * < Access-Control-Allow-Headers:

    Accept-Language, Accept, X-HTTP-Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Methods: PUT, PATCH, DELETE, GET, OPTIONS < Access-Control-Allow-Credentials: true < { "created": "2016-03-15T17:43:48+00:00", "md5": "0c2fdbeced2f07c68e8ddc85698ea643", "media_type": "document", "mime_type": "text/plain", "modified": "2016-03-15T17:43:48+00:00", "name": "myfile.txt", "path": "disk:/folder1/myfile.txt", "size": 126976, "type": "file" } Код ответа Заголовки Тело ответа
  33. { "created": "2016-03-15T17:43:48+00:00", "md5": "0c2fdbeced2f07c68e8ddc85698ea643", "media_type": "document", "mime_type": "text/plain", "modified":

    "2016-03-15T17:43:48+00:00", "name": "myfile.txt", "path": "disk:/folder1/myfile.txt", "size": 126976, "type": "file" }
  34. 85

  35. { "created": "2016-03-15T17:43:48+00:00", "md5": "0c2fdbeced2f07c68e8ddc85698ea643", "media_type": "document", "mime_type": "text/plain", "modified":

    "2016-03-15T17:43:48+00:00", "name": "myfile.txt", "path": "disk:/folder1/myfile.txt", "size": 126976, "type": "file" }
  36. 87

  37. 88

  38. > < HTTP/1.1 405 METHOD NOT ALLOWED < Server: nginx

    < Date: Wed, 16 Mar 2016 16:55:52 GMT < Content-Type: application/json < Content-Length: 126 < Connection: keep-alive < Access-Control-Allow-Origin: * < Access-Control-Allow-Headers: Accept-Language, Accept, X-HTTP- Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Credentials: true < { "description": "Method Not Allowed", "error": "MethodNotAllowedError", "message": "Метод не поддерживается." }
  39. ~$ curl -v -X POST -H 'Authorization: OAuth fe2cb3fc66e34eb4910137cae4ca9bc8' 'https://cloud-api.yandex.ru/v1/disk

    /resources/move?from=/folder1/letsmoveit.mp3 &path=/folder2/letsmoveit.mp3' | python -m json.tool
  40. > < HTTP/1.1 201 CREATED < Server: nginx < Date:

    Wed, 16 Mar 2016 17:00:09 GMT < Content-Type: application/json; charset=utf-8 < Content-Length: 135 < Connection: keep-alive < Access-Control-Allow-Origin: * < Access-Control-Allow-Headers: Accept-Language, Accept, X-HTTP-Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Methods: POST, OPTIONS < Access-Control-Allow-Credentials: true < { "href": "https://cloud- api.yandex.ru/v1/disk/resources?path=disk%3A%2Ffolder2%2Fletsmoveit.mp3" , "method": "GET", "templated": false }
  41. ~$ curl -v -X GET -H 'Authorization: OAuth fe2cb3fc66e34eb4910137cae4ca9bc8' 'https://cloud-api.yandex.ru/v1/disk/resources

    ?path=/folder2/letsmoveit.mp3' | python -m json.tool Проверяем, что операции действительно выполняются
  42. > < HTTP/1.1 200 OK ……………………………………………………………………………………………………………………………………………………………………………………………… < Access-Control-Allow-Origin: * <

    Access-Control-Allow-Headers: Accept-Language, Accept, X-HTTP-Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Methods: PUT, PATCH, DELETE, GET, OPTIONS < Access-Control-Allow-Credentials: true < { "created": "2016-03-16T12:42:31+00:00", "md5": "a89533ef839242ded6545c78551b3217", "media_type": "audio", "mime_type": "audio/mpeg", "modified": "2016-03-16T12:42:31+00:00", "name": "letsmoveit.mp3", "path": "disk:/folder2/letsmoveit.mp3", "size": 126976, "type": "file" }
  43. > < HTTP/1.1 404 NOT FOUND ……………………………………………………………………………………………………………………………………………………… < Access-Control-Allow-Origin: *

    < Access-Control-Allow-Headers: Accept-Language, Accept, X-HTTP-Method, X-Requested-With, Content-Type, Authorization < Access-Control-Allow-Credentials: true < { "description": "Resource not found.", "error": "DiskNotFoundError", "message": "Не удалось найти запрошенный ресурс." }
  44. ~$ curl -v -X POST -H 'If-Match: 0' -H 'Authorization:

    OAuth 0419096515ab425bb755bc330f343353' 'https://cloud- api.yandex.ru/v1/data/user/databases/mydb/deltas' -d '{"delta_id": "1", "changes": [{"record_id": "1", "collection_id": "123", "change_type": "insert", "changes": [{"change_type": "set", "field_id": "myfield", "value": {"string": "test"}}]}],}'
  45. > < HTTP/1.1 201 CREATED < Server: nginx < Date:

    Thu, 17 Mar 2016 12:52:17 GMT < Content-Type: application/json; charset=utf-8 < Content-Length: 128 < Connection: keep-alive < Access-Control-Allow-Methods: POST, GET, OPTIONS < Access-Control-Expose-Headers: ETag < ETag: 1 < Access-Control-Allow-Credentials: true < Access-Control-Allow-Origin: * < Access-Control-Allow-Headers: Accept-Language, Accept, X-HTTP-Method, X- Requested-With, Content-Type, Authorization < { "href": "https://cloud- api.yandex.ru/v1/data/user/databases/mydb/deltas?base_revision=1", "method":"GET", "templated":false }
  46. { "created": "2016-03-17T12:50:24.820000+00:00", "database_id": "mydb", "modified": "2016-03-17T12:52:17.410000+00:00", "records": { "items":

    [ { "collection_id": "123", "fields": [ { "field_id": "myfield", "value": { "string": "test", "type": "string" } } ], "record_id": "1", "revision": 1 } ] }, "records_count": 1, "revision": 1 }
  47. curl. Структура curl [-Опции] -X Метод -H 'Заголовок: Значение' …

    'URI?Параметр=Значение&Параметр=Значение…' -d 'Тело запроса' 103
  48. Проверяем • Входные и выходные данные • Граничные значения и

    классы эквивалентности • Бэкенд не живет сам по себе • Операция действительно выполнена 104
  49. Полезные ссылки Описание curl: http://bit.ly/yaqa-curl Про Swagger: http://bit.ly/yaqa-swagger Пример Swagger’а

    от разработчиков: http://bit.ly/yaqa-swagger-demo Документирование API с помощью RAML: http://bit.ly/yaqa-raml REST vs. SOAP: http://bit.ly/yaqa-rest-soap Потренироваться делать запросы в API Яндекс.Диска: http://bit.ly/yaqa-poligon Описание работы с базами данных DataSync API: http://bit.ly/yaqa-datasync Видео о REST API Яндекс.Диска и разработке REST вообще: http://bit.ly/yaqa-disk-rest-video 105