Знаете ли вы о проблемах с нативным test runner в node.js?nodejs-52

1. Основные проблемы нативного Test Runner

1.1. Ограниченная функциональность по сравнению с Jest/Mocha

Нативный Test Runner, появившийся в Node.js 18+, пока уступает по возможностям:

  • Нет встроенного покрытия кода (coverage)
  • Отсутствие расширенных матчеров (аналогов expect из Jest)
  • Ограниченные возможности мокирования

Пример сравнения:

// Jest
test('should work', () => {
  expect(sum(1, 2)).toBe(3);
});

// Node.js Test Runner
test('should work', (t) => {
  t.equal(sum(1, 2), 3);
});

1.2. Проблемы с параллельным выполнением тестов

Хотя Test Runner поддерживает параллельное выполнение, есть нюансы:

  • Сложность управления общими ресурсами
  • Проблемы с глобальными состояниями
  • Непредсказуемый порядок выполнения

1.3. Ограниченная интеграция с инструментами

Проблемные моменты:

  • Сложности с интеграцией в CI/CD системы
  • Меньше плагинов и расширений
  • Ограниченная поддержка IDE

2. Проблемы производительности

2.1. Запуск тестов

  • Нет кэширования результатов
  • Медленный запуск по сравнению с Jest для больших проектов

2.2. Потребление памяти

  • Высокое потребление памяти при параллельном выполнении
  • Утечки памяти в долгоживущих тестах

3. Проблемы API и DX

3.1. Неудобный отчет об ошибках

  • Менее информативные сообщения об ошибках
  • Сложная навигация по стеку вызовов

3.2. Ограниченные хуки

Пример ограничений:

beforeEach(() => {
  // Работает только на уровне test suite
});

4. Проблемы с TypeScript и транспиляцией

4.1. Нет встроенной поддержки TypeScript

Требуется дополнительная настройка:

node --loader ts-node/esm test.js

4.2. Проблемы с source maps

  • Не всегда корректно отображаются строки ошибок
  • Сложности с отладкой

5. Решения и обходные пути

5.1. Использование дополнительных библиотек

Комбинация с assert/strict и util:

import assert from 'node:assert/strict';
import { mock } from 'node:test';

test('mock test', () => {
  const fn = mock.fn();
  fn();
  assert.equal(fn.mock.calls.length, 1);
});

5.2. Кастомные репортеры

Создание своих репортеров через TestEvent:

import { test, TestEvent } from 'node:test';

const reporter = new TestEvent();
reporter.on('test:finish', (data) => {
  console.log(`Test ${data.name} finished`);
});

5.3. Интеграция с coverage инструментами

Использование c8:

npx c8 node --test

6. Сравнение с альтернативами

Метод Операций/сек Память
console.log10,000Низкая
Winston (JSON)7,000Средняя
Pino20,000Низкая
Bunyan5,000Средняя

7. Будущее нативного Test Runner

Планируемые улучшения:

  • Встроенная поддержка coverage
  • Улучшенные матчеры
  • Лучшая интеграция с TypeScript
  • Оптимизация памяти

Резюмируем:

Нативный Test Runner в Node.js - это перспективный, но пока сыроватый инструмент. Он подходит для базового тестирования, но для сложных проектов с большим количеством тестов пока лучше использовать Jest или Mocha. Основные проблемы - ограниченная функциональность, сложности с параллельным выполнением и неидеальная производительность. Однако для простых проектов и встроенных в Node.js решений он может быть хорошим выбором.