Привет, Хабр!

Мы — Алевтина Чугунова (владелец продукта дизайн‑системы) и Дарья Каткова (QA‑инженер). В этой статье расскажем, как создаём и тестируем дизайн‑систему, с какими проблемами сталкивались и какие инструменты разработали, чтобы упростить жизнь себе и командам.

Вы узнаете:

  • Что такое дизайн‑система и зачем она нужна.

  • Как тестировать интерфейсы без боли.

  • Какие инструменты помогают автоматизировать проверки.

Что такое дизайн-система и когда она особенно нужна?

Если загуглить определение, то можно наткнуться на что-то вроде:

Дизайн-система — это набор правил и инструментов для визуального и технического исполнения, который отражает философию продукта и постоянно развивается.

Звучит довольно сложно, поэтому мы для себя дизайн-систему определили как «ДНК продукта, приложения и бренда». И, как настоящая ДНК, она состоит из основных компонентов:

  • Бренд — то, что представляет визуальный язык продукта (цвета, шрифты, айдентика).

  • UI Kit — готовые компоненты для дизайнеров (кнопки, карточки, формы).

  • Фреймворки — библиотеки для разработчиков.

Когда дизайн-система — must have?

  • У вас не стартап. Стартапам выбирать не приходится, и часто они экономят на системности ради скорости.

  • Много команд или продуктов. Дизайн‑система ускоряет разработку и тестирование.

  • Выпуск фич идёт медленно. Если люди тратят больше времени на вёрстку и отступы, чем на бизнес‑логику, то пришло время централизовать интерфейс.

А что было до дизайн-системы? Раньше команды сталкивались с хаосом:

  • Дефекты в интерфейсах доходили до пользователей. Интерфейс — это, буквально, лицо продукта, и любые ошибки здесь сразу бросаются в глаза.

  • Не было единообразия приложений на разных платформах. Версии под iOS и Android выглядели как разные приложения, а веб‑версия вообще жила своей жизнью.

  • Не было единой точки контроля визуальной составляющей продуктов. То есть не было человека или команды, отвечающей за внешность интерфейсов.

  • Тестировать интерфейсы было мучительно, ведь не было удобных инструментов.

Как тестировать дизайн-систему?

Дизайн-система — это единый источник истины. Если в кнопке баг, то он будет во всех продуктах, использующих эту кнопку. Поэтому тестирование должно быть максимально надёжным. В первую очередь нужно проверять:

  • функциональность;

  • адаптивность (как компонент выглядит на маленьком и большом экранах);

  • кроссбраузерность;

  • работу с системными элементами.

Особенности функционального тестирования

Функциональное тестирование в обычных продуктах подразумевает проверку бизнес-логики. Например, создание заявки или оформление заказа.

В дизайн-системах тоже есть функциональное тестирование, и оно подразумевает под собой проверку работы компонентов. Потому что компоненты наделены своей логикой и могут быть в разных состояниях:

Кроссбраузерность

Отдельной болью для нас стал браузер Safari. В нём есть свои особенности обработки контейнеров, из-за этого наши компоненты иногда непредсказуемо себя ведут.

Работа с системными элементами

В мобильных версиях нужно учитывать работу с системными элементами. Например, с панелью навигации внизу экрана. На данный момент они бывают в виде обычной панели навигации, состоящей из трех кнопок, либо Home Indicator — тонкой полоски внизу экрана, для навигации жестами.

Проблемы могут возникнуть именно с полоской. Если её не учесть и разместить какую-либо кнопку прямо под этой областью, то её будет плохо видно, а в некоторых случаях на кнопку невозможно будет нажать.

Инструменты для визуализации

Дизайн-систему нужно уметь тестировать. И без инструментов — никак. Компонентов становится всё больше, состояний — десятки, токенов — сотни. Нужна живая среда, где можно быстро показать компонент, отладить параметры, переключить тему и сразу увидеть баги. Именно такую среду мы выстраивали для нашей дизайн-системы. В этой главе мы расскажем о ней, подходах и примерах, которые помогли нам вывести тестирование интерфейса на новый уровень.

Для веба: Storybook

Storybook — отличный инструмент для документации компонентов с открытым исходным кодом, написан на JavaScript и предназначен для организации пользовательских интерфейсов. То есть он прямо из кода UI-компонентов генерирует полноценную документацию.

Так мы храним в Storybook наши иконки и цветовую палитру:

Сюда же встроена песочница: возможность интерактивно менять параметры компонента и сразу смотреть, как он себя ведёт. QA активно используют её для проверки багов, а аналитики — чтобы убедиться, что компонент подойдёт под конкретную задачу.

