Характеристика, более простой способ написания тестов

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

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

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

Пример

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

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

Здесь мы можем использовать характеризационные тесты. К счастью, мы нашли правильно отформатированные входные данные, которые функция должна преобразовать:

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

Выберите тестовую среду

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

Примечание: вы даже можете использовать wish (не Развлечение с покупками), которое, вероятно, проще всего настроить и даже включает опцию для характеристических тестов.

Получите результаты

Запуск кода один раз позволяет нам сопоставить наши входные данные с выходными данными:

[["apple", 700, "g"], ["pear", "750", "g"]]: {"apple": 700, "pear": 750}
[["apple", "1", "pound"], ["pear", 2, "kg"]]: {"apple": 454, "pear": 2000}
[["apple", "1", "kg"], ["orange", 2200, "g"], ["apple", 1, "pound"], ["pear", "780", "g"]]: {"apple": 1454, "orange": 2200, "pear": 780}

Затем мы можем написать наши тесты:

Рефакторинг

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

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

Спасибо!

Все еще читаете? Вы, должно быть, очень хорошо обращаете внимание!

Я хотел бы услышать ваши отзывы о других моих проектах, поэтому не стесняйтесь заглядывать на мой GitHub ;)

Спасибо за чтение и удачного кодирования!