Should-DSL: python should-like expectations
Autor: Douglas Camata | Publicado: 2010-07-16T11:47:00-07:00

Bom pessoal, depois do muito tempo parado já está na hora de fazer um post né? E para voltar bem, vou falar um pouco sobre a Should-DSL. Ela é um projeto iniciado pelos amigos e colegas de trabalho, Hugo Lopes Tavares e Rodrigo Manhães.Mas o que é essa porcaria?Porcaria  porra nenhuma nada! Foi uma idéia genial. A Should-DSL é uma DSL (Domain Specific Language), como o próprio nome diz, para Python. Ela foi criada para tornar as expectations dos testes, sejam eles unitários, de integração, etc, mais bonitinhas intuitivas e completas. Vejamos um exemplo de teste simples feito com python e unittest.[python]from unittest import *from calculadora import calculadora    class TestCalculadora(unittest.TestCase):        def test_soma(self):            self.calculadora = calculadora()            self.assertEquals(calculadora.soma(1,1), 2)[/python]Perceba que o método que realiza o teste propriamente dito, na última linha é uma merda feio pra diabo meio dark. Vejamos como ficaria isso usando a Should-DSL.[python]from unittest import *from should_dsl import *from calculadora import calculadora    class TestCalculadora(unittest.TestCase):        def test_soma(self):            self.calculadora = calculadora()            calculadora.soma(1,1) |should| equal_to(2)[/python]O que achou? O método de teste não está muito mais legível e expressivo? Chamamos a função "equal_to", utilizada no código,  de matcher. A Shoud-DSL já possui vários matchers embutidos, além de suportar a criação de custom matchers. E esses custom matchers podem ser definidos como simples funções ou como classes, em casos de matchers mais complexos.Veja um exemplo de teste de validação de um objeto usando uma coisa macabra muito interessante. Suponha que você tenha uma classe Number e você quer se certificar de que um objeto Number qualquer represente um número primo. Veja o código:[python]Number(57) |should| be_prime[/python]Simples não é? Isso é o que chamamos de um predicate matcher. Quando esse código é executado a DSL procura por um método chamado "prime" dentro do objeto Number e automaticamente o chama, esperando um resultado verdadeiro. E como ficaria esse código sem a Should-DSL?[python]assertTrue(Number(57).prime)[/python]Um matcher bem interessante também é o "change". Ele verifica se um devido método causou uma mudança numa certa variável. E você ainda pode especificar em qual quantidade essa variável tem que ser modificada. Veja um exemplo:[python]class Box(object):    def __init__(self):        self.items = []    def item_count(self):        return len(self.items)    def add_items(self, *items):        for item in items:            self.items.append(item)[/python]Agora o teste:[python]caixa = Box()(caixa.add_items, 1, 2, 3) |should| change(caixa.item_count).by(3)[/python]Como você faria isso sem Should-DSL hein? Não gosto nem de tentar imaginar... Está interessado em instalar a Should-DSL? É tão simples como utilizá-la: sudo pip install should-dslEnfim, essa foi um pequena demonstração do poder sobrenatural da legibilidade, expressividade e facilidade que a Should-DSL pode trazer aos seus testes. Se você está interessado em conhecer mais sobre essa incrível ferramenta, desenvolvida por Hugo Lopes Tavares e Rodrigo Manhães, acesse o repositório do GitHub da Should-DSL. Lá você encontrará um bom README ensinando como usar os mais diversos matchers da ferramentas e também poderá ver e baixar o código fonte dela para modificiar a seu próprio gosto ou entender como a mesma foi desenvolvida.Use e abuse. Qualquer dúvida é só comentar que farei o possível para ajudar. Até a próxima!