Регулярное обновление Storybook — часть нашего процесса. С каждым релизом библиотеки мы выкатываем свежую версию документации, и пользователи дизайн-системы всегда получают актуальную информацию.

Для мобилок: самописный инструмент

На мобильных платформах аналогов Storybook просто нет. Поэтому мы создали своё демо‑приложение, которое выполняет ту же функцию. Главный экран разбит на ключевые разделы:

  • Компоненты: каталог всех компонентов библиотеки, примеры использования;

  • Документация для тестировщиков и разработчиков;

  • Цвета: визуализация токенов по ролям и темам;

  • Шрифты: отображение типографики в разных контекстах;

  • Иконки: с возможностью посмотреть размеры и контраст;

  • Лаборатории: отдельные экраны для проверки визуальных нюансов.

Один из самых важных экранов — демонстрация компонента. Ниже показан наш компонент Bubble, который позволяет визуализировать переписки в мессенджерах. Под ним расположен список его параметров: тут можно изменять состояния, тему (светлую или темную), увидеть работу компонента на устройстве в реальных условиях, что особенно важно для тестирования.

Также по каждому компоненту у нас есть документация. Тестировщик перед ручным тестированием или написанием автотестов может посмотреть, что умеет делать компонент и как с ним работать:

Дополнительно мы собираем примеры использования. Любой разработчик может скопировать код и работать с уже готовым примером. Например, с собранной перепиской, составленной из компонента Bubble.

Также есть отдельный экран для наших цветов. Они все располагаются в одном месте и можно посмотреть, корректно ли они отображаются в светлой и тёмной темах. Иконки у нас разделены на Filled (залитые сплошным цветом ) и Outline (контурные). А также отдельно храним наши шрифты.

Инструменты, о которых нельзя молчать

Разобрались, как можно визуализировать дизайн‑систему, а теперь посмотрим, как её тестировать. Снова проведём параллель с вебом.

Когда вы проверяете интерфейсы в вебе, у вас всегда под рукой DevTools. С их помощью можно быстро протестировать вёрстку. Видны самые главные отступы, все стили, цвета и шрифты. И если вы используете дизайн‑систему, то будет видно ещё и название класса. Оно будет уникальным и соответствовать названию компонента.

В iOS в Xcode мы можем посмотреть всю иерархию интерфейса — View Hierarchy. В XCode эта функция также довольно просто устроена, можно подробно посмотреть все размеры, отступы и слои.

А вот в Android всё не так просто. В Android Studio есть встроенный инструмент Layout Inspector, но у него есть ограничения:

  • не все отступы отображаются, их сложно искать;

  • работает с Compose хуже, чем с традиционными View;

  • при работе со сложными иерархиями может тормозить;

  • иногда не показывает структуру компонентов;

  • нет визуальной подсветки на экране самого приложения.

Поэтому мы создали Debug Overlay — собственный инструмент, который даёт тестировщикам, дизайнерам и разработчикам под Android то, что уже давно есть на других платформах.

Debug Overlay

Debug Overlay — это вспомогательный инструмент визуального тестирования UI‑компонентов на Android, встроенный в каждое приложение, использующее дизайн‑систему. Он запускается в stage‑сборке, не попадает в прод и позволяет поверх интерфейса видеть:

  • границы компонентов;

  • их отступы и размеры;

  • вложенность компонентов внутри сложных блоков;

  • принадлежность к дизайн‑системе.

Инструмент лёгкий, не имеет отдельного интерфейса и запускается через стандартный набор кнопок разработчика в системных настройках Android. Мы сознательно делали его максимально «невидимым» в обычной работе, но при этом мощным в нужный момент.

В нашем демо-приложении есть переключатель, который позволяет включить Debug Overlay в любой момент:

Благодаря этому Debug Overlay можно использовать без специальных знаний: достаточно одного переключателя, чтобы получить всю информацию о визуале. Это не просто помощник для тестировщика, это способ сделать дизайн‑систему прозрачной, проверяемой и внедряемой. Благодаря ему:

  • мы ловим баги до релиза;

  • не тратим часы на субъективные «визуальные замечания»;

  • обучаем команды использовать ДС правильно;

  • и просто экономим время всех участников команды.

Чем он полезен?

Проверка отступов и размеров. Debug Overlay позволяет наглядно проверить соответствие отступов между компонентами. Для QA это ключевой способ верификации визуального качества интерфейса.

