Как мы тестируем тесты

Практика курса по тестированию сильно отличается от практик других курсов. Обычно вам нужно написать реализацию какой-то функции под существующий набор тестов. Здесь же всё наоборот. Вам нужно написать тесты для готового кода.

Существует ровно один хороший способ, проверить, что вы написали тесты правильно – вызывать эти тесты с разными реализациями функции. Если реализация правильная, то тесты должны успешно пройти, если нет, то тесты должны свалиться с ошибкой. Такой подход позволяет проверять не реализацию тестов, а их эффективность.

Наша проверочная система использует специальную библиотеку suppressor, которая может понять, успешно ли завершилось выполнение тестов. У неё есть два режима работы:

  1. Проверяет, что тесты выполнились успешно. В такой проверке в ваши тесты подставляется правильная реализация функции, которая тестируется (без ошибок).

    FUNCTION_VERSION=right1 suppressor pass 'babel-node ./tests/collection.test.js'
    

    Аргумент pass говорит о том, что suppressor ожидает успешного завершения тестов. Следующий аргумент – команда, которую надо запустить. Если тесты вместо успеха завершились с ошибкой, библиотека выведет следующее сообщение:

    Expected tests to pass, but error occurred. See output above.
    
  2. Проверяет, что тесты упали с ошибкой. В этом запуске тесты выполняются с неправильной реализацией тестируемой функции. Правильно написанные тесты должны найти ошибку и сигнализировать об этом:

    FUNCTION_VERSION=fail1 suppressor fail 'babel-node ./tests/collection.test.js'
    

    Аргумент fail говорит о том, что suppressor ожидает, что выполняемая команда завершится с ошибкой. Тогда тесты написаны верно. Если тесты вместо ошибки завершились успешно, библиотека выведет следующее сообщение:

    Expected tests to fail, but they passed. See output above. 
    

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

// functions.js

const functions = {
  right1: () => {
    return 'Тесты должны завершиться успехом';
  },
  fail1: () => {
    throw new Error('Тесты должны выявить ошибку');
  },
};

export default (name = process.env.FUNCTION_VERSION) => functions[name];

Дополнительные материалы

  1. Переменные окружения
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →