Основы тестирования кода на JavaScript

Основы тестирования кода на JavaScript

  • 7 сентября, 2023
  • читать 5 мин
Александра Донцова
Александра Донцова Front-end Developer в Sigma Software, Преподаватель Компьютерной школы Hillel.

Тестирование является неотъемлемой частью разработки программного обеспечения, которая помогает выявить и устранить ошибки и недостатки в вашем коде.

В веб-разработке тестирование JavaScript-кода крайне важно, поскольку веб-приложения взаимодействуют с различными браузерами и устройствами. В этой статье я предлагаю подробно рассмотреть основы тестирования кода JavaScript и посмотреть примеры различных подходов и инструментов для создания тестов.

Почему необходимо тестировать код?

Тестирование помогает обеспечить правильную работу кода в разных условиях и ситуациях. Вот несколько причин, почему важно тестировать ваш JavaScript-код:

  • Выявление ошибок на раннем этапе: тестирование позволяет выявить ошибки и недостатки до того, как ваш код попадет в продакшен.
  • Поддержка изменений: код со временем изменяется при рефакторинге или добавлении новой функциональности. Тестирование помогает убедиться, что изменения не нарушают существующую логику.
  • Уверенность в функциональности: при тестировании вы можете быть уверены, что ваш код работает так, как ожидается.

Типы тестов

В тестировании JavaScript-кода существует несколько типов тестов, которые помогают проверить различные аспекты функциональности вашего приложения:

  • Unit-тесты JavaScript: проверяют отдельные компоненты вашего кода (функции, классы и т.п.) на правильность работы. Они позволяют изолировать отдельные части кода для тестирования.

Рекомендуем публикацию по теме

  • Integration-тесты (Интеграционные тесты JS): проверяют взаимодействие между разными компонентами системы и их совместную работу.
  • End-to-End (E2E) тесты: симулируют реальные действия пользователя в приложении, проверяя его работу в целом.

E2E тестирование — это форма тестирования, которая проверяет работоспособность программного продукта от начала до конца, воссоздавая реальные сценарии использования и проверяя взаимодействие между различными компонентами системы.

Фреймворки для тестирования

Для тестирования JavaScript-кода есть различные фреймворки и библиотеки, которые помогают создавать и запускать тесты.

Один из самых распространенных фреймворков — Jest.

function add(a, b) {
  return a + b;
}

test('add should work correctly', () => {
  expect(add(2, 3)).toBe(5);
});

В этом примере мы использовали функцию test с Jest для определения теста, а expect — для проверки результата.

Примеры тестирования асинхронного кода

Тестирование асинхронных функций также очень важно. Например, для функции, загружающей данные с сервера:

async function fetchData() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();
  return data;
}

Теперь мы можем написать тест для этой функции, используя функцию async:

test('function fetchData should return right data', async () => {
  const fakeData = { value: 42 };
  global.fetch = jest.fn().mockResolvedValue({
    json: jest.fn().mockResolvedValue(fakeData)
  });

  const data = await fetchData();
  expect(data).toEqual(fakeData);
});

Тестирование функции по обработке условий

Предположим, у нас есть простая функция, которая проверяет, является ли число четным:

function isEven(number) {
  return number % 2 === 0;
}

Мы можем написать тест для этой функции, проверяя разные условия:

test('function isEven should return true for even numbers', () => {
  expect(isEven(2)).toBe(true);
  expect(isEven(4)).toBe(true);
  expect(isEven(10)).toBe(true);
});

test('function isEven should return false for odd numbers', () => {
  expect(isEven(3)).toBe(false);
  expect(isEven(7)).toBe(false);
  expect(isEven(11)).toBe(false);
});

Тестирование класса

Если у нас есть класс, например, для представления пользователей, мы можем написать тесты для разных его методов:

class User {
  constructor(name) {
    this.name = name;
    this.points = 0;
  }

  addPoints(amount) {
    this.points += amount;
  }

  deductPoints(amount) {
    if (this.points >= amount) {
      this.points -= amount;
    } else {
      throw new Error('Недостатньо балів');
    }
  }
}

test('method addPoints should add points correctly', () => {
  const user = new User('John');
  user.addPoints(50);
  expect(user.points).toBe(50);
});

test('method deductPoints should downgrade points correctly', () => {
  const user = new User('Jane');
  user.points = 100;
  user.deductPoints(30);
  expect(user.points).toBe(70);
});

test('method deductPoints should generate error, if points not enough', () => {
  const user = new User('Alice');
  user.points = 20;
  expect(() => user.deductPoints(30)).toThrow('Недостатньо балів');
});

Тестирование обработки ошибок

Тестирование обработки ошибок помогает убедиться, что ваш код правильно реагирует на непредвиденные ситуации.

Ниже приведена функция, разделяющая два числа:

function divide(a, b) {
  if (b === 0) {
    throw new Error('Ділення на нуль заборонено');
  }
  return a / b;
}

Теперь мы можем написать тест для проверки генерации ошибки при делении на ноль:

test('function divide should generate error when dividing by zero', () => 
  expect(() => divide(10, 0)).toThrow('Ділення на нуль заборонено');
});

Итак, тестирование JavaScript-кода является ключевым этапом в разработке программного обеспечения. В данной статье мы рассмотрели основные понятия тестирования, типы тестов и примеры использования фреймворка Jest для создания тестов.

Мы узнали, что тестирование помогает выявлять ошибки на ранних этапах разработки, обеспечивает уверенность в функциональности кода и помогает сохранять стабильность приложения во время изменений. Мы рассмотрели три основных типа тестов: Unit-тесты для проверки отдельных компонентов, Integration-тесты для взаимодействия между компонентами и End-to-End (E2E) тесты для проверки работы приложения в целом.

Фреймворки для тестирования, такие как Jest, предоставляют удобные инструменты для создания, запуска и анализа тестов. Мы рассмотрели примеры тестирования различных аспектов кода, включая функции по обработке условий, методы классов и обработку ошибок.

Вне зависимости от типа вашего проекта важно понимать, что тестирование является важной составляющей разработки программного обеспечения.

Регулярное создание и запуск тестов поможет обеспечить качество, надежность и стабильность вашего JavaScript-приложения.