QaApi
взгляд на тестирование с другой стороны баррикад
Дмитрий Марущенко
Badoo - это про знакомства...
...и про технологии
У нас было 2 веб-сайта, 4 разных мобильных платформы
и целое море различных версий мобильных приложений,
а также версия для мобильных браузеров и приложения в
социальных сетях. Не то что бы все это было
категорически необходимо для бизнеса, но если уж
начали делать социальную сеть, то становится трудно
остановиться. Единственное, что вызывало у меня
опасения - это релизы вечером в пятницу. Нет ничего
более беспомощного, безответственного и испорченного,
чем пятничный релиз. Я знал, что рано или поздно мы
перейдем и эту грань.
“
”
Начнем издалека
Знаете, что самое важное на этом плане?
Знаете, что самое важное на этом плане?
?
Знаете, что самое важное на этом плане?
Короткие пути!
Пользователь получает дайджест
непрочитанных сообщений письмом
на электронную почту не чаще раза в
неделю*.
Типичный тест-кейс
“
”
* Пример выдуманный! :)
Как будем тестировать?
● регистрируемся
● … проходит неделя
● получаем письмо
● ждем ещё неделю
● получаем письмо
● PROFIT?
Поищем короткий
путь?
Эволюция обращений к программистам:
“Подкрутите мне в базе…”
1. “А сделайте мне, чтоб дата отправки
последнего письма была больше
недели назад?”
2. “А скажите, где в базе хранится дата
отправки, я вручную изменю?”
3. “А давайте сделаем интерфейс, где
каждый сможет менять дату?”
4. “А запилите нам API?”
Все любят короткие пути!
Почему именно API?
Чем это лучше веб-интерфейса?
Calabash
Система тестирования
мобильных приложений,
основанная на Ruby и Cucumber.
Автотесты
Selenium
Мощный инструмент
автоматизации
браузеров.
Эти инструменты легко интегрировать с API, но очень сложно - с веб-интерфейсом:
Интеграционные
тесты
Тестирование клиент-серверного
взаимодействия.
Как это работает
дай мне нового юзера
да пожалуйста!
добавь ему фото
нет проблем!
и дату регистрации смени
как скажешь, хозяин!
registerNewUser(age=25)
{success:true, user_id:123, name:Alex, login:test123, passwd:Aj8SD8}
addPhoto(count=1)
{success: true}
setRegistrationDate(date=2014-02-12)
{success: true}
Что оно должно уметь?
Зависит от вашего проекта. У каждого - своё API.
Наше API умеет:
● регистрировать, изменять и удалять юзеров
● голосовать за пользователей
● отправлять сообщения
● включать/выключать платные услуги
● добавлять “кредиты”
● загружать и “модерировать” фотки
● давать информацию (например свойства юзера)
● и всякое другое
● все функции в одном месте
● простота протокола
● страничка помощи
● система авторизации
● управление тестовыми юзерами
● безопасность “боевых” данных
Что мы хотим получить?
А что под капотом?
Keep it simple
http://qaapi.example.com/setRegistrationDate?user_id=123&date=20140612
{
"status": "success",
"user": {
"user_id": "123",
"registration_date": "2014-06-12",
}
}
Простой HTTP-запрос:
Ответ в формате JSON:
Страница помощи
В QaApi есть страничка помощи, где перечислены все имеющиеся методы
(описание, возможные аргументы и тип возвращаемого значения).
Эта страничка генерируется автоматически из исходного кода QaApi.
Ручной режим
Интеграция с существующей системой доступа
для сотрудников, с возможностью управлять
полномочиями.
Авторизация
Автоматизация
Сущестует несколько простых подходов:
1. Секретный ключ в HTTP-заголовке
2. HTTP Basic Auth
3. Логин-пароль в параметрах запроса
GET /methodName?foo=bar HTTP/1.1
Host: qaapi.example.com
Connection: keep-alive
X-Secret-Header : abcdEfg76kGkljhJHk92
GET /methodName?foo=bar HTTP/1.1
Host: qaapi.example.com
Connection: keep-alive
Authorization : Basic cdEfа3GkljhJHk54==
GET /methodName? login=test&pass=123 HTTP/1.1
Host: qaapi.example.com
Connection: keep-alive
Тестовые пользователи
Для тестирования постоянно требуются
пользователи с разными свойствами.
Создавать новых юзеров
+ юзер “чистый”
+ его никто не использует
+ можно делать что хотим и не чистить
− быстро плодятся
− нужно готовить к тесту
Где их взять?
Использовать заранее созданных
+ юзер готов к тесту
+ юзеров немного
− нужно чистить
− может использоваться кем-то ещё
− подходящего юзера может не быть
VS
Наше решение - пул юзеров
Цикл жизни тестового юзера в пуле
Ждет в пуле Используется
Очистка “Использован”
Создан Может быть изменен
в процессе теста
Не может быть
использован
повторно до очистки
registerUser()
Регистрация юзеров
Регистрируем Ж, 25 лет,
Москва
Есть такой
юзер?
Создать нового юзера
Добавить в пулВзять из пула
нет
да
Добавлен с
параметрами
Ж, 25, Москва
registerUser()
Указываем только
существенные для
нас параметры
Создание новых юзеров - только тогда, когда подходящего нет в пуле.
Так как пользователь “новый”, необходимо
подготовить его к тесту, например:
● сменить дату регистрации
● добавить фото, сообщения и т.д.
● добавить и подтвердить номер телефона
● и т. д.
Все это делается с помощью QaApi
Подготовка юзеров
Подготовка юзера с помощью QaApi
Схема подготовки юзера
http://qaapi.example.com/registerUser?gender=F&age=25&location=Moscow
# {"success": true, "user_id": 123, "login": "testuser123", "passwd": "Qa6G9v"}
http://qaapi.example.com/uploadPhotos?user_id=123&count=1
# {"success": true}
http://qaapi.example.com/setRegistrationDate?user_id=123&date=2014-02-12
# {"success": true}
Было:
Сценарии QaApi на Lua
http://qaapi.example.com/registerUser?gender=F&age=25
# {"success": true, "user_id": 123, "login": "testuser123", "passwd": "Qa6G9v"}
http://qaapi.example.com/setRegistrationDate?user_id=123&date=2014-02-12
Copy user_id
Paste user_id
Стало:
user = qaapi("registerUser",{gender="F", age=25,location="Moscow"})
# {"success": true, "user_id": 123, "login": "testuser123", "passwd": "Qa6G9v"}
qaapi("setRegistrationDate",{user_id=user["user_id"], date="2014-02-12"})
Немного о процессе очистки пользователей
Наш путь:
● очистка - набор предопределенных шагов
● на каждое “сохраняемое состояние” - свой шаг очистки
(примеры: сообщения, отзывы, покупки…)
● юзер считается “очищенным” и готовым к использованию, если
успешно отработали все шаги очистки
Идеального решения нет
Шаги очистки будут добавлять программисты. Они
могут забыть добавить новый шаг при добавлении
новой фичи. Следить за этим придется вам.
Мы внедрили QaApi и стали более лучше
жить!
Почему вам стоит создать свой QaApi?
● меньше рутины
● проще тестировать сложные кейсы
● автотесты - на новый уровень
● разработчики - ваши друзья!
Что в итоге?

