ScarletFlash
@ScarletFlash

Как ускорить прохождение unit-тестов на JS?

Всем привет!

Покрываю приложение тестами. Начать решил с хелперов, как с самых стабильных частей приложения.
Раньше тесты практически не писал, да и вообще, нет уверенности, что всё делаю правильно...).
Для тестирования используется Jest. Само приложение на TypeScript.

Написав некоторое количество тестов с определенным количеством кейсов, понял что на каждый хелпер уходит, в среднем, по 10 с., что, как мне кажется, слишком много для атомарных функций без внешних зависимостей. Кейсов в тесте, обычно около 3х. Бывает и больше, но время прохождения, всё-равно, примерно одинаковое. Рабочая машина мощная – 16 GB ОЗУ, Core i7. Оболочка – WSL.

Мне интересно, сколько времени занимают такие тесты у вас.

Пример теста

import { nameMock } from '@app/mocks';

import { incrementName } from './increment-name.helper';

describe('increment-name.helper.ts', () => {
  const nameSample: string = nameMock;
  const incrementedNameSample: string = `${nameMock} (1)`;
  const incrementedTwiceNameSample: string = `${nameMock} (2)`;

  it('should not increment name if namespace is empty', () => {
    expect(incrementName(nameSample)).toBe(nameSample);
  });

  it('should increment name if there is the same name in namespace', () => {
    expect(incrementName(nameSample, [nameSample])).toBe(incrementedNameSample);
  });

  it('should increment name if there is incremented name in namespace', () => {
    expect(incrementName(nameSample, [nameSample, incrementedNameSample])).toBe(incrementedTwiceNameSample);
  });
});

Пример хелпера

import { isNullOrUndefined } from './is-null-or-undefined.helper';

const getCurrentIncrement: (stringToCheck: string) => number = (stringToCheck: string): number => {
  const incrementedNamePattern: RegExp = new RegExp(/.*[ ][(](\d){1,}[)]$/, 'gm');
  const incrementPattern: RegExp = new RegExp(/[(](\d){1,}[)]$/, 'gm');

  const stringMatchesNamePattern: boolean = incrementedNamePattern.test(stringToCheck);
  if (!stringMatchesNamePattern) {
    return 0;
  }
  const bracedIncrement: string = incrementPattern.exec(stringToCheck)[0];
  enum bracketIndex {
    left = 1,
    right = bracedIncrement.length - 1
  }
  const increment: number = Number(bracedIncrement.substring(bracketIndex.left, bracketIndex.right));
  return !isNullOrUndefined(increment) && !isNaN(increment) ? increment : 0;
};

export const incrementName: (currentName: string, namesArray?: string[]) => string = (
  currentName: string,
  namesArray: string[] = []
): string => {
  if (!Array.isArray(namesArray) || namesArray.length === 0) {
    return currentName;
  }
  const matchingNames: string[] = namesArray.filter((innerName: string) => innerName.includes(currentName));
  if (matchingNames.length === 0) {
    return currentName;
  }
  const highestExistingIncrement: number = matchingNames.reduce(
    (previousInnerIncrement: number, currentInnerName: string) => {
      const currentInnerIncrement: number = getCurrentIncrement(currentInnerName);
      return currentInnerIncrement > previousInnerIncrement ? currentInnerIncrement : previousInnerIncrement;
    },
    0
  );
  return `${currentName} (${highestExistingIncrement + 1})`;
};

  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
Robur
@Robur
Знаю больше чем это необходимо
Интеграционный тест с поднятием/сбросом двух баз данных в докер контейнерах и динамической загрузкой всех файлов аппы для построения контейнера DI - секунд 15 - инициализация всего этого добра, дальше сам suite, как повезет. секунд 10 в среднем (около 10 тестов внутри).
Это запросы, записи в базу, получение ответов, построение проекций, запись во вторую базу и прочее.

Юнит тесты - 20-70ms на suite, там до 10 тестов в каждом. Тайпскрипт + jest.

Это на локальном ноуте где ide, браузер, разные виртуалки и так далее. На сервере быстрее.

Если у вас 10 секунд на юнит тест - то что-то явно идет не так. Скорее всего инициализация окружения столько времени занимает, что там происходит - вам надо разбираться детально.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы