3. Desenvolvimento orientado
por testes
Em linhas gerais: Testar antes. Codificar depois.
“Como eu gostaria que minha aplicação se
comportasse?”
Origem: eXtremme Programming
5. Vantagens
1. Testando primeiro, você sabe exatamente o que seu
sofware precisa fazer.
2. Foco: Escrever o código mais simples que resolve o
problema.
3. Saber quando parar: Teste define quando se atinge o
“suficiente”.
4. Código mais limpo e organizado.
6. Vantagens
5. Identificar o mais cedo possível problemas de
regressão.
6. Segurança e refactoring sem medo.
7. Satisfação!
8. Manutenabilidade?
Quão fácil é modificar o software.
Testes são fundamentais neste quesito - considerar o
futuro.
Codigo sem testes = código legado.
Funciona? Sorte!
Além de tudo: seu código, sua carreira!
11. BDD - Behaviour-Driven
Development
TDD + Novo Vocabulário + Novo ponto de vista
Ferramenta de design.
Nova abordagem: Foco em especificações de
comportamento e não nos testes de verificação.
Testes são o meio. Ou seja, especificar comportamento
utilizando testes.
Escrever software que importa!
Documentação executável
Clareza do código - comportamento
12. Testes em Ruby
Diversos frameworks.
Melhor x pior: Apenas escolha o que melhor lhe convir!
test/unit
miniunit
Shoulda
Micronaut
test-spec
RSpec
Cucumber
13. RSpec
DSL (Domain-Specific Language) para descrever
comportamento de objetos.
Expressividade
Legibilidade
Similar a estar falando com um cliente.
14. BDD - Novo vocabulário
test/unit rspec
should /
Asserções Expectativas
should_not
Método de Exemplo de
it()
teste código
Caso de Grupo de
describe()
teste exemplos
15. Terminologias
test/unit rspec
class SomeClassTest < describe SomeClass
Test::Unit::TestCase
it "should do something
def test_something
descriptive"
def setup before(:each)
def teardown after(:each)
assert_equal 4, array.length array.length.should == 4
16. Grupo de exemplos
(Example group)
describe Client do ... end
describe “A bank transaction” do ... end
describe Document, “being shared” do ... end
17. Exemplos de código (code
examples)
it “should require a valid username” do ... end
it “should not charge a user when he has sufficient
credits for the payment” do ... end
it “should not retrieve expired documents” do ... end
27. Live coding
RSpec
http://github.com/jonysk/rsrails_rspec
28. Cucumber
Ferramenta para descrever comportamento a partir da
camada superior
No Rails: das views para os models. Substituem os
Testes de Integração
Foco na interface e depois camadas inferiores
(Outside-in)
O que o usuário espera? - Colaboração entre
stakeholders e desenvolvedores para especificar.
Testes de aceitação
29. E por que não começar nos
models? (Inside-out)
Construir o que você precisa ao invés do que você
acha que precisa.
Descoberta gradual do que precisa ser implementado
em baixo nível.
30. Relação Cucumber e RSpec
Cucumber: descrever o comportamento da aplicação.
“Make sure you’re writing the right code”
RSpec: descrever o comportamento dos objetos
“Make sure you’re writing the code right”
Red-green-refactor permanece:
Inicia no ciclo externo (Cucumber)
Termina no ciclo interno (RSpec)
31. Instalação
RSpec
gem install rspec rspec-rails
Para utilizar com Rails:
Dentro do projeto: script/generate rspec
Cucumber + webrat
gem install cucumber webrat
Para utilizar com Rails:
Dentro do projeto: script/generate cucumber
36. Cucumber + webrat
Simulação de um browser
Comandos de integração intuitivos:
fill_in “campo”, :with => “valor”
visit “/pagina”
check “campo”
click_button “campo”
37. Matchers principais
should contain(‘text’)
should have_selector(‘#menu ul li.selected”, :content
=> “Dashboard”)
CSS3
should have_xpath(‘//node[@prop=”value”]’)