Тестирование JavaScript — Vitest и Testing Library
Тестирование JavaScript
В современном фронтенде стандарт — Vitest (быстрый runner, совместим с Vite) и Testing Library (тесты через DOM, как пользователь). Jest по-прежнему встречается в legacy и Create React App.
Связь: React, Vue, Node.js, раздел тестирования.
Vitest vs Jest
| Vitest | Jest | |
|---|---|---|
| Скорость dev | Очень высокая (ESM, Vite) | Медленнее на больших проектах |
| Конфиг | vite.config.ts + test | jest.config.js |
| API | describe, it, expect — как в Jest | Оригинал |
| CRA / старые проекты | Миграция возможна | Из коробки |
Новые проекты на Vite / Next / Vue CLI 5+ чаще выбирают Vitest.
Чистые функции (unit)
npm init -y
npm install -D vitest
package.json:
{
"type": "module",
"scripts": {
"test": "vitest",
"test:run": "vitest run"
}
}
src/sum.js:
export function sum(a, b) {
return a + b;
}
src/sum.test.js:
import { describe, it, expect } from 'vitest';
import { sum } from './sum.js';
describe('sum', () => {
it('adds numbers', () => {
expect(sum(2, 3)).toBe(5);
});
});
npm test
React + Testing Library
npm create vite@latest my-app -- --template react
cd my-app
npm install -D vitest jsdom @testing-library/react @testing-library/jest-dom @testing-library/user-event
vite.config.js:
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
test: {
environment: 'jsdom',
setupFiles: './src/test/setup.js',
},
});
src/test/setup.js:
import '@testing-library/jest-dom/vitest';
src/Counter.jsx:
import { useState } from 'react';
export function Counter() {
const [n, setN] = useState(0);
return (
<div>
<span data-testid="count">{n}</span>
<button type="button" onClick={() => setN((x) => x + 1)}>+1</button>
</div>
);
}
src/Counter.test.jsx:
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { describe, it, expect } from 'vitest';
import { Counter } from './Counter';
describe('Counter', () => {
it('increments on click', async () => {
const user = userEvent.setup();
render(<Counter />);
expect(screen.getByTestId('count')).toHaveTextContent('0');
await user.click(screen.getByRole('button', { name: '+1' }));
expect(screen.getByTestId('count')).toHaveTextContent('1');
});
});
Принцип Testing Library: искать по роли/тексту, а не по классам CSS.
Тест API на Node (Supertest)
npm install express
npm install -D vitest supertest
app.js:
import express from 'express';
export const app = express();
app.get('/health', (_req, res) => res.json({ ok: true }));
app.test.js:
import request from 'supertest';
import { describe, it, expect } from 'vitest';
import { app } from './app.js';
describe('GET /health', () => {
it('returns ok', async () => {
const res = await request(app).get('/health');
expect(res.status).toBe(200);
expect(res.body).toEqual({ ok: true });
});
});
См. Первая программа на Node.js.
E2E (граница раздела)
Браузерные сценарии — Playwright или Cypress (упоминаются в Vue и React), не Vitest. Пирамида тестов: много unit → меньше integration → мало e2e.
CI
- run: npm ci
- run: npm run test:run
Связанные материалы
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Основы JavaScript - стандарт ECMAScript, модель выполнения и базовые конструкции языка. Фундамент для начинающего программиста - что повторить, как работать, чего ожидать. Для создания массивов используется литеральная нотация. Конструктор Array не применяется. Как работать с HTML-элементами, как их создавать, менять. Простые приложения на JavaScript - базовые сценарии, структура кода и быстрый старт с практическими примерами. Расширения файлов определяют способ обработки кода средой выполнения или компилятором. История JavaScript - происхождение языка, ключевые этапы развития и влияние на современный веб. Такое именование представляет собой соглашение между разработчиками. Классический JavaScript не обеспечивает реальной приватности через подчеркивания. JavaScript содержит набор зарезервированных слов, которые имеют специальное значение в языке. Эти слова нельзя использовать в качестве идентификаторов для переменных, функций или классов. Встроенные функции JavaScript - ключевые методы массивов, строк и объектов для повседневной разработки. Этот шаблон описывает подключение внешних функций, классов или значений из других файлов. Он используется в начале файла и определяет зависимости текущего модуля. JavaScript используется для создания кроссплатформенных мобильных приложений, которые работают на iOS и Android с использованием единой кодовой базы.Основы JavaScript
Что требуется знать перед началом изучения языка программирования JavaScript
Рекомендации по разработке на JavaScript
Работа с HTML в JavaScript
Простые приложения на JavaScript
Форматы JavaScript
История языка JavaScript
Синтаксис и пунктуация в JavaScript
Ключевые слова языка JavaScript
Встроенные функции JavaScript
Структура и подключение JavaScript-кода
Применение JavaScript в вебе и за его пределами