Какие писал тесты?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Виды тестов в Node.js разработке
В своей практике писал тесты разных уровней, следуя пирамиде тестирования. Рассмотрю каждый тип и инструменты для их написания.
Unit-тесты
Назначение: тестирование отдельных функций и методов в изоляции
Инструменты: Jest, Mocha, Vitest
// Jest пример
describe('Calculator', () => {
it('should add two numbers', () => {
const result = add(2, 3);
expect(result).toBe(5);
});
it('should handle negative numbers', () => {
expect(add(-2, -3)).toBe(-5);
});
it('should throw error for non-numbers', () => {
expect(() => add('a', 2)).toThrow();
});
});
Лучшие практики:
- Тестируй граничные случаи (edge cases)
- Используй мокирование для зависимостей
- Быстрые тесты (миллисекунды)
- Высокое покрытие (90%+)
Integration-тесты
Назначение: тестирование взаимодействия между компонентами
describe('User Service Integration', () => {
it('should create and retrieve user', async () => {
const user = await userService.create({
name: 'John',
email: 'john@example.com'
});
expect(user.id).toBeDefined();
const retrieved = await userService.getById(user.id);
expect(retrieved.name).toBe('John');
});
});
Особенности:
- Работают с реальной БД (или in-memory)
- Медленнее unit-тестов
- Проверяют логику взаимодействия
- Нужна подготовка данных (fixtures)
E2E-тесты
Назначение: тестирование полного потока пользователя
Инструменты: Cypress, Playwright, Selenium
// Playwright пример для Node.js API
test('should complete payment flow', async ({ page }) => {
await page.goto('https://app.example.com');
// Логин
await page.fill('input[type="email"]', 'user@example.com');
await page.fill('input[type="password"]', 'password');
await page.click('button:has-text("Sign In")');
// Проверка редиректа
await expect(page).toHaveURL('/dashboard');
// Создание платежа
await page.click('button:has-text("Pay")');
await page.fill('input[placeholder="Card"]', '4111111111111111');
await page.click('button:has-text("Complete")');
// Проверка результата
await expect(page.locator('.success-message')).toBeVisible();
});
API-тесты
Назначение: тестирование REST/GraphQL endpoints
describe('POST /api/users', () => {
it('should create user', async () => {
const response = await request(app)
.post('/api/users')
.send({ name: 'John', email: 'john@example.com' })
.expect(201);
expect(response.body).toHaveProperty('id');
expect(response.body.name).toBe('John');
});
it('should validate email', async () => {
const response = await request(app)
.post('/api/users')
.send({ name: 'John', email: 'invalid' })
.expect(400);
expect(response.body.error).toBe('Invalid email');
});
});
Performance-тесты
Назначение: проверка скорости и нагрузки
describe('Performance', () => {
it('should respond within 100ms', async () => {
const start = Date.now();
await userService.getAll();
const duration = Date.now() - start;
expect(duration).toBeLessThan(100);
});
});
Snapshot-тесты
Назначение: отслеживание изменений в структурах данных
it('should generate correct response structure', () => {
const response = buildResponse({ status: 'ok' });
expect(response).toMatchSnapshot();
});
Мокирование зависимостей
const mockDatabase = {
findUser: jest.fn().mockResolvedValue({ id: 1, name: 'John' }),
createUser: jest.fn()
};
const userService = new UserService(mockDatabase);
it('should use database mock', async () => {
const user = await userService.getUser(1);
expect(mockDatabase.findUser).toHaveBeenCalledWith(1);
expect(user.name).toBe('John');
});
Пирамида тестирования
E2E (5%)
Integration (15%)
Unit Tests (80%)
Большая часть тестов должны быть unit-тесты (быстрые), интеграционные проверяют важные сценарии, E2E только критические пути.
Best Practices
- TDD — напиши тест, потом код
- Изоляция — каждый тест независим
- Чистота — setup/teardown через beforeEach/afterEach
- Понятные имена — should_createUser_withValidData
- Покрытие — минимум 90% кода
- Скорость — unit-тесты < 1мс, интеграция < 100мс
- Mocker гожности — мокируй внешние API, не БД в unit-тестах
Тестирование — инвестиция в качество и уверенность кода.