Как выполнить модульное тестирование функций побочных эффектов в Clojure?
Этот вопрос не о конкретных библиотеках (хотя некоторые из них будут использованы в конце), а о том, как структурировать код приложения, чтобы сделать возможным модульное тестирование функций побочных эффектов. Если мы должны сделать это вообще?
Очевидно, что тестирование чистых функций, свободных от побочных эффектов, понятно и просто, вы пропускаете ввод и утверждаете вывод.
Есть 2 (очень грубо) типа тестирования, юнит и интеграция. Давайте сосредоточимся на модульном тестировании здесь.
Итак, если у вас есть функция, которая читает из файла или записывает в файлы (используя slurp
/spit
, например), или работа с базой данных, кольцевым приложением или каналами core.async, как проводить модульное тестирование таких вещей в Clojure? Участвуют ли издевательства, если да, как они должны быть определены? Здесь binding
, with-{redefs, redefs-fn, local-vars}
участвует? Должен ли я определить defprotocol
для того, чтобы усовершенствовать (иначе макет?) реализацию во время модульного тестирования?
Одна из ценностей тестирования (главная ценность?) Заключается в том, чтобы навязать лучший дизайн кода приложения, поэтому, возможно, тестирование в Clojure является особенным в том смысле, что вы вынуждены структурировать код приложения определенным образом, чтобы сделать Возможны ли функции юнит-тестирования в Clojure?
Или я полностью упускаю суть?
PS1: Мне комфортно работать и разрабатывать с приложениями Clojure для малого / среднего размера (наверняка еще предстоит), хотя тестирование мне до сих пор не совсем понятно.
PS2: Еще одна важная тема - интеграционное тестирование в Clojure, но оно заслуживает отдельного вопроса SO.
2 ответа
В общем, вы тестируете код с побочными эффектами, реализуя артефакты настройки и демонтажа для ваших тестов. Они создают базовое / начальное состояние и помогают оценить результаты.
Я настоятельно рекомендую вам избегать with-redefs
и друзья, если это вообще возможно. Мы используем протоколы для большинства всех наших взаимодействий с внешними сервисами и везде внедряем зависимости, поэтому тестирование очень просто. Конечно, мы все еще пытаемся сделать функции максимально чистыми и тщательно управлять эффектами, но в целом мы были довольны протоколами, когда это было необходимо.