Publicado por: hugolt | maio 1, 2009

BDD em Python, duas novas crianças

Há um tempo venho conversando sobre Behaviour-Driven Development (BDD) com o Rodrigo e acabaram surgindo varias idéias.

Não conheço nenhuma ferramenta famosa para BDD em Python, sei existe o Behaviour, pyspec (por causa do Google) e talvez outras, mas elas ilustram de maneira diferente o que eu queria.

O Cucumber é lindo! O RSpec nem tanto, mas ilustram bem a necessidade e a idéia real de BDD.
São ferramentas escritas em Ruby e pra Ruby, e Ruby provê bastante facilidade pra escrever DSLs, e ficou bem legal o trabalho deles com as ferramentas de BDD.
Porém, em Python não há tanta liberdade como Ruby, mas mesmo assim é possível fazer boas DSLs, fluent interfaces e etc.

Decidi então criar as minhas próprias ferramentas pra Python.

A primeira idéia era criar uma DSLs de “should”, pra desfocar totalmente da idéia de assertions. Tentei fazer uma maneira de tornar transparente um código python que usa-se essa DSL, mas não ficou tão transparente.
Em Python não há uma classe base pra todos os objetos, então não dá pra simplesmente adicionar métodos em uma tal classe base.
Acabou que por fim, usei o truque de importar a classe DSLObject que eu criei como _ [underscore], pra tentar tornar o mais transparente possível, ficando como no exemplo que segue (código Python):
_(VALOR).should_be.equal_to(OUTRO_VALOR)
Que é bem próxomo de VALOR should be equal to OUTRO_VALOR, levando em conta as limitações da linguagem.

Esse projeto chamei de should-dsl e hospedei no Google Code:
http://code.google.com/p/should-dsl/

A outra idéia era a de criar uma ferramenta de criação de Story (Histórias) com BDD, mas a nível de código.

Para facilitar o entendimento, vou dar um exemplo de como é uma história (story):

As a <role>
I want to <action>
So that <benefit>

Scenario: <title>
Given <pre-conditions>
When <actions>
Then <outcome>

Essa seria uma template pra uma história, que poderia ser do tipo:

As a lazy mathematician
I want to use a calculator
So that I rest my mind

Scenario 1: Using my calculator to sum
Given I have a calculator
When I enter with 1 + 1 and press =
Then I see 2 on the display

Esse seria um exemplo de uso de histórias pra descrever uma especificação de aceitação de uma calculadora.

O Cucumber faz isso, porém você tem que escrever um texto livre (seguindo a idéia de como deve ser uma história em BDD) e depois criar códigos Ruby em uma certa convenção de diretórias e nome de arquivos contendo código para os passos (given, when, then) que existirem. Eu pensei em fazer primeiro uma abstração dessas a nível de código, sem ter texto livre e fiz.

O código está também no Google Code, em:
http://code.google.com/p/pyhistorian/
Um exemplo de uso, um completo código Python está na página inicial do projeto, vale a pena conferir.

Nas páginas dos projetos há explicações melhores e exemplos, é software livre, fique a vontade pra modificar e sugerir qualquer coisa.

Mais idéias surgiram e breve estarão implementadas!

Aguardem.


Responses

  1. caralho não entendi nada… mas aqui… eu tenho que ficar ai em campos semana que vem…. tomara que você leia aqui… qq coisa me fala no orkut lá se eu posso ou não… flw

  2. acho que vc deveria atualizar seu pots….


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Categorias

%d blogueiros gostam disto: