Теория 📔
July 4

Написание учебных тестов для лучшего понимания кода

Наткнулся на интересное для себя понятие "Учебные тесты". Они описаны в книге Джима Ньюкирка по TDD. Эти тесты нужны для того, чтобы понять, как работает внешний код или библиотека, они не обязательно являются частью окончательной тестовой базы, но служат важной цели - они помогают разработчикам исследовать и анализировать границы внешних библиотек и инструментов, которые они используют.

Основные моменты:

  1. Исследование поведения: Учебные тесты позволяют разработчикам исследовать поведение внешнего кода или библиотеки. Это особенно важно, когда документация неполная или неясная. Пишутся тесты, чтобы проверить, как ведет себя библиотека в различных ситуациях.
  2. Фиксация поведения: Эти тесты фиксируют текущее поведение внешнего компонента. Это может быть полезно для будущих ссылок или если поведение библиотеки изменится в будущем, можно будет сравнить с тем, как она работала ранее.
  3. Понимание интерфейсов: Учебные тесты помогают разработчикам понять, как правильно использовать интерфейсы внешнего кода. Они могут быть использованы для экспериментов с различными функциями и методами библиотеки, чтобы выяснить, как они работают.
  4. Безопасное удаление: После того, как учебные тесты выполнили свою задачу и разработчики поняли, как работает библиотека или внешний код, эти тесты могут быть удалены или сохранены для будущего использования.

Пример

Допустим, у нас есть внешняя библиотека для работы с датами, и мы хотим понять, как она работает. Мы можем написать несколько учебных тестов, чтобы исследовать ее поведение.

typescriptCopy codeimport { parse, format } from 'date-fns';

describe('Date-fns Library Learning Tests', () => {
    it('should correctly parse a date string', () => {
        const date = parse('2024-06-25', 'yyyy-MM-dd', new Date());
        expect(date.getFullYear()).toBe(2024);
        expect(date.getMonth()).toBe(5); // Месяцы в JavaScript начинаются с 0
        expect(date.getDate()).toBe(25);
    });

    it('should correctly format a date', () => {
        const date = new Date(2024, 5, 25); // Июнь, 25, 2024
        const formattedDate = format(date, 'yyyy-MM-dd');
        expect(formattedDate).toBe('2024-06-25');
    });
});