Olá, parabéns aos idealizadores do projeto. Tenho visto muitas discussões produtivas e respeistosas (coisa que não vejo em outras comunidades). Sou professor de automação de testes da PUC Minas e estou explorando uma nova abordagem em BDD que chamo de 'narrativa executável'. Uso está abordagem para ensinar automação de testes aos meus alunos e estou buscando opiniões sinceras de especialistas em Python para refinar e melhorar a abordagem de ensino e o framework Python desenvolvido. O framework que uso nas minhas aulas se chama Guará, é open source e tem contribuição da comunidade Python. Ele usa o padrão de projetos Page Transactions onde o foco da automação sai da UI e se volta para a jornada do usuário.
O cenário de testes implementado no padrão ficaria algo como (simplificado para facilitar a leitura):
app.given(TheUserIsLoggedIn, with_name='john.doe').when(TheUserBuysAProduct, with_name='cellphone').then(TheSystemShouldReturn, 'done')Note que o cenário é todo escrito em Python puro, mas mantém a narrativa de negócio. Como uso Python, posso usar todas as tecnicas de programação OO como herança, sobrecarga de métodos, sobreescrita de método, etc.. Portanto, consigo escrever o código em português (e qualquer outra língua) usando herança
app.dado(UmUsuárioLogado, com_nome='john.doe').quando(OUsuarioCompraUmProduto, com_nome='cellphone').entao(OSistemaDeveRetornar, 'done')`
Posso usar linguagem ubíqua reforçando a prática de DDD (Domain-Driven Design) em um projeto.
eduapp.sabido_que(ExistaUmAluno, de_nome='Fulano de Tal').uma_vez_que(OAlunoSeInscreveNaMateria, de_nome='Matemática').logo(EleDeveEstar, 'Matriculado')Posso criar novas asserções que alimentam o método `then` (e suas variações). Enfim, o testador é livre para estender o framework como ele queira.
Porém, dadas as possibilidades do framework, tenho explorado uma abordagem diferente do
BDD que não passa pelos testes. Note que eu posso usar o cenário como parte do meu código fonte usando uma metalinguagem que estabelece um contrato onde
given é a pré-condição,
when a execução e
then é a pós-condição. Considere a função abaixo como parte de uma implementação de uma CLI.
def inscrever_aluno_na_materia(aluno, materia):
eduapp.sabido_que(ExistaUmAluno, de_nome=aluno) \
.uma_vez_que(OAlunoSeInscreveNaMateria, de_nome=materia) \
.logo(EleDeveEstar, 'Matriculado')
chamando a função por uma CLI no terminal ficaria como:
python main.py inscrever-aluno-na-materia --aluno 'Fulano de Tal' --materia MatemáticaGostaria da opnião da comunidade sobre essa nova abordagem BDD e sobre o framework.
Notas:
- Eu pesquisei outras ferramentas BDD onde se escreve o código puro, como JGiven (Java), mas ele ainda é focado no teste em si.
- A camada extra não elimina a necessidade de services, repositories, models... mas deixa o código fonte mais orientado à intenção do negócio. Ele também vira a propria documentação e fonte de verdade.
Acham que a abordagem faz sentido?
A intenção do código mais clara com a camada extra?
Deixem comentários livres, por favor
Muito obrigado!
Vou deixar alguns links extras caso tenham interesse no meu trabalho. Abraços!
Pessoais
Sobre o projeto