В контексте тестирования Vue-компонентов параллельное выполнение тестов является критически важным для ускорения процесса сборки и повышения эффективности CI/CD пайплайнов. Vue Test Utils, в сочетании с современными тестовыми раннерами, такими как Jest или Vitest, позволяет распределять тесты между потоками без потери изоляции и стабильности.
Параллельное выполнение тестов подразумевает одновременное исполнение нескольких тестовых файлов или блоков, чтобы сократить общее время тестирования. В JavaScript-тестировании это достигается за счет процессов (processes) или воркеров (workers), которые запускаются независимо и изолированно.
Ключевые особенности:
mount или shallowMount, остаются
локальными для конкретного теста, что исключает гонки состояний.Для Jest параллельность включена по умолчанию. Jest использует количество ядер процессора для запуска воркеров:
{
"jest": {
"maxWorkers": "50%"
}
}
maxWorkers может быть числом или процентом от доступных
ядер.Для Vitest настройка выглядит аналогично:
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
threads: true, // включает многопоточность
maxThreads: 4, // ограничение количества потоков
isolate: true // изоляция тестов
}
});
threads отвечает за включение параллельного
выполнения.isolate гарантирует, что состояние между тестами не
будет пересекаться.Изоляция компонентов: Каждый тест должен создавать
свой экземпляр компонента через mount или
shallowMount. Это предотвращает взаимодействие между
параллельными тестами:
import { mount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';
test('рендерит текст корректно', () => {
const wrapper = mount(MyComponent, { props: { msg: 'Hello' } });
expect(wrapper.text()).toContain('Hello');
});
Избегание глобальных мутаций: При параллельном выполнении нельзя менять глобальные плагины Vue или глобальные стили внутри тестов. Любые изменения должны быть локализованы:
import { createApp } from 'vue';
import { mount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';
import MyPlugin from '@/plugins/MyPlugin';
test('использует локальный плагин', () => {
const app = createApp({});
app.use(MyPlugin);
const wrapper = mount(MyComponent, { global: { plugins: [MyPlugin] } });
expect(wrapper.vm.pluginActive).toBe(true);
});
Асинхронные тесты: При параллельной работе особенно важно правильно управлять асинхронными вызовами:
test('обновляет данные после API вызова', async () => {
const wrapper = mount(MyComponent);
await wrapper.vm.fetchData();
expect(wrapper.text()).toContain('Loaded');
});
Использование await и nextTick гарантирует
корректное завершение асинхронных операций, даже если тесты выполняются
параллельно.
При параллельном тестировании важно локализовать моки:
import axios from 'axios';
import { vi } from 'vitest';
vi.mock('axios');
test('вызывает API и получает данные', async () => {
axios.get.mockResolvedValue({ data: { value: 42 } });
const wrapper = mount(MyComponent);
await wrapper.vm.loadData();
expect(wrapper.vm.value).toBe(42);
});
--runInBand (Jest): Для
диагностики параллельных проблем можно временно отключить
параллельность.transformCache в
Vitest) ускоряет повторные запуски тестов.Параллельное выполнение тестов в Vue Test Utils требует внимательного подхода к изоляции компонентов, управлению моками и асинхронными операциями. Правильная настройка воркеров и потоков позволяет максимально эффективно использовать ресурсы процессора и ускорять тестирование без потери надежности.