Behaviour-Driven Development em Ruby BDD com RSpec Behaviour-Driven Development em Ruby Danilo Sato ThoughtWorks UK www.dtsato.com
Duas Perspectivas
TDD / Test::Unit
DSL para BDD Quanta sigla…
Test::Unit Classe estende Test::Unit::TestCase Métodos devem começar com “test” Assertions: assert(bool) assert_equal(expected, actual) assert_raise(args, blk) assert_nil(actual) …
Class Herança Nomes dos testes Assert
Describe/it Should + matchers Agrupa mais de 1 ‘assertion’ por teste Descreve comportamento!
http://rspec.info/documentation/test_unit.html
setup/teardown
Simple Custom Matcher
Custom Matcher
Custom Matcher
Reaproveitamento
Pendente…
Test-Driven Development 1. Escreva um teste que falha 2. Faça o teste passar 3. Refatore!
Feedback Confiança Erros são detectados rapidamente Ajudam a saber quando terminamos Pensar no design antes de implementar Evita generalização desnecessária Regressão automatizada
Testes Unitários Integridade Interna Rápidos Independentes Escrito por e para desenvolvedores Não indicam integridade externa Interna: qualidade dos componentes Externa: qualidade do ponto de vista do sistema (clientes e usuários)
Visão mais ampla
Histórias Como <papel/usuário> Eu gostaria de <funcionalidade> Pois <valor de negócio>
Cenários (exemplos) Dado <contexto> Quando <evento> Então <consequência>
SMART Specific Measurable Achievable Relevant Time-boxed * Specific - no generalizations (”It must be quick enough” vs. “It must load 90% of the time within 1 second”) Measurable - nothing that can’t be given a quantative measurement (”Users are happy” vs. “Users who express their level of happiness should give us at least 7/10″) Achievable - nothing that can’t be done (”I want my site emblazoned on the side of the moon”) Relevant - keep it related to the story at hand (”I want the three latest blog posts and a pony”) Timeboxed- work out when it needs to happen (”I want to be able to duplicate the works of Shakespeare using the random word generator”)
Testes de Aceitação Integridade Externa Mais lentos Mais difícil detectar causa de erros Escrito para clientes Não indicam integridade interna
No mundo real as coisas são mais complicadas Rails: Model / View / Controller / Helpers/ Plugins / Módulos / …
Testes Unitários
Testes de Aceitação
?
Integração
Mocks Permitem especificar interações entre objetos Trocam o objeto real por um dublê Verificam que as expectativas foram atendidas Substituem: Objetos “gordos” Serviços externos Bibliotecas (não quero testar se o gem funciona) …
Mocks
Criando um mock
Gravando Expectativas
Verificar Expectativas Automático! O teste vai falhar se: Método esperado não foi chamado Método foi chamado com argumentos diferentes Método foi chamado mais ou menos vezes Método não esperado foi chamado …
Stubs Mocks que não verificam expectativas Servem como dublês mas não se importam com o que aconteceu
RSpec on Rails Permite testar camadas isoladas: Model Controller View Helper Testes de aceitação com Histórias
Model
Controller
View
Muito mais… http://rspec.info
De volta ao BDD…
Normalmente…
BDD
BDD Feedback Outside-in
Resumindo Behaviour-Driven Development RSpec Um processo ponta-a-ponta de desenvolvimento Independente de ferramenta “Outside-in” RSpec Ferramental completo para BDD ponta-a-ponta Histórias -> Mocks -> Specs
Coisas legais (Ruby) Autotest Synthesis Webrat Cucumber Selenium
Behaviour-Driven Development em Ruby BDD com RSpec Behaviour-Driven Development em Ruby Danilo Sato ThoughtWorks UK www.dtsato.com