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

Как ты подходишь к тестированию кода, завязанного на дату/время или случайные значения?

1️⃣ Как кратко ответить

Для тестирования кода, завязанного на дату/время, использую фиксацию времени с помощью библиотек, таких как sinon.js, чтобы контролировать и стабилизировать время. Для случайных значений применяю фиксацию генератора случайных чисел или использую заранее определенные значения, чтобы обеспечить предсказуемость тестов.

2️⃣ Подробное объяснение темы

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

Тестирование кода, завязанного на дату/время

Когда код зависит от текущей даты или времени, тесты могут быть нестабильными, так как время постоянно меняется. Чтобы избежать этого, можно использовать фиксацию времени. Это позволяет "заморозить" время на определенном значении, чтобы тесты всегда выполнялись в одном и том же временном контексте.

Пример с использованием sinon.js

const sinon = require('sinon');
const { expect } = require('chai');
​
describe('Date-dependent code', () => {
  let clock;
​
  beforeEach(() => {
    // Устанавливаем фиксированное время: 1 января 2023 года, 12:00:00
    clock = sinon.useFakeTimers(new Date(2023, 0, 1, 12, 0, 0).getTime());
  });
​
  afterEach(() => {
    // Восстанавливаем оригинальное поведение времени
    clock.restore();
  });
​
  it('should return the correct greeting based on the time of day', () => {
    const greeting = getGreetingBasedOnTime(); // Функция, зависящая от времени
    expect(greeting).to.equal('Good afternoon');
  });
});
  • sinon.useFakeTimers(...): Фиксирует время на заданной дате и времени.
  • clock.restore(): Восстанавливает оригинальное поведение времени после выполнения теста.
  • getGreetingBasedOnTime(): Пример функции, которая возвращает приветствие в зависимости от времени суток.

Тестирование кода, завязанного на случайные значения

Код, который использует случайные значения, может быть сложным для тестирования, так как результаты могут быть непредсказуемыми. Чтобы сделать тесты предсказуемыми, можно зафиксировать генератор случайных чисел или использовать заранее определенные значения.

Пример с фиксацией случайных значений

const { expect } = require('chai');
​
describe('Random-dependent code', () => {
  it('should return a predictable random number', () => {
    // Фиксируем Math.random() на возвращение 0.5
    const originalRandom = Math.random;
    Math.random = () => 0.5;
​
    const randomValue = getRandomValue(); // Функция, зависящая от случайного значения
    expect(randomValue).to.equal(5); // Ожидаемое значение, если Math.random() возвращает 0.5
​
    // Восстанавливаем оригинальное поведение Math.random
    Math.random = originalRandom;
  });
});
  • Math.random = () => 0.5;: Фиксирует Math.random() на возвращение 0.5.
  • getRandomValue(): Пример функции, которая использует случайное значение для вычислений.
  • Math.random = originalRandom;: Восстанавливает оригинальное поведение Math.random после выполнения теста.

Зачем это нужно

Фиксация времени и случайных значений делает тесты предсказуемыми и стабильными. Это позволяет разработчикам уверенно изменять код, зная, что тесты не будут случайно падать из-за изменений во времени или случайных значениях. Это также упрощает отладку, так как результаты тестов всегда будут одинаковыми при каждом запуске.

Тема: Тестирование
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки