Как разработчики в 2021 году, мы должны писать модульные тесты, интеграционные тесты, однако мы часто застреваем в этом процессе. Сегодня я собираюсь показать, как Clojure сделал меня лучше в этом тестировании и анализе моего собственного кода.
REPL
Для начала, что такое REPL? Read-Eval-Print Loop — это терминал, в котором вы можете тестировать свои функции и видеть результаты в реальном времени. Это кажется чем-то простым, что мы имеем в Node, но я никогда не видел, что это может помочь мне в моем рабочем процессе, пока немного не повозился с Clojure, где REPL Driven Development и TDD идут рука об руку. Для примера мы имеем такую функцию:
(defn blocked-in-source-tax
"Retorna a quantia que foi bloqueada na fonta baseado nesse teste: abaixo de 1000, não bloqueia nada, depois de 1000, retorna 10% do valor.
Tabela verdade: 1000 > $ -> $ *.10 "
[money]
(let [max-money-value 1000
retained-percentage 0.10 ]
(cond
(<= money 0) "err"
(< money max-money-value) 0
(>= money max-money-value) (* money retained-percentage))))
Это простой код на clojure, но чтобы убедиться, что он соответствует бизнес-правилу, я использовал REPL. Я использовал эту функцию со значением 999, чтобы проверить, вернет ли она мне 0. Вместо того чтобы компилировать всю программу, чтобы проверить, все ли правильно, а затем писать тесты, я использовал REPL следующим образом:
(blocked-in-source-tax 400)
=> 0
(blocked-in-source-tax 2100)
=> 210.0
Если мы посмотрим на описание функции и результаты ее тестирования в REPl, мы можем сказать, что она работает так, как должна, теперь нам нужно только написать тесты. Поскольку в LISP и Clojure очень просто писать тесты, я написал для этой функции вот такие
(deftest blocked-in-source-tax-min-test
(testing "Given an input lower than 1000 it should return 0"
(is (= 0 (blocked-in-source-tax 999)))
(is (= 0 (blocked-in-source-tax 400)))
(is (= 0 (blocked-in-source-tax 1)))))
(deftest blocked-in-source-tax-max-test
(testing "Given an input bigger than 1000 it should return 10%"
(is (= 100.0 (blocked-in-source-tax 1000)))
(is (= 210.0 (blocked-in-source-tax 2100)))))
После этой возможности, которую я обнаружил в RELP, я занялся тем же самым в Node и обнаружил, что у нас есть вот это. ссылка для REPL в node
Следуя этому рабочему процессу, создание функций и коллекций функций может быть более легко проверено, а затем созданы тесты, если мы используем эту модель REPL с TDD.
Дополнительные рекомендации
Помимо того, что я немного читаю об этой замечательной практике, я хотел бы оставить еще одну ссылку, где она мне очень помогла
Демонстрация REPL
Этот сайт очень помогает мне, когда у меня возникают вопросы о clojure, и я намерен сделать больше материалов в PT-BR об этом языке.