При тестировании компонентов Vue основная нагрузка на производительность приходится на работу с DOM. Каждое взаимодействие с реальным DOM, рендеринг или перерисовка компонента увеличивает время выполнения тестов. Vue Test Utils предоставляет инструменты для минимизации этих операций, позволяя ускорять тесты и снижать вероятность ошибок, связанных с асинхронными обновлениями.
shallowMount вместо mountmount полностью рендерит компонент,
включая все дочерние компоненты. Это необходимо, если требуется проверка
полной структуры или взаимодействия между компонентами. Однако если цель
теста — проверка логики самого компонента, рендеринг всех вложенных
компонентов становится избыточным.
shallowMount рендерит только сам
тестируемый компонент и заменяет дочерние компоненты заглушками. Это
снижает количество операций с DOM, ускоряет тесты и делает их более
изолированными.
import { shallowMount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
const wrapper = shallowMount(MyComponent)
При этом wrapper будет содержать все методы и свойства
компонента, но дочерние компоненты будут заменены на простые заглушки,
что минимизирует создание элементов в DOM.
find и findComponent для локальных
выборокПоиск элементов в DOM — дорогая операция. Важно ограничивать область
поиска, используя методы find и
findComponent:
const button = wrapper.find('button.submit')
button.trigger('click')
Вместо глобального поиска по всему дереву DOM лучше использовать методы поиска относительно уже найденных узлов. Например:
const form = wrapper.find('form')
const submitButton = form.find('button.submit')
Такой подход минимизирует количество обходов дерева компонентов.
setData и
setPropsИзменение состояния компонента через wrapper.vm напрямую
может привести к множественным перерисовкам DOM. Vue Test Utils
предоставляет асинхронные методы setData,
setProps и setValue, которые аккумулируют
изменения и вызывают обновление компонента один раз:
await wrapper.setData({ count: 5 })
await wrapper.setProps({ title: 'New Title' })
Эти методы автоматически ждут следующего “tick” Vue, что предотвращает лишние синхронные обновления DOM и делает тест более предсказуемым.
Использование trigger для имитации событий может
вызывать перерисовку компонентов. Чтобы минимизировать влияние на DOM,
события нужно объединять с ожиданием nextTick:
import { nextTick } from 'vue'
await button.trigger('click')
await nextTick()
Это гарантирует, что DOM будет обновлен один раз после всех изменений состояния, а не после каждого события.
Если цель теста — проверка логики, а не визуального отображения,
можно использовать виртуальный DOM через shallow
рендеринг и обращение к wrapper.html() или
wrapper.text() без необходимости работы с настоящими
узлами:
expect(wrapper.html()).toContain('Submit')
expect(wrapper.text()).toBe('Hello World')
Такой подход уменьшает нагрузку на систему и ускоряет выполнение тестов.
Для минимизации DOM операций полезно изолировать компонент от внешних зависимостей. Дочерние компоненты можно подменять заглушками или моками:
import { shallowMount } from '@vue/test-utils'
import Parent from '@/components/Parent.vue'
const wrapper = shallowMount(Parent, {
global: {
stubs: {
Child: true
}
}
})
Это предотвращает рендеринг сложных дочерних компонентов и снижает количество операций с DOM.
beforeEach для повторного монтированияЧтобы избежать накопления DOM элементов между тестами, рекомендуется монтировать компонент заново перед каждым тестом:
let wrapper
beforeEach(() => {
wrapper = shallowMount(MyComponent)
})
Такой подход предотвращает лишние операции по обновлению уже существующих элементов и сохраняет тесты изолированными.
shallowMount вместо полного
mount, если тест не требует рендеринга дочерних
компонентов.setData и setProps для
аккумулирования изменений состояния.nextTick для одного обновления
DOM.Применение этих подходов снижает количество операций с DOM, ускоряет тесты и повышает стабильность проверки логики Vue компонентов.