SlideShare a Scribd company logo
1 of 49
Download to read offline
Компонентные тесты: как
сделать жизнь вашего QA
немного проще?
Strictly ConfidentialStrictly Confidential 2
Seller
Experience
Team
Production
Buyer
Experience
Team
Alien
Experience
Team
Strictly ConfidentialStrictly Confidential 3
• QA как процесс
• Что такое компонентный тест?
• Примеры использования
• Минимизация стоимости поддержки
Содержание
Strictly ConfidentialStrictly Confidential 4
Какое место занимают компонентные тесты?
Unit tests
Component tests
E2E tests
~100%
~50%
~20%
Strictly ConfidentialStrictly Confidential 5
Какое место занимают компонентные тесты?
Unit tests
Component tests
E2E tests
Strictly ConfidentialStrictly Confidential 6
Какое место занимают компонентные тесты?
Unit tests
Component tests
E2E tests
Strictly ConfidentialStrictly Confidential
• Максимально стабилен
• Максимально быстр
• Ничего не знает о внешнем окружении
7
Unit test
Strictly ConfidentialStrictly Confidential
• Проверяет точки интеграции
• Тестирует компонент в изоляции
от глобального состояния
системы
8
Component test
Strictly ConfidentialStrictly Confidential
• Проверяет всю систему в целом
• Использует настоящую внешнюю среду
• Является наиболее “честной” проверкой
9
E2E test
Strictly ConfidentialStrictly Confidential
• Стабильность
• Скорость
• Feedback loop
10
Зачем нам такое разделение?
Strictly ConfidentialStrictly Confidential
• Unit - бизнес логика
• Component - пользовательские сценарии
• E2E - система целиком
11
Резюме
Strictly ConfidentialStrictly Confidential 12
• QA как процесс
• Что такое компонентный тест?
• Примеры использования
• Минимизация стоимости поддержки
Содержание
Strictly ConfidentialStrictly Confidential 13
Тестирование отдельных компонентов
программного обеспечения
Strictly ConfidentialStrictly Confidential 14
Проблема с Unit тестами
Бизнес логика
Strictly ConfidentialStrictly Confidential 15
Проблема с Unit тестами
Взаимодействие
с UI
Бизнес логика
Strictly ConfidentialStrictly Confidential 16
Проблема с Unit тестами
Взаимодействие
с UI
Бизнес логика
Навигация
Strictly ConfidentialStrictly Confidential 17
Проблема с Unit тестами
Взаимодействие
с UI
Бизнес логика
НавигацияБизнес логика
Strictly ConfidentialStrictly Confidential 18
Проблема с Unit тестами
Взаимодействие
с UI
Бизнес логика
НавигацияБизнес логика
Strictly ConfidentialStrictly Confidential 19
Who is Mr. Component test?
Strictly ConfidentialStrictly Confidential 20
Who is Mr. Component test?
Mocks
API
Storage
Analytics
…
Screen
Presenter
Interactor
View
Other local
dependencies
Strictly ConfidentialStrictly Confidential 21
• QA как процесс
• Что такое компонентный тест?
• Примеры использования
• Минимизация стоимости поддержки
Содержание
Strictly ConfidentialStrictly Confidential 22
Проверка состояния UI
val button = Espresso.onView(/…/)
@Test
fun button___isDisabled___byDefault() {
button.check(matches(not(isEnabled())))
}
Strictly ConfidentialStrictly Confidential 23
Сохранение состояния
@Test
fun button___savesEnabledState___afterRotation() {
givenBothFieldsHaveData()
toggleOrientation()
button.check(matches(isEnabled()))
}
val button = Espresso.onView(/…/)
Strictly ConfidentialStrictly Confidential 24
Взаимодействия с сетью
@Test
fun buttonClicked___showsToast___connectionError() {
givenBothFieldsHaveData()
Api.stub { authenticate.connectionError() }
button.perform(click())
toastDisplayedWithText("Нет соединения")
}
Strictly ConfidentialStrictly Confidential 25
Защита при рефакторинге
Strictly ConfidentialStrictly Confidential 26
Защита при рефакторинге
Awesome Screen
Some
Cool
Logic
Strictly ConfidentialStrictly Confidential 27
Защита при рефакторинге
Awesome Screen
Some
Cool
Logic
Not so awesome screen
Strictly ConfidentialStrictly Confidential 28
Защита при рефакторинге
Awesome Screen Not so awesome screen
Some
Cool
Logic
Strictly ConfidentialStrictly Confidential 29
• QA как процесс
• Что такое компонентный тест?
• Примеры использования
• Минимизация стоимости поддержки
Содержание
Strictly ConfidentialStrictly Confidential 30
Все ли так радужно?
@Test
fun button___savesEnabledState___afterRotation() {
givenBothFieldsHaveData()
toggleOrientation()
button.check(matches(isEnabled()))
}
Strictly ConfidentialStrictly Confidential 31
Все ли так радужно?
@Test
fun button___savesEnabledState___afterRotation() {
givenBothFieldsHaveData()
toggleOrientation()
button.check(matches(isEnabled()))
}
Strictly ConfidentialStrictly Confidential 32
Что может скрывать за собой обычный ввод
текста?
fun ViewInteraction.typeText(text: String) {
perform(TypeTextAction(text))
}
Strictly ConfidentialStrictly Confidential 33
Что может скрывать за собой обычный ввод
текста?
fun ViewInteraction.typeText(text: String) {
perform(TypeTextAction(text))
}
NoMatchingViewException
Strictly ConfidentialStrictly Confidential 34
Что может скрывать за собой обычный ввод
текста?
fun ViewInteraction.typeText(text: String) {
perform(
TypeTextAction(text),
ViewActions.closeSoftKeyboard()
)
}
Strictly ConfidentialStrictly Confidential 35
Что может скрывать за собой обычный ввод
текста?
fun ViewInteraction.typeText(text: String) {
perform(
ViewActions.scrollTo(),
TypeTextAction(text),
ViewActions.closeSoftKeyboard()
)
}
Strictly ConfidentialStrictly Confidential 36
Что может скрывать за собой обычный ввод
текста?
fun ViewInteraction.typeText(text: String){
Waiter.wait {
perform(
ViewActions.scrollTo(),
TypeTextAction(text),
ViewActions.closeSoftKeyboard()
)
}
}
Strictly ConfidentialStrictly Confidential 37
Постепенно элементы становятся сложнее, а
код менее читабельным
Espresso.onView(
Matchers.allOf(
withParent(withId(R.id.email)),
withId(R.id.input)
)
)
)
Strictly ConfidentialStrictly Confidential 38
PageObject
“The basic rule of thumb for a page object is that it should allow a
software client to do anything and see anything that a human can.
…
The page object should encapsulate the mechanics required to find
and manipulate the data in the GUI control itself.”
- Martin Fowler
Strictly ConfidentialStrictly Confidential 39
class LoginViaMail : PageObject() {
val emailField = InputViewField(withId(R.id.email))
val passwordField = InputViewField(withId(R.id.password))
val logInButton = PageObjectElement(withId(R.id.login))
}
PageObject
Strictly ConfidentialStrictly Confidential 40
PageObject
class LoginViaMail : PageObject() {
val emailField = InputViewField(withId(R.id.email))
val passwordField = InputViewField(withId(R.id.password))
val logInButton = PageObjectElement(withId(R.id.login))
fun givenBothFieldsHaveData() {
emailField.write(randomString())
passwordField.write(randomString())
}
}
Strictly ConfidentialStrictly Confidential 41
PageObjectElement
class InputViewField : PageObjectElement {
…
override fun typeText(stringToBeTyped: String) {
interaction.waitToPerform(
EspressoActions.scrollIfPossible(),
EspressoActions.safeTypeText(stringToBeTyped),
ViewActions.closeSoftKeyboard()
)
}
}
HomeScreen
LoginScreen
ChatScreen
InputElement
ButtonElement
TextElement
PageObject PageObjectElement
Strictly ConfidentialStrictly Confidential 43
Что получаем?
@Test
fun header___displayedWithTitle___headerLoaded() {
Api.stub {
getHeader.success {
name = “header name"
}
}
screenRule.start()
screen.header.checks.displayedWithText(“header name")
}
Strictly ConfidentialStrictly Confidential 44
Проверка должна выглядеть так, как видит ее
пользователь
@Test
fun signUpButton___opensRegistration() {
loginScreen.signUpButton.click()
Screen.ui.checks.actionBarWithTitle("Регистрация")
}
Strictly ConfidentialStrictly Confidential 45
Детали проверки должны быть
инкапсулированы
fun assertNotification(notificationMessage: String,
check: Checks.() -> Unit) {
val notification = PageObjectElement(
allOf(
withClassName(containsString("FrameLayout")),
withChild(
allOf(
withId(R.id.info_text),
withText(notificationMessage)
)
)
)
)
check.invoke(notification.checks)
}
Strictly ConfidentialStrictly Confidential 46
Тест не должен знать об Espresso
Strictly ConfidentialStrictly Confidential 47
Работу с глобальным состоянием приложения
уносим в Rule
abstract class SimpleRule : TestRule {
protected open fun before() {
//подготавлиеваем моки
}
protected open fun after() {
//сбрасываем состояние
}
}
Strictly ConfidentialStrictly Confidential 48
Тест не должен знать о специфике вашей
архитектуры
MVP
MVVM
Dagger RxBindings
Strictly ConfidentialStrictly Confidential 49

More Related Content

Similar to Филипп Уваров, Avito

Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDDAleksei Alekseev
 
Сергей Семашко "End to end test: cheap and effective"
Сергей Семашко "End to end test: cheap and effective"Сергей Семашко "End to end test: cheap and effective"
Сергей Семашко "End to end test: cheap and effective"EPAM Systems
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAndrey Rebrov
 
Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3Technopark
 
Автоматическое тестирование мобильных приложений на основе скриншотов
Автоматическое тестирование мобильных приложений на основе скриншотовАвтоматическое тестирование мобильных приложений на основе скриншотов
Автоматическое тестирование мобильных приложений на основе скриншотовSergey Borisov
 
Организация автоматического тестирования в схеме непрерывной интеграции
Организация автоматического тестирования в схеме непрерывной интеграцииОрганизация автоматического тестирования в схеме непрерывной интеграции
Организация автоматического тестирования в схеме непрерывной интеграцииSQALab
 
Grail - CodeFest'2015
Grail - CodeFest'2015Grail - CodeFest'2015
Grail - CodeFest'2015Igor Khrol
 
Grail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовGrail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовCodeFest
 
Certifi-Gate: атака в теории и на практике
Certifi-Gate: атака в теории и на практикеCertifi-Gate: атака в теории и на практике
Certifi-Gate: атака в теории и на практикеPositive Hack Days
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Ivan Tsyganov
 
Доклад Ильи Кудинова на DevConf 2013. "Организация автоматизированного тестир...
Доклад Ильи Кудинова на DevConf 2013. "Организация автоматизированного тестир...Доклад Ильи Кудинова на DevConf 2013. "Организация автоматизированного тестир...
Доклад Ильи Кудинова на DevConf 2013. "Организация автоматизированного тестир...Badoo Development
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Илья Кудинов
Илья КудиновИлья Кудинов
Илья КудиновCodeFest
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...CocoaHeads
 
Нагрузочное тестирование web проектов
Нагрузочное тестирование web проектовНагрузочное тестирование web проектов
Нагрузочное тестирование web проектовSQALab
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 

Similar to Филипп Уваров, Avito (20)

Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDD
 
Сергей Семашко "End to end test: cheap and effective"
Сергей Семашко "End to end test: cheap and effective"Сергей Семашко "End to end test: cheap and effective"
Сергей Семашко "End to end test: cheap and effective"
 
Automation Functional Testing in Agile Projects
Automation Functional Testing in Agile ProjectsAutomation Functional Testing in Agile Projects
Automation Functional Testing in Agile Projects
 
Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3
 
Автоматическое тестирование мобильных приложений на основе скриншотов
Автоматическое тестирование мобильных приложений на основе скриншотовАвтоматическое тестирование мобильных приложений на основе скриншотов
Автоматическое тестирование мобильных приложений на основе скриншотов
 
Организация автоматического тестирования в схеме непрерывной интеграции
Организация автоматического тестирования в схеме непрерывной интеграцииОрганизация автоматического тестирования в схеме непрерывной интеграции
Организация автоматического тестирования в схеме непрерывной интеграции
 
Grail - CodeFest'2015
Grail - CodeFest'2015Grail - CodeFest'2015
Grail - CodeFest'2015
 
Grail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовGrail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестов
 
Certifi-Gate: атака в теории и на практике
Certifi-Gate: атака в теории и на практикеCertifi-Gate: атака в теории и на практике
Certifi-Gate: атака в теории и на практике
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Automation testing desktop applications
Automation testing desktop applicationsAutomation testing desktop applications
Automation testing desktop applications
 
Agile Instrumentation
Agile InstrumentationAgile Instrumentation
Agile Instrumentation
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
Доклад Ильи Кудинова на DevConf 2013. "Организация автоматизированного тестир...
Доклад Ильи Кудинова на DevConf 2013. "Организация автоматизированного тестир...Доклад Ильи Кудинова на DevConf 2013. "Организация автоматизированного тестир...
Доклад Ильи Кудинова на DevConf 2013. "Организация автоматизированного тестир...
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Илья Кудинов
Илья КудиновИлья Кудинов
Илья Кудинов
 
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
Виктор Брыкcин — Как всё починить и ничего не сломать: работа со сложным кодо...
 
Нагрузочное тестирование web проектов
Нагрузочное тестирование web проектовНагрузочное тестирование web проектов
Нагрузочное тестирование web проектов
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 

More from Badoo Development

Viktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel AutomationViktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel AutomationBadoo Development
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
Григорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RUГригорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RUBadoo Development
 
Андрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.БраузерАндрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.БраузерBadoo Development
 
Cocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magicCocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magicBadoo Development
 
Cocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature developmentCocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature developmentBadoo Development
 
Alex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High AvailabilityAlex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High AvailabilityBadoo Development
 
Андрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхАндрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхBadoo Development
 
Александр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsАлександр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsBadoo Development
 
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественноИлья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественноBadoo Development
 
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ruTechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ruBadoo Development
 
TechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, BadooTechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, BadooBadoo Development
 
TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma Badoo Development
 
TechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, ErlyvideoTechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, ErlyvideoBadoo Development
 
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»  Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов» Badoo Development
 
Как мы готовим MySQL
 Как мы готовим MySQL  Как мы готовим MySQL
Как мы готовим MySQL Badoo Development
 
Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo Badoo Development
 
5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоадаBadoo Development
 
Git хуки на страже качества кода
Git хуки на страже качества кодаGit хуки на страже качества кода
Git хуки на страже качества кодаBadoo Development
 

More from Badoo Development (20)

Viktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel AutomationViktar Karanevich – iOS Parallel Automation
Viktar Karanevich – iOS Parallel Automation
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
Григорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RUГригорий Джанелидзе, OK.RU
Григорий Джанелидзе, OK.RU
 
Андрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.БраузерАндрей Сидоров, Яндекс.Браузер
Андрей Сидоров, Яндекс.Браузер
 
Cocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magicCocoaheads Meetup / Alex Zimin / Swift magic
Cocoaheads Meetup / Alex Zimin / Swift magic
 
Cocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature developmentCocoaheads Meetup / Kateryna Trofimenko / Feature development
Cocoaheads Meetup / Kateryna Trofimenko / Feature development
 
Alex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High AvailabilityAlex Krasheninnikov – Hadoop High Availability
Alex Krasheninnikov – Hadoop High Availability
 
Андрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данныхАндрей Денисов – В ожидании мониторинга баз данных
Андрей Денисов – В ожидании мониторинга баз данных
 
Александр Зобнин, Grafana Labs
Александр Зобнин, Grafana LabsАлександр Зобнин, Grafana Labs
Александр Зобнин, Grafana Labs
 
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественноИлья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
Илья Аблеев – Zabbix в Badoo: реагируем быстро и качественно
 
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ruTechLeads meetup: Андрей Шелёхин, Tinkoff.ru
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
 
TechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, BadooTechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Алексей Рыбак, Badoo
 
TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Евгений Потапов, ITSumma
 
TechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, ErlyvideoTechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Макс Лапшин, Erlyvideo
 
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»  Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
Паша Мурзаков: Как 200 строк на Go помогли нам освободить 15 серверов»
 
Как мы готовим MySQL
 Как мы готовим MySQL  Как мы готовим MySQL
Как мы готовим MySQL
 
Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo Архитектура хранения и отдачи фотографий в Badoo
Архитектура хранения и отдачи фотографий в Badoo
 
5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада5 способов деплоя PHP-кода в условиях хайлоада
5 способов деплоя PHP-кода в условиях хайлоада
 
ChromeDriver Jailbreak
ChromeDriver JailbreakChromeDriver Jailbreak
ChromeDriver Jailbreak
 
Git хуки на страже качества кода
Git хуки на страже качества кодаGit хуки на страже качества кода
Git хуки на страже качества кода
 

Филипп Уваров, Avito