Проверка составных компонентов. Многие компоненты в дизайн‑системе — составные. Сложные карточки, формы, поля. Debug Overlay позволяет не только увидеть весь компонент, но и разобрать его на атомы: текст, иконку, отступ, кнопку.

Выявление «неправильных» компонентов. Благодаря встроенной логике Debug Overlay подсвечивает только компоненты дизайн‑системы. Если элемент не подсветился — это повод насторожиться: возможно, используется кастомное решение или обёртка. Это особенно важно при аудите, когда нужно быстро понять, где в продукте нарушена согласованность или почему компонент «ведёт себя странно».

Кто и как использует Debug Overlay?

Тестировщики. QA используют Overlay при финальном прогоне: проверяют отступы, выравнивание, соответствие компонентов требованиям. Это даёт уверенность, что интерфейс собран корректно и не поползёт после релиза.

Дизайнеры. Дизайнеры подключают Overlay, чтобы визуально свериться с макетом, особенно в случае адаптивов или пограничных случаев. Это избавляет от субъективных «кажется, не так», и превращает «ревью» в факт.

Разработчики. Иногда Debug Overlay — это способ самопроверки. Разработчик, подключая компонент, может убедиться, что взял именно тот блок из дизайн‑системы и что он отображается корректно.

Команда дизайн‑системы. Для нас это способ мониторинга: насколько активно и правильно используется дизайн‑система. Debug Overlay показывает, кто и где отходит от стандартов. Это помогает не только исправлять баги, но и обучать команды.

Когда мы подключаем Debug Overlay в продуктах других команд, он показывает, сколько элементов собраны на ДС, а сколько — на костылях. Это помогает планировать миграции и улучшать визуальное качество всего портфеля.

Лаборатории: как мы тестируем шрифты и тени

Лаборатории — это наша гордость. Когда мы проводили редизайн в дизайн‑системе, стало ясно: шрифты, тени и даже отступы ведут себя по‑разному в runtime, особенно в Android. Визуально компонент может выглядеть «почти как в макете», но не совпадать на пиксель. Поэтому мы сделали специальные экраны в демо‑приложении для проверки шрифтов и теней.

Проверка шрифтов

Для своих брендов большие компании чаще всего заказывают индивидуальные шрифты. У Сбера это SB Sans. Но подобные шрифты в макетах ведут себя одним образом, а в реальности — совершенно иначе, отображаются некорректно. Поэтому в Лаборатории шрифтов мы проверяем, как ведут шрифты при разных настройках:

  • в многострочных полях;

  • в жирном начертании;

  • при системном масштабировании;

  • при выравнивании и обрезке.

Это особенно критично для Android, где контейнеры могут случайно «отрезать» нижнюю линию текста или уехать на пару пикселей.

Проверка теней

В макете тень — это просто elevation. В коде — offset, blur и alpha. Мы вручную подбираем визуальное соответствие и фиксируем его в токенах. Благодаря Лаборатории мы добились точного соответствия между макетом и реализацией.

Theater: как мы снимаем «кино» про интерфейсы без операторов и монтажа

Когда мы рассказываем о дизайн‑системе пользователям или заказчикам, статичные скриншоты часто не передают всей картины. Как нам в картинках наглядно показать:

  • как плавно раскрывается «аккордеон»?

  • как кнопка реагирует на нажатие?

  • что происходит при ошибке в форме?

Теперь у нас есть Theater — библиотека, которая превращает код в профессиональные демо‑ролики. С её помощью можно получить нужное видео за 5 минут вместо нескольких часов съёмки. Theater автоматически генерирует видео работы интерфейсов прямо из кода (никаких ручных скриншотов и монтажа), а также позволяет проверить анимации на соответствие руководствам (тайминги, плавность, состояния).

Библиотека работает по принципу кинопроизводства. У нас есть «актёр», «сюжет» и «сцена».

Актёр (Actor) — это «герой»нашего ролика: любой UI‑компонент. Например, кнопка.

private class IconButtonActor : Actor {
    var variant by mutableStateOf(startVariant)
    var loading by mutableStateOf(value: false)
    var size by mutableStateOf(startSize)
    var shape by mutableStateOf(startShape)
    var color by mutableStateOf(startColor)
    var disabled by mutableStateOf(value: false)
    var icon by mutableStateOf(Flamingo.icons.User)

    @Composable
    override fun ActorScope.Actor() {
        Box(modifier = Modifier) {
            IconButton(
                onClick = {},
                icon = icon,
                contentDescription = null,
                size = size,
                variant = variant,
                color = color,
                shape = shape,
                loading = loading,
                disabled = disabled
            )
        }
    }
}

