Для тестирования компонентов Vue используется библиотека Vue Test Utils (VTU), которая обеспечивает API для рендеринга компонентов, симуляции событий и проверки состояния DOM. Для начала необходимо установить необходимые зависимости:
npm install @vue/test-utils vue@3
npm install --save-dev jest
Для проектов на Vue 2 используется соответствующая версия
vue@2 и @vue/test-utils@1.
После установки создаётся конфигурация Jest
(jest.config.js) с указанием трансформации файлов
.vue:
module.exports = {
moduleFileExtensions: ['js', 'json', 'vue'],
transform: {
'^.+\\.vue$': '@vue/vue3-jest',
'^.+\\.js$': 'babel-jest'
},
testEnvironment: 'jsdom'
};
Vue Test Utils предоставляет два основных метода рендеринга:
mount — полный рендер компонента,
включая дочерние компоненты. Используется для интеграционных тестов и
проверки взаимодействия между компонентами.shallowMount — частичный рендер, где
дочерние компоненты заменяются заглушками. Позволяет ускорить
тестирование, снижая нагрузку на среду выполнения.Пример использования:
import { mount, shallowMount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';
const wrapper = mount(MyComponent);
const shallowWrapper = shallowMount(MyComponent);
Важно: для анализа производительности тестов
рекомендуется отдавать предпочтение shallowMount, если нет
необходимости в полном рендере дочерних компонентов. Это сокращает время
выполнения тестов и уменьшает потребление памяти.
VTU позволяет имитировать пользовательские действия и события DOM:
await wrapper.find('button').trigger('click');
Асинхронные обновления состояния компонентов в Vue обрабатываются
через nextTick:
import { nextTick } from 'vue';
await wrapper.setData({ counter: 1 });
await nextTick();
expect(wrapper.text()).toContain('1');
Для сложных компонентов с асинхронной загрузкой данных важно учитывать задержку в тестах. Неправильное ожидание может приводить к нестабильности тестов и увеличению времени их выполнения.
Jest предоставляет встроенные средства для измерения времени выполнения отдельных тестов и блоков:
test('должен работать быстро', () => {
const start = performance.now();
const wrapper = mount(MyComponent);
const end = performance.now();
console.log(`Время рендера: ${end - start} мс`);
});
Можно использовать Jest хук beforeEach
или afterEach для замеров времени
выполнения всех тестов в рамках одного блока describe:
let start;
beforeEach(() => {
start = performance.now();
});
afterEach(() => {
const end = performance.now();
console.log(`Тест выполнен за ${end - start} мс`);
});
shallowMountЧастичный рендер снижает нагрузку на процессор и ускоряет тесты. Если тест проверяет только логику текущего компонента, полностью рендерить дочерние компоненты нецелесообразно.
Внешние сервисы и API-запросы замещаются моками:
jest.mock('@/api/user', () => ({
fetchUser: jest.fn(() => Promise.resolve({ name: 'Test' }))
}));
Это предотвращает сетевые задержки и ускоряет тестирование.
Большие интеграционные тесты с множеством проверок выполняются медленно. Оптимально разбивать тесты на мелкие, атомарные единицы, проверяющие один аспект компонента.
Частое использование wrapper.html() и
wrapper.findAll() замедляет тесты, особенно для больших
деревьев компонентов. Рекомендуется минимизировать эти операции и
работать с конкретными элементами.
Vue активно использует асинхронное обновление состояния. Для ускорения тестов применяются Jest таймеры:
jest.useFakeTimers();
wrapper.find('button').trigger('click');
jest.runAllTimers();
await nextTick();
Это устраняет реальные задержки и уменьшает время выполнения тестов с асинхронными эффектами.
Для анализа скорости выполнения полезно отслеживать:
mount vs
shallowMount).setData, nextTick,
axios mocks).find,
findAll, html).describe с
использованием beforeEach и afterEach.Использование этих метрик позволяет выявлять узкие места в тестах и принимать решения об их оптимизации.
Jest выполняет тесты параллельно по файлам, что ускоряет весь набор. Для более точного анализа времени выполнения отдельных тестов следует:
beforeAll блоков.--runInBand для локальной отладки узких
мест и измерения точного времени выполнения.shallowMount для единичных тестов и
mount только для интеграционных сценариев.Эти подходы позволяют поддерживать скорость тестов на высоком уровне, предотвращая деградацию производительности при росте проекта и объема тестов.