← Назад к вопросам

Какие писал тесты?

1.3 Junior🔥 191 комментариев
#Soft skills и опыт работы#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Виды тестов в 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

  1. TDD — напиши тест, потом код
  2. Изоляция — каждый тест независим
  3. Чистота — setup/teardown через beforeEach/afterEach
  4. Понятные имена — should_createUser_withValidData
  5. Покрытие — минимум 90% кода
  6. Скорость — unit-тесты < 1мс, интеграция < 100мс
  7. Mocker гожности — мокируй внешние API, не БД в unit-тестах

Тестирование — инвестиция в качество и уверенность кода.

Какие писал тесты? | PrepBro