Сюжет (Plot) — сценарий поведения: какие действия выполняет компонент.

private val iconButtonPlot = Plot<IconButtonActor, FlamingoStage> {
    hideEndScreenActor()
    
    layer0.animateTo(
        rotationX = 0f,
        rotationY = 0f,
        scaleX = 2.30393f,
        scaleY = 2.30393f,
        translationX = 0f,
        translationY = 0f,
    )
    
    delay(timeMillis = 1000)
    leadActor.shape = IconButtonShape.SQUARE
    
    delay(timeMillis = 1000)
    leadActor.shape = IconButtonShape.CIRCLE
    
    delay(timeMillis = 1000)
    leadActor.indicator = IconButtonIndicator(
        IndicatorColor.DEFAULT, 
        IndicatorPlacement.TOP_END
    )
    
    delay(timeMillis = 1000)
    leadActor.loading = true
    
    delay(timeMillis = 1000)
    leadActor.loading = false
    
    delay(timeMillis = 1000)
}

Сцена (TheaterPackage) объединяет актёров и сюжеты в готовый «фильм»:

class TheaterPkg : TheaterPackage {
    override val play: TheaterPlay<*, *> = TheaterPlay(
        stage = FlamingoStage(),
        leadActor = IconButtonActor(),
        cast = listOf(
            IconButtonTableActor()
        ),
        sizeConfig = TheaterPlay.SizeConfig(
            density = Density(density = 4f)
        ),
        plot = iconButtonPlot,
        backstages = listOf(
            Backstage(
                name = "Icon Button",
                actor = IconButtonActor()
            ),
            Backstage(
                name = "Icon Button Table",
                actor = IconButtonTableActor()
            )
        )
    )
}

За кулисами (бекстейдж). Самое сложное здесь — это анимация. Но разработчики упростили нам жизнь: добавили в демо-приложение экран режиссирования. Здесь мы можем настроить всю сцену, попробовать разные параметры анимации и сразу увидеть, как меняется поведение компонента.

Советы по тестированию интерфейса

Тестирование интерфейса — это не просто «проверить, чтобы выглядело нормально». Это комплексная проверка визуальной целостности, поведения и устойчивости интерфейса в разных условиях. У нас есть чек‑лист, в котором отражён структурированный подход к тестированию компонентов. Мы проверяем:

Визуальную целостность:

  • Геометрию:

    • точность размеров и отступов (кратность 8 px);

    • скругления углов, толщина границ;

    • выравнивание элементов по сетке;

  • Типографику:

    • размер, межстрочный интервал, начертание;

    • контрастность текста;

    • переносы и обрезка длинных слов;

  • Цвета:

    • соответствие палитре дизайн‑системы;

    • корректность состояний (error, success, warning).

Поведение компонентов:

  • Состояние:

    • Hover, Pressed, Active;

    • Disabled — недоступные для взаимодействия элементы должны отличаться;

    • Loading — должны отображаться крутящиеся индикаторы загрузки;

    • Error — должно быть сообщение об ошибке, подсвеченное красным цветом;

  • Динамику:

    • плавность анимаций;

    • отсутствие «миганий» при переходах;

    • ripple‑эффекты.

  • Обратную связь:

    • изменение курсора — при наведении на кликабельные элементы курсор должен принимать вид указательного пальца (pointer);

    • визуальный ответ на действия (например, тень при нажатии).

Адаптивность:

  • Разные устройства:

    • телефоны (в том числе складные смартфоны);

    • планшеты;

    • десктоп‑версия.

  • Ориентации:

    • портретная;

    • альбомная.

  • Платформенные различия:

    • Safe Area в iOS;

    • навигационные панели в Android.

Темы:

  • светлая;

  • тёмная;

  • кастомные.

Качество интерфейса — это не только про пиксели, но и про предсказуемость поведения в любых условиях. Поэтому главный принцип: тестируйте не «как выглядит», а «как работает». Внедрите чек‑листы для компонентов, документируйте граничные случаи и не забывайте про accessibility.

Итоги: что даёт дизайн-система?

  • ускорение разработки: меньше времени на рутину;

  • качество: меньше багов в проде;

  • единообразие: один стиль на всех платформах.

Результаты можно оценить численно. Вот что дало внедрение нашей дизайн‑системы:

Дизайн-система поможет вашему продукту стать популярным. И если она будет удобная, качественная и протестированная, то и польза от неё будет выше.

Комментарии (0)