QaAPI. Взгляд на тестирование с другой стороны баррикад. Доклад Дмитрия Марущенко на LoveQA РИТ

  • 1.
    QaApi взгляд на тестированиес другой стороны баррикад Дмитрий Марущенко
  • 2.
    Badoo - этопро знакомства...
  • 3.
    ...и про технологии Унас было 2 веб-сайта, 4 разных мобильных платформы и целое море различных версий мобильных приложений, а также версия для мобильных браузеров и приложения в социальных сетях. Не то что бы все это было категорически необходимо для бизнеса, но если уж начали делать социальную сеть, то становится трудно остановиться. Единственное, что вызывало у меня опасения - это релизы вечером в пятницу. Нет ничего более беспомощного, безответственного и испорченного, чем пятничный релиз. Я знал, что рано или поздно мы перейдем и эту грань. “ ”
  • 4.
  • 5.
    Знаете, что самоеважное на этом плане?
  • 6.
    Знаете, что самоеважное на этом плане? ?
  • 7.
    Знаете, что самоеважное на этом плане? Короткие пути!
  • 8.
    Пользователь получает дайджест непрочитанныхсообщений письмом на электронную почту не чаще раза в неделю*. Типичный тест-кейс “ ” * Пример выдуманный! :)
  • 9.
    Как будем тестировать? ●регистрируемся ● … проходит неделя ● получаем письмо ● ждем ещё неделю ● получаем письмо ● PROFIT?
  • 10.
  • 11.
    Эволюция обращений кпрограммистам: “Подкрутите мне в базе…” 1. “А сделайте мне, чтоб дата отправки последнего письма была больше недели назад?” 2. “А скажите, где в базе хранится дата отправки, я вручную изменю?” 3. “А давайте сделаем интерфейс, где каждый сможет менять дату?” 4. “А запилите нам API?” Все любят короткие пути!
  • 12.
    Почему именно API? Чемэто лучше веб-интерфейса?
  • 13.
    Calabash Система тестирования мобильных приложений, основаннаяна Ruby и Cucumber. Автотесты Selenium Мощный инструмент автоматизации браузеров. Эти инструменты легко интегрировать с API, но очень сложно - с веб-интерфейсом: Интеграционные тесты Тестирование клиент-серверного взаимодействия.
  • 14.
    Как это работает даймне нового юзера да пожалуйста! добавь ему фото нет проблем! и дату регистрации смени как скажешь, хозяин! registerNewUser(age=25) {success:true, user_id:123, name:Alex, login:test123, passwd:Aj8SD8} addPhoto(count=1) {success: true} setRegistrationDate(date=2014-02-12) {success: true}
  • 15.
    Что оно должноуметь? Зависит от вашего проекта. У каждого - своё API. Наше API умеет: ● регистрировать, изменять и удалять юзеров ● голосовать за пользователей ● отправлять сообщения ● включать/выключать платные услуги ● добавлять “кредиты” ● загружать и “модерировать” фотки ● давать информацию (например свойства юзера) ● и всякое другое
  • 16.
    ● все функциив одном месте ● простота протокола ● страничка помощи ● система авторизации ● управление тестовыми юзерами ● безопасность “боевых” данных Что мы хотим получить?
  • 17.
    А что подкапотом?
  • 18.
    Keep it simple http://qaapi.example.com/setRegistrationDate?user_id=123&date=20140612 { "status":"success", "user": { "user_id": "123", "registration_date": "2014-06-12", } } Простой HTTP-запрос: Ответ в формате JSON:
  • 19.
    Страница помощи В QaApiесть страничка помощи, где перечислены все имеющиеся методы (описание, возможные аргументы и тип возвращаемого значения). Эта страничка генерируется автоматически из исходного кода QaApi.
  • 20.
    Ручной режим Интеграция ссуществующей системой доступа для сотрудников, с возможностью управлять полномочиями. Авторизация Автоматизация Сущестует несколько простых подходов: 1. Секретный ключ в HTTP-заголовке 2. HTTP Basic Auth 3. Логин-пароль в параметрах запроса GET /methodName?foo=bar HTTP/1.1 Host: qaapi.example.com Connection: keep-alive X-Secret-Header : abcdEfg76kGkljhJHk92 GET /methodName?foo=bar HTTP/1.1 Host: qaapi.example.com Connection: keep-alive Authorization : Basic cdEfа3GkljhJHk54== GET /methodName? login=test&pass=123 HTTP/1.1 Host: qaapi.example.com Connection: keep-alive
  • 21.
    Тестовые пользователи Для тестированияпостоянно требуются пользователи с разными свойствами.
  • 22.
    Создавать новых юзеров +юзер “чистый” + его никто не использует + можно делать что хотим и не чистить − быстро плодятся − нужно готовить к тесту Где их взять? Использовать заранее созданных + юзер готов к тесту + юзеров немного − нужно чистить − может использоваться кем-то ещё − подходящего юзера может не быть VS
  • 23.
    Наше решение -пул юзеров Цикл жизни тестового юзера в пуле Ждет в пуле Используется Очистка “Использован” Создан Может быть изменен в процессе теста Не может быть использован повторно до очистки registerUser()
  • 24.
    Регистрация юзеров Регистрируем Ж,25 лет, Москва Есть такой юзер? Создать нового юзера Добавить в пулВзять из пула нет да Добавлен с параметрами Ж, 25, Москва registerUser() Указываем только существенные для нас параметры Создание новых юзеров - только тогда, когда подходящего нет в пуле.
  • 25.
    Так как пользователь“новый”, необходимо подготовить его к тесту, например: ● сменить дату регистрации ● добавить фото, сообщения и т.д. ● добавить и подтвердить номер телефона ● и т. д. Все это делается с помощью QaApi Подготовка юзеров
  • 26.
    Подготовка юзера спомощью QaApi Схема подготовки юзера http://qaapi.example.com/registerUser?gender=F&age=25&location=Moscow # {"success": true, "user_id": 123, "login": "testuser123", "passwd": "Qa6G9v"} http://qaapi.example.com/uploadPhotos?user_id=123&count=1 # {"success": true} http://qaapi.example.com/setRegistrationDate?user_id=123&date=2014-02-12 # {"success": true}
  • 27.
    Было: Сценарии QaApi наLua http://qaapi.example.com/registerUser?gender=F&age=25 # {"success": true, "user_id": 123, "login": "testuser123", "passwd": "Qa6G9v"} http://qaapi.example.com/setRegistrationDate?user_id=123&date=2014-02-12 Copy user_id Paste user_id Стало: user = qaapi("registerUser",{gender="F", age=25,location="Moscow"}) # {"success": true, "user_id": 123, "login": "testuser123", "passwd": "Qa6G9v"} qaapi("setRegistrationDate",{user_id=user["user_id"], date="2014-02-12"})
  • 28.
    Немного о процессеочистки пользователей
  • 29.
    Наш путь: ● очистка- набор предопределенных шагов ● на каждое “сохраняемое состояние” - свой шаг очистки (примеры: сообщения, отзывы, покупки…) ● юзер считается “очищенным” и готовым к использованию, если успешно отработали все шаги очистки Идеального решения нет Шаги очистки будут добавлять программисты. Они могут забыть добавить новый шаг при добавлении новой фичи. Следить за этим придется вам.
  • 30.
    Мы внедрили QaApiи стали более лучше жить! Почему вам стоит создать свой QaApi? ● меньше рутины ● проще тестировать сложные кейсы ● автотесты - на новый уровень ● разработчики - ваши друзья! Что в итоге?