SlideShare a Scribd company logo
Полный цикл тестирования
React-приложений
Алексей Андросов, ведущий разработчик, Авто.ру
Наталья Стусь, разработчик интерфейсов, Авто.ру
MosQA meetup, 23 октября 2019, Москва
Frontend
2
Монорепозиторий для нескольких отдельных проектов
(desktop & mobile web)

+ +
• Классифайд авто • Классифайд запчастей
• Поиск автосервисов • Отзывы на автомобили
• Личный кабинет • Кабинет дилера
Релизный цикл
3
1. Разработка фичи в отдельной ветке
2. Тестирование фичи в отдельной ветке
Код не попадает в RC, пока задача не готова
3. Сборка RC из проверенных веток
В случае конфликтов придется перепроверять фичи
4. Ручной регресс целевого пакета
Несколько сотен тест-кейсов для каждого проекта
5. Релиз
6. Вливание ветки в мастер
Общий код может задеть другие проекты в репозитории
Автотесты (e2e) Selenium + java
4
Ускорили регресс (1 час, а не 10 часов)
Сняли рутину с ручных тестировщиков
Проще воспроизводить найденные баги
Обеспечили стабильность покрытия
Повысили точность тестирования UI
Нестабильное окружение — нестабильные тесты
Новые фичи покрываются с задержкой
Покрыты только критичные сценарии
Разрабатывает отдельная команда
Сложно разбирать упавшие тесты
Написали около 5000 e2e тестов
Автотесты (e2e) Selenium + java
5
Автотесты (e2e) Selenium + java
6
Автотесты (e2e) Selenium + java
7
Пытаемся решить проблемы
8
› Часть тестов запускается на проде
› Часть тестов перевели на моки https://github.com/doochik/mockritsa
› Увеличиваем мощности для запуска тестов
Для CI такие тесты не подходят. Решать эти проблемы — дорого!
Чего нам не хватает?
9
› Быстрые тесты (несколько минут)
› Стабильные тесты (0 ложных падений)
› Запуск тестов на PR
› Запуск без тестовых стендов, настройки бекендов и баз, создания
тестовых данных
› Написание тестов одновременно с кодом
› Удобная интерпретация результатов тестов
Инструменты
10
Модульные тесты: Jest + Enzyme
Интеграционные тесты: Jest + Enzyme
End-to-end тесты: Jest + Puppeteer / Selenium
Тесты на отдельные функции (Jest)
11
const moment = require('moment');
function getNearestHourStart() {
    const now = moment();
    if (now.minutes() >= 30) {
        now.add(1, 'h');
    }
    return now.startOf('h').format('HH:mm');
}
module.exports = getNearestHourStart;
const getNearestHourStart = require('./getNearestHourStart');
const MockDate = require('mockdate');
it('если меньше 30 минут то округляет до начала предыдущего 
часа', () => {
    MockDate.set('2019-03-01 13:13:13');
    const result = getNearestHourStart();
    expect(result).toBe('13:00');
});
it('если больше 30 минут то округляет до начала следующего 
часа', () => {
    MockDate.set('2019-03-01 13:43:13');
    const result = getNearestHourStart();
    expect(result).toBe('14:00');
});
it('добавит 0 впереди если часов меньше 10', () => {
    MockDate.set('2019-03-01 03:43:13');
    const result = getNearestHourStart();
    expect(result).toBe('04:00');
});
Тесты на отдельные компоненты (Enzyme)
12
const React = require('react');
const { shallow } = require('enzyme');
const { shallowToJson } = require('enzyme-to-json');
const BanMessage = require('./BanMessage');
it('должен правильно отрендерить причины бана', () => {
    const wrapper = shallow(
        <BanMessage
            bunker={{
                banReasons: {
                    foo: {
                        text_user_ban: 'foo ban text',
                    },
                    bar: {
                        text_user_ban: 'bar ban text',
                    },
                },
            }}
            className="Sales__banned"
            reasons={ [ 'foo', 'bar' ] }
        />);
    expect(shallowToJson(wrapper)).toMatchSnapshot();
});
exports[`должен правильно отрендерить причины бана 1`] = `
<InfoMessage
title="Личный кабинет заблокирован"
type="Error"
>
<div className=«BanMessage__Part» key=«0» >
"foo ban text"
</div>
<div className=«BanMessage__Part» key=«1»>
"bar ban text"
</div>
<div className="BanMessage__Buttons">
<Connect(SupportMessage)>
<Button
className="BanMessage__Button"
url="//auto.ru/?chat"
>
Написать в поддержку
</Button>
</Connect(SupportMessage)>
</div>
</InfoMessage>
`;
Тестирование верстки компонентов
13
› Покрыли тестами логику компонента
› Хотим по той же схеме проверять верстку компонентов!
Идеальный мир
14
it("should render MyComponent", () => {
const snapshot = render(<MyComponent/>);
expect(snapshot).toMatchImageSnapshot();
});
Тестирование верстки компонентов
15
Поиск по интернетам дает один ответ: puppeteer
const page = await browser.newPage();
await page.goto('http://localhost/page.html');
const screenshot = await page.screenshot();
expect(screenshot).toMatchImageSnapshot()
Что такое page.html?
Мы же хотим протестировать отдельный компонент!
Чего мы хотим?
16
› Тестировать отдельный компонент без сборки и запуска всего проекта
› Сборка компонента для теста не отличается от сборки для продакшена
› Простота развертывания для разработчика
› Простота использования для разработчика
jest-puppeteer-react
17
Как работает:
› Ищет все файлы с тестами *.browser.js
› Берет ваш конфиг webpack и собирает компоненты из тестов
› Пакует все в html через html-webpack-plugin
› Рендерит отдельные компоненты в браузере и снимает с них
скриншоты
jest-puppeteer-react
18
Что умеет:
› Cнимать скриншоты, сравнивать их с эталоном (jest-image-snapshot) и
показывать разницу
› Менять viewport (тестируем media-query), исполнять js в консоли — все
что умеет puppeteer
› Отключать headless-режим для отладки
› Запускать хром в docker для использования на CI
Пример скриншотного теста
19
const { render } = require('jest-puppeteer-react');
const { Provider } = require('react-redux');
const BanMessage = require('./BanMessage');
it('должен отрендерить причины бана', async() => {
await render(
<Provider store={ /* redux store mock */ }>
<BanMessage
bunker={{
banReasons: {
foo: { text_user_ban: 'foo ban text' },
bar: { text_user_ban: 'bar ban text' },
},
}}
reasons={ [ 'foo', 'bar' ] }
/>
</Provider>,
{ viewport: { width: 1220, height: 300 } }
);
const screenshot = await page.screenshot();
expect(screenshot).toMatchImageSnapshot();
});
Пример скриншотного теста
20
Эталон Результат теста
Пример скриншотного теста
21
Результат сравнения
с подсветкой изменений
jest-puppeteer-react
22
Почему падают тесты?
1. Первая причина - это ты.
2. А вторая - это тоже ты.
3. Ну вы поняли…
jest-puppeteer-react
23
Частые причина флапа тестов:
› У компонента есть анимация
› Изменилась или сфейлилась внешняя зависимость
› Не замокали дату, рандом и т.п.
jest-puppeteer-react
24
Нюансы:
› Скриншотные тесты дорогие. Логику тестируем в jest+enzyme, а тут
только CSS.
› Скорость тестов больше зависит от скорости работы самих компонент,
а не от количества тестов.
› Мы исследуем идеи создания кластера из контейнеров. docker-
контейнер с хромом не получится бесконечно вертикально
масштабировать.
› Хотим попробовать на основе дерева зависимостей запускать тесты
только для затронутых компонент.
Что получилось
25
Полное покрытие компонентов юнит-тестами:
› логика (jest)
› html-верстка (enzyme)
› css-верстка (jest-puppeteer-react)
Что получилось
26
› Все изменения в коде покрываются тестами
› Тесты лежат рядом с кодом
› Запускаем на PR
› Разработчик сразу видит фидбек
› Удобнее делать code review
› Тесты работают как документация
› Разработчики полюбили писать тесты
Что получилось
27
› Проверяем больше тест-кейсов
› Меньше реопенов от тестирования
› Часть задач не тестируются вручную
› Задачи быстрее попадают на прод
› Приближаем мечту релиза «по кнопке»
› За качество отвечает разработчик!
Релизный цикл
28
1. Разработка фичи в отдельной ветке
2. Покрытие кода тестами в процессе разработки
3. Запуск тестов на PR
4. Ручное тестирование фичи (не всегда!)
5. Прогон e2e тестов
6. Релиз
7. Вливание ветки в мастер
Дальнейшие планы
29
› Ускорение скриншотных тестов
› Поддержка e2e-тестов силами разработчиков
› Релиз «по кнопке»
Спасибо
Алексей Андросов
Ведущий разработчик, Авто.ру
Наталья Стусь
Разработчик интерфейсов, Авто.ру
aandrosov@yandex-team.ru
@doochik
natix@yandex-team.ru
@ArminaAiren

More Related Content

What's hot

ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
Alexey Paznikov
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
corehard_by
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
Platonov Sergey
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
Michael Chernobrov
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
corehard_by
 
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
Alexey Paznikov
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
corehard_by
 
Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюдения
corehard_by
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
Roman Dvornov
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
corehard_by
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
Yandex
 
ПВТ - весна 2015 - Лекция 0. Описание курса
ПВТ - весна 2015 - Лекция 0. Описание курсаПВТ - весна 2015 - Лекция 0. Описание курса
ПВТ - весна 2015 - Лекция 0. Описание курса
Alexey Paznikov
 
Как за час сделать недельную работу
Как за час сделать недельную работуКак за час сделать недельную работу
Как за час сделать недельную работу
corehard_by
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Mikhail Matrosov
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Andrey Karpov
 
Контроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupКонтроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать Makeup
Timophy Chaptykov
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
Alexey Paznikov
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
Platonov Sergey
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Sergey Platonov
 

What's hot (20)

ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
ПВТ - осень 2014 - Лекция 7. Многопоточное программирование без блокировок. М...
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Tdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chaiTdd webpack + testem + mocha + chai
Tdd webpack + testem + mocha + chai
 
Asynchrony and coroutines
Asynchrony and coroutinesAsynchrony and coroutines
Asynchrony and coroutines
 
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюдения
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
 
