Автоматизированные тесты помогают вам и вашей команде быстро и уверенно создавать сложные приложения Vue, предотвращая регрессии и поощряя разбивать приложение на тестируемые функции, модули, классы и компоненты.
Как и любое приложение, ваше новое приложение Vue может давать сбои по разным причинам, и важно, чтобы вы могли выявить эти проблемы и исправить их перед выпуском.
В этом руководстве мы рассмотрим базовую терминологию и дадим рекомендации о том, какие инструменты выбрать для вашего приложения Vue 3.
# Testing Composables
Обратите внимание
В этом разделе предполагается, что вы прочитали раздел Composables
Когда дело доходит до тестирования составных компонентов, мы можем разделить их на две категории: составные объекты, которые не полагаются на экземпляр хост-компонента, и составные объекты, которые это делают
Составной объект зависит от экземпляра хост-компонента, если он использует следующие API
- Перехватчики жизненного цикла
- Предоставление/внедрение
Если компонуемый объект использует только API-интерфейсы реактивности, то его можно протестировать, напрямую вызвав его и подтвердив возвращаемое состояние/методы:
Компонуемый объект, который опирается на перехватчики жизненного цикла или Provide/Inject, должен быть обернут в хост-компонент для тестирования. Мы можем создать помощника, как показано ниже
Когда проводить тестирование
Начните тестирование заранее! Мы рекомендуем вам начать писать тесты как можно скорее. Чем дольше вы ждете добавления тестов в свое приложение, тем больше зависимостей будет у вашего приложения и тем труднее его будет запустить.
Типы тестирования
При разработке стратегии тестирования вашего приложения Vue вам следует использовать следующие типы тестирования
- Модуль: проверяет, что входные данные для данной функции, класса или компонуемого объекта дают ожидаемый результат или побочные эффекты.
- Компонент: проверяет, что ваш компонент монтируется, отображается, с ним можно взаимодействовать и ведет себя должным образом. Эти тесты импортируют больше кода, чем модульные тесты, они более сложны и требуют больше времени для выполнения.
- Сквозной: проверяет функции, охватывающие несколько страниц, и отправляет реальные сетевые запросы к вашему готовому приложению Vue. Эти тесты часто включают в себя проверку базы данных или другого бэкэнда.
Каждый тип тестирования играет свою роль в стратегии тестирования вашего приложения, и каждый из них защитит вас от различных типов проблем.
Модульное тестирование
Модульные тесты пишутся для проверки того, что небольшие изолированные блоки кода работают должным образом. Модульный тест обычно охватывает одну функцию, класс, составной элемент или модуль. Модульные тесты фокусируются на логической корректности и касаются лишь небольшой части общей функциональности приложения. Они могут имитировать большие части среды вашего приложения (например, исходное состояние, сложные классы, сторонние модули и сетевые запросы).
Коротко
Модульные тесты выявляют проблемы с бизнес-логикой функции и ее логической корректностью.
Возьмем, к примеру, эту increment функцию
Поскольку он очень автономен, будет легко вызвать функцию приращения и убедиться, что она возвращает то, что должно, поэтому мы напишем модульный тест.
Если какое-либо из этих утверждений терпит неудачу, ясно, что проблема содержится внутри функции increment
Как упоминалось ранее, модульное тестирование обычно применяется к автономной бизнес-логике, компонентам, классам, модулям или функциям, которые не связаны с рендерингом пользовательского интерфейса, сетевыми запросами или другими проблемами окружающей среды.
Обычно это простые модули JavaScript/TypeScript, не связанные с Vue. В целом написание модульных тестов для бизнес-логики в приложениях Vue существенно не отличается от приложений, использующих другие фреймворки.
Есть два случая, когда вы СДЕЛАЕТЕ модульное тестирование функций Vue
- 1. Composables
- 2. Components
# Компоненты модульного тестирования
Компонент можно протестировать двумя способами
- 1. Белый ящик: модульное тестирование Тесты, являющиеся «тестами белого ящика», учитывают детали реализации и зависимости компонента. Они сосредоточены на изоляции тестируемого компонента. Эти тесты обычно включают в себя имитацию некоторых, если не всех, дочерних элементов вашего компонента, а также настройку состояния и зависимостей плагина (например, Pinia).
- 2. Черный ящик: тестирование компонентов Тесты, являющиеся «тестами черного ящика», не знают деталей реализации компонента. Эти тесты как можно меньше имитируют интеграцию вашего компонента и всей системы. Обычно они отображают все дочерние компоненты и считаются скорее «интеграционным тестом»
# Рекомендация
- Поскольку официальная установка, созданная с create-vue помощью Vite , мы рекомендуем использовать среду модульного тестирования, которая может использовать ту же конфигурацию и преобразовывать конвейер непосредственно из Vite. Vitest — это среда модульного тестирования, разработанная специально для этой цели, созданная и поддерживаемая членами команды Vue/Vite. Он интегрируется с проектами на базе Vite с минимальными усилиями и работает очень быстро.
- Jest — популярная среда модульного тестирования. Однако мы рекомендуем Jest только в том случае, если у вас есть существующий набор тестов Jest, который необходимо перенести в проект на основе Vite, поскольку Vitest предлагает более плавную интеграцию и лучшую производительность.
Тестирование компонентов
В приложениях Vue компоненты являются основными строительными блоками пользовательского интерфейса. Таким образом, компоненты являются естественной единицей изоляции, когда дело доходит до проверки поведения вашего приложения. С точки зрения детализации тестирование компонентов находится где-то выше модульного тестирования и может рассматриваться как форма интеграционного тестирования. Большая часть вашего приложения Vue должна быть подвергнута тестированию компонентов, и мы рекомендуем, чтобы у каждого компонента Vue был собственный файл спецификаций.
Тесты компонентов должны выявлять проблемы, связанные с реквизитами вашего компонента, событиями, слотами, которые он предоставляет, стилями, классами, перехватчиками жизненного цикла и т. д.
Тесты компонентов не должны имитировать дочерние компоненты, а вместо этого проверять взаимодействие между вашим компонентом и его дочерними элементами, взаимодействуя с компонентами так, как это сделал бы пользователь. Например, тест компонента должен щелкнуть элемент, как это сделал бы пользователь, вместо того, чтобы программно взаимодействовать с компонентом.
Тесты компонентов должны быть сосредоточены на общедоступных интерфейсах компонента, а не на деталях внутренней реализации. Для большинства компонентов общедоступный интерфейс ограничен: создаваемыми событиями, реквизитами и слотами. При тестировании не забывайте проверять, что делает компонент, а не то, как он это делает
Когда нужно использовать
- Для визуальной логики: подтвердите правильный вывод рендеринга на основе введенных реквизитов и слотов.
- Для поведенческой логики: утверждайте правильные обновления рендеринга или создаваемые события в ответ на события пользовательского ввода
Рекомендации
- Не утверждайте частное состояние экземпляра компонента и не тестируйте частные методы компонента. Детали реализации тестирования делают тесты хрупкими, поскольку они с большей вероятностью сломаются и потребуют обновлений при изменении реализации
- Конечная задача компонента — отрисовка правильного вывода DOM, поэтому тесты, ориентированные на вывод DOM, обеспечивают тот же уровень гарантии правильности (если не больше), будучи более надежными и устойчивыми к изменениям.
- Не полагайтесь исключительно на тесты моментальных снимков. Утверждение строк HTML не описывает правильность. Пишите тесты намеренно.
- Если метод необходимо тщательно протестировать, рассмотрите возможность выделения его в отдельную служебную функцию и напишите для него специальный модульный тест. Если его невозможно извлечь чисто, его можно протестировать как часть охватывающего его компонента, интеграции или сквозного теста.
Основные различия между Vitest и браузерными раннерами — это скорость и контекст выполнения. Короче говоря, средства запуска на основе браузера, такие как Cypress, могут обнаруживать проблемы, которые не могут обнаружить средства запуска на основе узлов, такие как Vitest (например, проблемы со стилем, настоящие собственные события DOM, файлы cookie, локальное хранилище и сбои сети), но средства запуска на основе браузера на несколько порядков медленнее, чем Vitest, потому что они открывают браузер, компилируют ваши таблицы стилей и многое другое. Cypress — это браузерный раннер, поддерживающий тестирование компонентов.
# Монтирование библиотек
Тестирование компонентов часто включает в себя изолированное монтирование тестируемого компонента, запуск имитируемых событий пользовательского ввода и утверждение отображаемых выходных данных DOM. Существуют специальные библиотеки утилит, которые упрощают эти задачи
@vue/test-utils — это официальная библиотека низкоуровневого тестирования компонентов, написанная для предоставления пользователям доступа к API-интерфейсам Vue. Это также библиотека нижнего уровня, @testing-library/vue построенная поверх нее.
@testing-library/vue — это библиотека тестирования Vue, ориентированная на тестирование компонентов, не полагаясь на детали реализации. Его руководящий принцип заключается в том, что чем больше тесты напоминают способ использования программного обеспечения, тем больше уверенности они могут обеспечить.
Рекомендуем использовать @vue/test-utils для тестирования компонентов в приложениях. @testing-library/vue имеет проблемы с тестированием асинхронного компонента с помощью Suspense, поэтому его следует использовать с осторожностью.
Другие варианты
- Nightwatch — это средство запуска тестов E2E с поддержкой тестирования компонентов Vue
- WebdriverIO для кросс-браузерного тестирования компонентов, основанного на собственном взаимодействии с пользователем на основе стандартизированной автоматизации. Его также можно использовать с библиотекой тестирования.
E2E-тестирование
Хотя модульные тесты дают разработчикам некоторую степень уверенности, модульные и компонентные тесты ограничены в своих возможностях обеспечить целостное покрытие приложения при его развертывании в рабочей среде. В результате сквозные тесты (E2E) охватывают, возможно, самый важный аспект приложения: что происходит, когда пользователи действительно используют ваши приложения.
Сквозные тесты фокусируются на поведении многостраничных приложений, которые отправляют сетевые запросы к вашему рабочему приложению Vue. Они часто включают в себя работу с базой данных или другим серверным компонентом и могут даже выполняться в живой промежуточной среде.
Сквозные тесты часто выявляют проблемы с вашим маршрутизатором, библиотекой управления состоянием, компонентами верхнего уровня (например, приложением или макетом), общедоступными активами или любой обработкой запросов. Как указано выше, они выявляют критические проблемы, которые невозможно выявить с помощью модульных или компонентных тестов.
Сквозные тесты не импортируют какой-либо код вашего приложения Vue, а вместо этого полностью полагаются на тестирование вашего приложения путем навигации по целым страницам в реальном браузере.
Сквозные тесты проверяют многие уровни вашего приложения. Они могут быть нацелены либо на ваше локально созданное приложение, либо даже на живую промежуточную среду. Тестирование в вашей промежуточной среде включает не только внешний код и статический сервер, но и все связанные с ним серверные службы и инфраструктуру.
Цитата
Чем больше ваши тесты напоминают то, как используется ваше программное обеспечение, тем больше уверенности они могут вам дать. - Кент К. Доддс – автор библиотеки тестирования
Тестирование E2E, проверяющее, как действия пользователя влияют на ваше приложение, часто является ключом к более высокой уверенности в том, правильно ли работает приложение или нет.
# Выбор решения для тестирования E2E
В то время как сквозное (E2E) тестирование в сети приобрело негативную репутацию из-за ненадежных (ненадежных) тестов и замедления процессов разработки, современные инструменты E2E добились успехов в создании более надежных, интерактивных и полезных тестов. При выборе среды тестирования E2E в следующих разделах представлены некоторые рекомендации о том, что следует учитывать при выборе среды тестирования для вашего приложения.
# Кроссбраузерное тестирование
Одним из основных преимуществ сквозного (E2E) тестирования является возможность тестировать ваше приложение в нескольких браузерах. Хотя может показаться желательным обеспечить 100% кроссбраузерность, важно отметить, что кроссбраузерное тестирование снижает отдачу от ресурсов команды из-за дополнительного времени и мощности компьютера, необходимых для его последовательного выполнения. В результате важно помнить об этом компромиссе при выборе объема кроссбраузерного тестирования, необходимого вашему приложению.
# Более быстрые циклы обратной связи
Одна из основных проблем комплексного (E2E) тестирования и разработки заключается в том, что запуск всего пакета занимает много времени. Обычно это делается только в конвейерах непрерывной интеграции и развертывания (CI/CD). Современные среды тестирования E2E помогли решить эту проблему, добавив такие функции, как распараллеливание, которое позволяет конвейерам CI/CD часто работать намного быстрее, чем раньше. Кроме того, при локальной разработке возможность выборочного запуска одного теста для страницы, над которой вы работаете, а также обеспечение «горячей» перезагрузки тестов может помочь улучшить рабочий процесс и производительность разработчика.
# Первоклассный опыт отладки
В то время как разработчики традиционно полагались на сканирование журналов в окне терминала, чтобы определить, что пошло не так в тесте, современные среды сквозного тестирования (E2E) позволяют разработчикам использовать инструменты, с которыми они уже знакомы, например инструменты разработчика браузера.
# Видимость в безголовом режиме
Когда сквозные (E2E) тесты запускаются в конвейерах непрерывной интеграции/развертывания, они часто запускаются в автономных браузерах (т. е. ни один видимый браузер не открывается для просмотра пользователем). Важнейшей особенностью современных сред тестирования E2E является возможность просматривать снимки и/или видео приложения во время тестирования, что дает некоторое представление о том, почему происходят ошибки. Исторически сложилось так, что поддерживать такую интеграцию было утомительно.
Cypress
В целом, мы считаем, что Cypress предоставляет наиболее полное решение E2E с такими функциями, как информативный графический интерфейс, отличная возможность отладки, встроенные утверждения и заглушки, устойчивость к взлому, параллелизация и снимки. Как упоминалось выше, он также обеспечивает поддержку тестирования компонентов . Однако он поддерживает только браузеры на базе Chromium и Firefox.
Другие варианты
- Playwright также является отличным решением для E2E-тестирования с более широкой поддержкой браузеров (в основном WebKit).
- Nightwatch — это решение для E2E-тестирования, основанное на Selenium WebDriver . Это дает ему самый широкий диапазон поддержки браузеров.
- WebdriverIO — это платформа автоматизации тестирования для веб- и мобильного тестирования, основанная на протоколе WebDriver.