O que é REPL Driven Development?

Continuando nossa série de Clojure na visão de um dev JS, vamos falar hoje sobre REPL Driven Development

REPL e TDD

Como desenvolvedores em 2021, devemos escrever testes de unidade, de integração, porém muitas vezes empacamos nesse processo, hoje vou mostrar como o Clojure tem me deixado melhor nisso de testar e analisar o meu próprio código.

REPL

Para começar o que é o REPL ? Read-Eval-Print Loop é um terminal onde você pode testar as suas funções e ver seus resultados em tempo real. Isso parece algo simples e que temos no Node, mas nunca tinha visto que isso poderia me ajudar no meu workflow até mexer um pouco com Clojure, onde o REPL Driven Development e o TDD andam de mãos dadas. Para exemplificar temos essa função:

(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))))

É um código simples em clojure mas para ter certeza que estava condizente com a regra de negocio eu usei o REPL, usei essa função com o valor de 999 para ver se me retornava 0, ao invés de compilar o programa inteiro para ver se estava certo e dai escrever os testes, usei o REPL da seguinte forma:

(blocked-in-source-tax 400)
=> 0
(blocked-in-source-tax 2100)
=> 210.0

Se olharmos a descrição da função e seus resultados testados no REPl podemos dizer que está funcionando como deveria, agora falta escrever os testes. Como tudo em LISP e Clojure, é bem simples escrever testes, os que escrevi para essa função são esses

(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)))))

Depois dessa facilidade que eu descobri do RELP, fui atrás do mesmo em Node e descobri que temos isso. link para REPL no node Seguir esse workflow, de criar funções e coleções de funções podem ser mais facilmente validades e depois criado testes se usássemos esse modelo de REPL com TDD.

Mais referencias

Além de ler um pouco sobre essa maravilhosa pratica, gostaria de deixar mais um link onde me ajudou muito demostração de REPL (em inglês) Esse site me ajuda bastante quando tenho dúvidas do clojure e pretendo fazer mais conteúdos em Pt-BR sobre a linguagem.

Contato

Se quiser discutir sobre qualquer assunto ou viu algum erro, não hesite em me marcar ou chamar no Twitter: @que_cara_legal
Estou sempre tentando trazer o que tenho estudado, as vezes traduzindo algums tópicos divertidos que me chamam atenção.