DEIXE O TESTE INFECTAR VOCÊ
AUTOMATIZANDO OS TESTES DE SUAS APLICA ÕES RUBYÇ
Hercules Lemke Merscher - @hlmerscher
IT'S ME, HERCULES.
DESENVOLVEDOR
CRIADOR DO “DOJO, ONDE?”http://dojoonde.herculesdev.com.br
Integrante do TUX-ES
POR QUE AUTOMATIZAR?
PORQUE SIM!!!
NÃO É RESPOTA
MOTIVOS
Erros recorrentes
MOTIVOS
O COMPUTADOR TESTA MUITO MAIS RÁPIDO
MOTIVOS
O COMPUTADOR TESTA TUDO SEM CANSAR
MOTIVOS
LEI DE MURPHY
#include<stdio.h>
int main(){
printf("Hello World\n");
return 0;
}
NO INÍCIO
TESTANDO
$ gcc hello.c -o hello
$ ./hello
Hello World
OK
MAIS UM POUCO
#include<stdio.h>
int soma(int a, int b){
return a + b;
}
int main(){
printf("%d\n", soma(2, 2) );
return 0;
}
TESTANDO
$ gcc soma.c -o soma
$ ./soma
4
CARA EXPERTO
#include<stdio.h>
int soma(int a, int b){
return a + b;
}
int main(){
printf("A soma de 2+2 = ");
printf("%d\n", soma(2, 2) );
return 0;
}
NOVAMENTE... COM ÉQUIO
$ gcc soma.c -o soma
$ ./soma
A soma de 2+2 = 4
AGORA VAMOS AO MUNDO REAL?
E SE,TESTASSEMOS PRIMEIRO?
É POSSÍVEL!
TEST DRIVEN DEVELOPMENT
CICLOS DO TDD
BABY STEPS
FRAMEWORKS DE TESTEPARA RUBY
Test Unithttp://test-unit.rubyforge.org/
RSpechttp://rspec.info/
Mini Testhttp://docs.seattlerb.org/minitest/
INSTALANDO
Test Unit$ gem install test-unit
RSpec$ gem install rspec
Mini Test$ gem install minitest
TEST UNIT
require "test/unit"
require "./calc"
class CalculadoraTest < Test::Unit::TestCase
def test_soma_2_mais_2
calc = Calculadora.new
assert_equal 4, calc.soma(2, 2)
end
end
RED
$ ruby calc_test.rb
Run options:
# Running tests:
E
Finished tests in 0.000854s, 1171.2208 tests/s, 0.0000 assertions/s.
1) Error:
test_soma_2_mais_2(CalculadoraTest):
NameError: uninitialized constant CalculadoraTest::Calculadora
calc_test.rb:5:in `test_soma_2_mais_2'
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
RED
class Calculadora
end
RED
$ ruby calc_test.rb
Run options:
# Running tests:
E
Finished tests in 0.000807s, 1238.5972 tests/s, 0.0000 assertions/s.
1) Error:
test_soma_2_mais_2(CalculadoraTest):
NoMethodError: undefined method `soma' for #<Calculadora:0x00000000ef0b00>
calc_test.rb:7:in `test_soma_2_mais_2'
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
RED
class Calculadora
def soma(a, b)
– end
–
end
RED
$ ruby calc_test.rb
Run options:
# Running tests:
F
Finished tests in 0.001068s, 936.3173 tests/s, 936.3173 assertions/s.
1) Failure:
test_soma_2_mais_2(CalculadoraTest) [calc_test.rb:7]:
<4> expected but was
<nil>.
1 tests, 1 assertions, 1 failures, 0 errors, 0 skips
RED
class Calculadora
def soma(a, b)
4– end
–
end
GREEN
$ ruby calc_test.rb
Run options:
# Running tests:
.
Finished tests in 0.000806s, 1240.3147 tests/s, 1240.3147 assertions/s.
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
LEMBRE-SE DO BABY STEPS
GREEN
require "test/unit"
require "./calc"
class CalculadoraTest < Test::Unit::TestCase
– # test_soma_2_mais_2
def test_soma_5_mais_3
calc = Calculadora.new
assert_equal 8, calc.soma(5, 3)
end
end
RED
$ ruby calc_test.rb
Run options:
# Running tests:
.F
Finished tests in 0.001050s, 1903.8843 tests/s, 1903.8843 assertions/s.
1) Failure:
test_soma_5_mais_3(CalculadoraTest) [calc_test.rb:12]:
<8> expected but was
<4>.
2 tests, 2 assertions, 1 failures, 0 errors, 0 skips
RED
class Calculadora
def soma(a, b)
a + b– end
–
end
GREEN
$ ruby calc_test.rb
Run options:
# Running tests:
..
Finished tests in 0.000776s, 2577.7647 tests/s, 2577.7647 assertions/s.
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips
RSPEC
require "./calc"
describe Calculadora do
it "deve somar 2 + 2" do
calc = Calculadora.new
calc.soma(2,2).should == 4
end
it "deve somar 5 + 3" do
calc = Calculadora.new
calc.soma(5,3).should == 8
end
end
RSPEC
$ rspec calc_spec.rb
FF
Failures:
1) Calculadora deve somar 2 + 2
Failure/Error: calc.soma(2,2).should == 4
expected: 4
got: 0 (using ==)
# ./calc_spec.rb:6:in `block (2 levels) in <top (required)>'
(...)
Finished in 0.00088 seconds
2 examples, 2 failures
Failed examples:
rspec ./calc_spec.rb:4 # Calculadora deve somar 2 + 2
rspec ./calc_spec.rb:9 # Calculadora deve somar 5 + 3
RSPEC
..
Finished in 0.0007 seconds
2 examples, 0 failures
TESTES DE REGRESSÃO
Que bicho é esse?
ACCEPTANCE TEST DRIVEN DEVELOPMENT
CAPYBARA NO RAILS
$ gem install capybara
…
require “capybara/rails”
CAPYBARA
$ rails generate integration_test calc
invoke mini_test
create test/integration/calc_test.rb
CAPYBARA
require "test_helper"
class CalcTest < ActionDispatch::IntegrationTest
test "deve somar 2 + 2" do
visit "/"
fill_in "primeiro", with: 2
fill_in "segundo", with: 2
click_on "somar"
assert page.has_content?("resultado = 4")
end
end
CAPYBARA
$ rake minitest
Run options:
# Running tests:
E
Fabulous tests in 0.056458s, 17.7121 tests/s, 0.0000 assertions/s.
1) Error:
test_deve_somar_2_+_2(CalcTest):
ActionController::RoutingError: No route matches [GET] "/"
...
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
CAPYBARA
root to: “calc#soma”
CAPYBARA
$ rake minitest
Run options:
# Running tests:
E
Fabulous tests in 0.278528s, 3.5903 tests/s, 0.0000 assertions/s.
1) Error:
test_deve_somar_2_+_2(CalcTest):
ActionView::MissingTemplate: Missing template calculadora/soma, application/soma with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder]}. Searched in:
...
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
CAPYBARA
$ touch app/views/calc/soma.html.erb
CAPYBARA
$ rake minitest
Run options:
# Running tests:
E
Fabulous tests in 0.278528s, 3.5903 tests/s, 0.0000 assertions/s.
1) Error:
test_deve_somar_2_+_2(CalcTest):
Capybara::ElementNotFound: Unable to find field "primeiro"
...
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
CAPYBARA
<%= form_tag("/calc/resultado",
method: “post”) do %>
<%= label_tag(:primeiro, "primeiro") %>
<%= text_field_tag(:primeiro) %>
<% end %>
CAPYBARA
$ rake minitest
Run options:
# Running tests:
E
Fabulous tests in 0.278528s, 3.5903 tests/s, 0.0000 assertions/s.
1) Error:
test_deve_somar_2_+_2(CalcTest):
Capybara::ElementNotFound: Unable to find field "segundo"
...
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
CAPYBARA
<%= form_tag("/calc/resultado",
method: “post”) do %>
<%= label_tag(:primeiro, "primeiro") %>
<%= text_field_tag(:primeiro) %>
<%= label_tag(:segundo, "segundo") %>
<%= text_field_tag(:segundo) %>
<%= submit_tag(“somar”) %>
<% end %>
CAPYBARA
$ rake minitest
Run options:
# Running tests:
E
Fabulous tests in 0.278528s, 3.5903 tests/s, 0.0000 assertions/s.
1) Error:
test_deve_somar_2_+_2(CalcTest):
ActionView::Template::Error: No route matches{:controller=>"calc", :action=>"resultado"}
...
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
CAPYBARA
root to: "calc#soma"–
post "calc/resultado"
CAPYBARA
$ rake minitest
Run options:
# Running tests:
E
Fabulous tests in 0.278528s, 3.5903 tests/s, 0.0000 assertions/s.
1) Error:
test_deve_somar_2_+_2(CalcTest):
ActionView::MissingTemplate: Missing template calc/resultado, application/resultado with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder]}.
...
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
CAPYBARA
CONTROLLER def resultado
primeiro = params[:primeiro].to_i
segundo = params[:segundo].to_i
@resultado = primeiro + segundo
end
VIEW$ touch app/views/calc/resultado.html.erb
<p> resultado = <%= @resultado %> </p>
CAPYBARA
$ ruby -Itest test/integration/calc_test.rb
Run options:
Run options:
# Running tests:
.
Finished tests in 0.779280s, 1.2832 tests/s, 1.2832 assertions/s.
...
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
LIVROS
LIVROS
DÚVIDAS?