Характеристика, более простой способ написания тестов
Тестировать тяжело. Тестировать чужой код еще сложнее. Но характеризационные тесты облегчают задачу!
Мы все знаем, что тестирование нашего кода важно, и иногда мы даже делаем это. Но когда вам приходится взаимодействовать с кодом, написанным кем-то другим в прошлом, но не задокументированным, вы, скорее всего, будете надеяться, что он выполняет свою работу, или перепишете его, если кажется, что это не так.
Однако для этой цели существует тип теста — характеристический тест! В отличие от традиционного тестирования, когда вы проверяете код на соответствие известной спецификации, тесты характеристик предполагают, что код правильный, и проверяют ваши изменения на соответствие старому поведению. То есть они просто обнаруживают изменения и предупреждают вас о них
Пример
Предположим, вы наткнулись на эту функцию (например, в приложении со списком продуктов):
К сожалению, это очень плохо написанный код, и нелегко догадаться, что делает функция, просто взглянув на него. В идеале мы хотели бы провести рефакторинг, но без тестирования на месте мы можем нарушить функциональность, даже не подозревая об этом.
Здесь мы можем использовать характеризационные тесты. К счастью, мы нашли правильно отформатированные входные данные, которые функция должна преобразовать:
Мы можем просто запустить на них функцию, сохранить выходные данные и создать тесты, чтобы быть уверенными в наших изменениях.
Выберите тестовую среду
С этой задачей справится практически любой тестовый фреймворк, поэтому обязательно используйте свой любимый. Поскольку код написан на 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 ;)
Спасибо за чтение и удачного кодирования!