ПВТ - весна 2015 - Лекция 0. Описание курса
ПВТ - весна 2015 - Лекция 0. Описание курсаПВТ - весна 2015 - Лекция 0. Описание курса
ПВТ - весна 2015 - Лекция 0. Описание курса
 
Как за час сделать недельную работу
Как за час сделать недельную работуКак за час сделать недельную работу
Как за час сделать недельную работу
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...Улучшение качества открытого программного обеспечения с помощью инструментов ...
Улучшение качества открытого программного обеспечения с помощью инструментов ...
 
Контроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать MakeupКонтроль качества верстки или как начать делать Makeup
Контроль качества верстки или как начать делать Makeup
 
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
ПВТ - весна 2015 - Лекция 8. Многопоточное программирование без использования...
 
Цена ошибки
Цена ошибкиЦена ошибки
Цена ошибки
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 

Similar to Полный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь

Тестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumТестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и Selenium
SQALab
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
Скриншоты как сервис
Скриншоты как сервисСкриншоты как сервис
Скриншоты как сервис
Сергей Мелюков
 
"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23
"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23
"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23
MoscowJS
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
yaevents
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
Tatyanazaxarova
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
Igor Shkulipa
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with Selenium
Sergey Shvets
 
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИССуперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
Yandex
 
Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)
Ontico
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5Technopark
 
Делаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverДелаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх Webdriver
SQALab
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
Andrey Karpov
 
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
Mail.ru Group
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
Badoo Development
 
Андрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеАндрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзе
Elias Fofanov
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
Mikhail Chinkov
 
Performance optimisation in javascript
Performance optimisation in javascriptPerformance optimisation in javascript
Performance optimisation in javascript
Артем Захарченко
 
Automation testing desktop applications
Automation testing desktop applicationsAutomation testing desktop applications
Automation testing desktop applications
Алексей Стягайло
 

Similar to Полный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь (20)

Тестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumТестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и Selenium
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
Скриншоты как сервис
Скриншоты как сервисСкриншоты как сервис
Скриншоты как сервис
 
"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23
"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23
"Непрерывная интеграция или "Кто всё сломал?", Виктор Русакович, MoscowJS 23
 
Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
Вечный вопрос измерения времени
Вечный вопрос измерения времениВечный вопрос измерения времени
Вечный вопрос измерения времени
 
C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
Testing RIA with Selenium
Testing RIA with SeleniumTesting RIA with Selenium
Testing RIA with Selenium
 
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИССуперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
 
Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)Тестируй это / Виктор Русакович (GP Solutions)
Тестируй это / Виктор Русакович (GP Solutions)
 
Java осень 2012 лекция 5
Java осень 2012 лекция 5Java осень 2012 лекция 5
Java осень 2012 лекция 5
 
Делаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverДелаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх Webdriver
 
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
PVS-Studio. Статический анализатор кода. Windows/Linux, C/C++/C#
 
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
Наталья Чуфырина, Mail.Ru Group, «Как создать команду по автоматизации тестир...
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Андрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеАндрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзе
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
Performance optimisation in javascript
Performance optimisation in javascriptPerformance optimisation in javascript
Performance optimisation in javascript
 
Automation testing desktop applications
Automation testing desktop applicationsAutomation testing desktop applications
Automation testing desktop applications
 

More from Mail.ru Group

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Mail.ru Group
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
Mail.ru Group
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Mail.ru Group
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Mail.ru Group
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
Mail.ru Group
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
Mail.ru Group
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Mail.ru Group
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
Mail.ru Group
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
Mail.ru Group
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
Mail.ru Group
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
Mail.ru Group
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Mail.ru Group
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Mail.ru Group
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Mail.ru Group
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Mail.ru Group
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Mail.ru Group
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Mail.ru Group
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Mail.ru Group
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Mail.ru Group
 

More from Mail.ru Group (20)

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
 

Полный цикл тестирования React-приложений, Алексей Андросов и Наталья Стусь

  • 1. Полный цикл тестирования React-приложений Алексей Андросов, ведущий разработчик, Авто.ру Наталья Стусь, разработчик интерфейсов, Авто.ру MosQA meetup, 23 октября 2019, Москва
  • 2. Frontend 2 Монорепозиторий для нескольких отдельных проектов (desktop & mobile web)
 + + • Классифайд авто • Классифайд запчастей • Поиск автосервисов • Отзывы на автомобили • Личный кабинет • Кабинет дилера
  • 3. Релизный цикл 3 1. Разработка фичи в отдельной ветке 2. Тестирование фичи в отдельной ветке Код не попадает в RC, пока задача не готова 3. Сборка RC из проверенных веток В случае конфликтов придется перепроверять фичи 4. Ручной регресс целевого пакета Несколько сотен тест-кейсов для каждого проекта 5. Релиз 6. Вливание ветки в мастер Общий код может задеть другие проекты в репозитории
  • 4. Автотесты (e2e) Selenium + java 4 Ускорили регресс (1 час, а не 10 часов) Сняли рутину с ручных тестировщиков Проще воспроизводить найденные баги Обеспечили стабильность покрытия Повысили точность тестирования UI Нестабильное окружение — нестабильные тесты Новые фичи покрываются с задержкой Покрыты только критичные сценарии Разрабатывает отдельная команда Сложно разбирать упавшие тесты Написали около 5000 e2e тестов
  • 8. Пытаемся решить проблемы 8 › Часть тестов запускается на проде › Часть тестов перевели на моки https://github.com/doochik/mockritsa › Увеличиваем мощности для запуска тестов Для CI такие тесты не подходят. Решать эти проблемы — дорого!
  • 9. Чего нам не хватает? 9 › Быстрые тесты (несколько минут) › Стабильные тесты (0 ложных падений) › Запуск тестов на PR › Запуск без тестовых стендов, настройки бекендов и баз, создания тестовых данных › Написание тестов одновременно с кодом › Удобная интерпретация результатов тестов
  • 10. Инструменты 10 Модульные тесты: Jest + Enzyme Интеграционные тесты: Jest + Enzyme End-to-end тесты: Jest + Puppeteer / Selenium
  • 11. Тесты на отдельные функции (Jest) 11 const moment = require('moment'); function getNearestHourStart() {     const now = moment();     if (now.minutes() >= 30) {         now.add(1, 'h');     }     return now.startOf('h').format('HH:mm'); } module.exports = getNearestHourStart; const getNearestHourStart = require('./getNearestHourStart'); const MockDate = require('mockdate'); it('если меньше 30 минут то округляет до начала предыдущего  часа', () => {     MockDate.set('2019-03-01 13:13:13');     const result = getNearestHourStart();     expect(result).toBe('13:00'); }); it('если больше 30 минут то округляет до начала следующего  часа', () => {     MockDate.set('2019-03-01 13:43:13');     const result = getNearestHourStart();     expect(result).toBe('14:00'); }); it('добавит 0 впереди если часов меньше 10', () => {     MockDate.set('2019-03-01 03:43:13');     const result = getNearestHourStart();     expect(result).toBe('04:00'); });
  • 12. Тесты на отдельные компоненты (Enzyme) 12 const React = require('react'); const { shallow } = require('enzyme'); const { shallowToJson } = require('enzyme-to-json'); const BanMessage = require('./BanMessage'); it('должен правильно отрендерить причины бана', () => {     const wrapper = shallow(         <BanMessage             bunker={{                 banReasons: {                     foo: {                         text_user_ban: 'foo ban text',                     },                     bar: {                         text_user_ban: 'bar ban text',                     },                 },             }}             className="Sales__banned"             reasons={ [ 'foo', 'bar' ] }         />);     expect(shallowToJson(wrapper)).toMatchSnapshot(); }); exports[`должен правильно отрендерить причины бана 1`] = ` <InfoMessage title="Личный кабинет заблокирован" type="Error" > <div className=«BanMessage__Part» key=«0» > "foo ban text" </div> <div className=«BanMessage__Part» key=«1»> "bar ban text" </div> <div className="BanMessage__Buttons"> <Connect(SupportMessage)> <Button className="BanMessage__Button" url="//auto.ru/?chat" > Написать в поддержку </Button> </Connect(SupportMessage)> </div> </InfoMessage> `;
  • 13. Тестирование верстки компонентов 13 › Покрыли тестами логику компонента › Хотим по той же схеме проверять верстку компонентов!
  • 14. Идеальный мир 14 it("should render MyComponent", () => { const snapshot = render(<MyComponent/>); expect(snapshot).toMatchImageSnapshot(); });
  • 15. Тестирование верстки компонентов 15 Поиск по интернетам дает один ответ: puppeteer const page = await browser.newPage(); await page.goto('http://localhost/page.html'); const screenshot = await page.screenshot(); expect(screenshot).toMatchImageSnapshot() Что такое page.html? Мы же хотим протестировать отдельный компонент!
  • 16. Чего мы хотим? 16 › Тестировать отдельный компонент без сборки и запуска всего проекта › Сборка компонента для теста не отличается от сборки для продакшена › Простота развертывания для разработчика › Простота использования для разработчика
  • 17. jest-puppeteer-react 17 Как работает: › Ищет все файлы с тестами *.browser.js › Берет ваш конфиг webpack и собирает компоненты из тестов › Пакует все в html через html-webpack-plugin › Рендерит отдельные компоненты в браузере и снимает с них скриншоты
  • 18. jest-puppeteer-react 18 Что умеет: › Cнимать скриншоты, сравнивать их с эталоном (jest-image-snapshot) и показывать разницу › Менять viewport (тестируем media-query), исполнять js в консоли — все что умеет puppeteer › Отключать headless-режим для отладки › Запускать хром в docker для использования на CI
  • 19. Пример скриншотного теста 19 const { render } = require('jest-puppeteer-react'); const { Provider } = require('react-redux'); const BanMessage = require('./BanMessage'); it('должен отрендерить причины бана', async() => { await render( <Provider store={ /* redux store mock */ }> <BanMessage bunker={{ banReasons: { foo: { text_user_ban: 'foo ban text' }, bar: { text_user_ban: 'bar ban text' }, }, }} reasons={ [ 'foo', 'bar' ] } /> </Provider>, { viewport: { width: 1220, height: 300 } } ); const screenshot = await page.screenshot(); expect(screenshot).toMatchImageSnapshot(); });
  • 21. Пример скриншотного теста 21 Результат сравнения с подсветкой изменений
  • 22. jest-puppeteer-react 22 Почему падают тесты? 1. Первая причина - это ты. 2. А вторая - это тоже ты. 3. Ну вы поняли…
  • 23. jest-puppeteer-react 23 Частые причина флапа тестов: › У компонента есть анимация › Изменилась или сфейлилась внешняя зависимость › Не замокали дату, рандом и т.п.
  • 24. jest-puppeteer-react 24 Нюансы: › Скриншотные тесты дорогие. Логику тестируем в jest+enzyme, а тут только CSS. › Скорость тестов больше зависит от скорости работы самих компонент, а не от количества тестов. › Мы исследуем идеи создания кластера из контейнеров. docker- контейнер с хромом не получится бесконечно вертикально масштабировать. › Хотим попробовать на основе дерева зависимостей запускать тесты только для затронутых компонент.
  • 25. Что получилось 25 Полное покрытие компонентов юнит-тестами: › логика (jest) › html-верстка (enzyme) › css-верстка (jest-puppeteer-react)
  • 26. Что получилось 26 › Все изменения в коде покрываются тестами › Тесты лежат рядом с кодом › Запускаем на PR › Разработчик сразу видит фидбек › Удобнее делать code review › Тесты работают как документация › Разработчики полюбили писать тесты
  • 27. Что получилось 27 › Проверяем больше тест-кейсов › Меньше реопенов от тестирования › Часть задач не тестируются вручную › Задачи быстрее попадают на прод › Приближаем мечту релиза «по кнопке» › За качество отвечает разработчик!
  • 28. Релизный цикл 28 1. Разработка фичи в отдельной ветке 2. Покрытие кода тестами в процессе разработки 3. Запуск тестов на PR 4. Ручное тестирование фичи (не всегда!) 5. Прогон e2e тестов 6. Релиз 7. Вливание ветки в мастер
  • 29. Дальнейшие планы 29 › Ускорение скриншотных тестов › Поддержка e2e-тестов силами разработчиков › Релиз «по кнопке»
  • 30. Спасибо Алексей Андросов Ведущий разработчик, Авто.ру Наталья Стусь Разработчик интерфейсов, Авто.ру aandrosov@yandex-team.ru @doochik natix@yandex-team.ru @ArminaAiren