Upload
igor-lyubin
View
45
Download
1
Embed Size (px)
Citation preview
Киев 2016
Первый в Украине фестиваль тестирования
Об автоматическом тестировании back-end-а
в
Игорь Любин
1
Киев 2016
Игорь Любин• К. ф.-м. н.• Родился в г. Казань• В QA с 2007 г.
Киев 2016
Киев 2016
Mediamarkt.ru• > 1 000 000 пользователей с картами лояльности• > 70 магазинов
Киев 2016
Mediamarkt.ru• > 100 IT специалистов• > 10 команд
C#PhpRuby
Киев 2016
«Loyalty Awards Russia 2016»
• Технологический лидер года
Киев 2016
Команда CRM
QACIАналитик
бизнесАналитик
3rd sysTeamlead разработчик
CRMРазработчик
CRM + UIРазработчик
CustomerРазработчик
Внтр.
Киев 2016
Доменная область CRM
• Пользователи• Карты лояльности• Оплата баллами
• Возвраты
Киев 2016
CRM
Pinpad
Киоск
Web
CallCenter
3rd
Mobile
Front-end
9
Киев 2016
Back-end
Customer Api Card Api Lottery Api Payment Api
Sender Sync Card Sync Return Api Pinpad Api
CallCenter.UI CrmManager.UI Lottery.UI + 10-20
Киев 2016
Пример контракта Customer API• find_customer_by_id• create_customer• update_customer• block_customer• confirm_email• …
Киев 2016
Обычный микросервис CRM
Api DB
jsonstatus + json
Query
Киев 2016
Первый автоматический тест?
Киев 2016
Build, deploy, test
14
Киев 2016
Где лежат тесты?MM.Customer.ApiMM.Customer.Api.Test
Киев 2016
Почему тесты рядом с кодом?• Тесты ближе к разработчикам• Один язык разработки проекта и тестов• Одинаковые инструменты обращения к Api и DB• Можно использовать наработки разработчиков
Киев 2016
Стратегия тестирования• Сначала позитив
Киев 2016
18
[Test]
public void Shoud_find_customer_by_id()
{
var response = Api.Send("find_customer_by_id", new { "123" });
Assert.That(response.StatusCode,
Is.EqualTo(HttpStatusCode.OK));
}
Киев 2016
19
[Test]
public void Shoud_find_customer_by_id()
{ var id = Db.GetCustomerId(); var response = Api.Send("find_customer_by_id", new { id });
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
Assert.That(response.DeserializeTo<Customer>().Id, Is.EqualTo(id));}
Киев 2016
20
[Test]
public void Shoud_find_customer_by_id()
{ var id = Db.GetCustomerId(); var response = Api.Send("find_customer_by_id", new { id });
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
Assert.That(response.DeserializeTo<Customer>().Id, Is.EqualTo(id));}
Киев 2016
Smoke тестирование
Киев 2016
Чек-лист покрытия API• Хотя бы один тест с ответом 200 ОК
• Проверка бизнес-логики• «Плохие» статусы у пользователей и карт
• Тесты на кэш
• Проверка модели, JSON схемы ответа, проверка наличия полей и их правильных типов
• Проверка измененного состояния• Проверить, что изменения легли в БД• Проверки очередей• Проверки в смежных системах
• Вызов метода дважды, максимальное число параметров, расширения команды, другие способы вызова
• Негативные проверки• Not found => Валидные, но несуществующие в системе значения параметров• Invalid => Плохие значения параметров, пробелы, выход за границу допустимых значений• Not specified => Пустые значения параметров, другие типы, проверка обязательных• Пустой запрос = {} и запрос без параметров = ""
• Все ли покрыто из документации? 22
Киев 2016
23
[Test]
public void Shoud_return_error_if_customer_blocked()
{ var id = Db.GetBlockedCustomerId(); var response = Api.Send("find_customer_by_id", new { id });
Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));}
Киев 2016
Тесты на кэш
Киев 2016
Полный набор api тестов
Киев 2016
Slack
Киев 2016
Интеграционное тестирование
Api Sync 3rd
Киев 2016
GitFlow
Киев 2016
UI-тестирование
29
Киев 2016
Тесты для продаCritical Readonly
Киев 2016
Нагрузочное тестирование
Киев 2016
Заключение• AT + CI• Build, deploy, test• Тесты рядом с кодом проекта• Используем наработки разработчиков• Сначала позитив + бизнес логика
Киев 2016
Спасибо за внимание. Вопросы?• E-mail: [email protected]• Skype: igor.lyubin