Introdução a Testes Automatizados Introdução a Testes Automatizados em Ruby On Railsem Ruby On Rails
Thiago Cifani Ayres EscolaThiago Cifani Ayres Escola
TópicosTópicos HistóricoHistórico
ManifestoManifesto Ágil Ágil Tecnologias UtilizadasTecnologias Utilizadas
RubyRuby RailsRails
Testes AutomatizadosRuby On RailsTDDBDD
RspecCucumber
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Manifesto ÁgilManifesto Ágil
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Fonte: http://scrumex.com.br/blog/?p=28
Tecnologias UtilizadasTecnologias Utilizadas
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Criada em 1995 por Yukihiro Matsumoto (Matz)
Linguagem de Script
Linguagem com Tipagem Dinâmica
Sintaxe Enxuta
Tudo é objeto
Baseada em ADA, LISP, SmallTalk , Python, Perl
Versão Atual 1.9.2
RVM ( Ruby Virtual Mananger )
RubyGems
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
# A classe Saudação# A classe Saudaçãoclass Saudacaoclass Saudacao def initialize(name)def initialize(name) @name = name.capitalize@name = name.capitalize endend def saudadef sauda puts "Olá #{@name}!"puts "Olá #{@name}!" endendendend # Criar um novo objeto# Criar um novo objetoola = Saudacao.new("mundo")ola = Saudacao.new("mundo") # Saída: "Olá Mundo!"# Saída: "Olá Mundo!"ola.saudaola.sauda
3.times { print “thiago” }3.times { print “thiago” }
#saída : thiago thiago thiago#saída : thiago thiago thiago
[‘um’,‘dois’,‘tres’].each {|num| puts num.capitalize }
#saida Um Dois Tres
“thiago”.reverse
#saída: ogaiht
1.upto(5) { |x| puts x }
#saída: 1 2 3 4 5
# Declaração de Classes # Simplicidade
# Legibilidade
# Agilidade
# Sintaxe Enxuta
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Criado em 2005 por David Hanemeier Hannson (DHH)
BaseCamp
Facilitar o desenvolvimento Web
CoC (Convention over Configuration)
DRY ( Don’t Repeat Yourself)
KISS ( Keep it Simple Stupid )
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
<h1>Users#show</h1><p>User: <%= @user.name %></p><p>Email: <%= @user.email if @user.email %></p>
class UsersController < ApplicationController def show @user = User.find(params[:id])
end
end
# Model
# Controller
# View
class User < ActiveRecord::Baseclass User < ActiveRecord::Base
has_many :teamshas_many :teams
endend
user.rb
users_controller.rb
show.html.erb
Testes AutomatizadosTestes Automatizados
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Testes em RailsTestes em Rails• Teste Unitário
test “produto.nome deve ser igual a camisa” do
@produto = produto.new
assert_equal “camisa”, @produto.nome
end
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
should "get new" do get :new assert_response :success end
• Teste de Controlador
Testes em RailsTestes em Rails• Fixtures
redcross:
id: 1
name: Red Cross
name_slug: red-cross
contact: lalala
city: Springfield
city_slug: springfield
country: USA
needs: Lots of rice
password: 1
email: [email protected]
announcer: announcer
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Fonte: https://github.com/thoughtworks/letshelp.it/blob/master/test/fixtures/organizations.yml
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Test Driven Development é uma prática de desenvolvimento que envolve escrever teste antes de escrever código a ser testado. Começa escrevendo um pequeno teste para o código que ainda não existe. [ CHE, 2010 ]
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Escreva um teste que falhe
require 'spec_helper'
describe Team do end
team_spec.rb
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Saída do Teste
/home/thiagocifani/.rvm/gems/ruby-1.9.2-p180/gems/rspec-core-2.5.2/lib/rspec/core/backward_compatibility.rb:20:in `const_missing': uninitialized constant Team (NameError)
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Faça o mínimo para fazê-lo passar
class Team < ActiveRecord::Baseend
# Saída# Saída
Finished in 0 seconds0 examples, 0 failures
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Escreva um teste que falhe
describe Team do it "should not save a Team with blank name" do @team = Team.new(:name => "") @team.should_not be_valid end end
team_spec.rb
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Saída do Teste
F
Failures:
1) Team should not save a Team with blank name Failure/Error: @team.should_not be_valid expected valid? to return false, got true # ./spec/models/team_spec.rb:7:in `block (2 levels) in <top (required)>'
Finished in 0.04004 seconds1 example, 1 failurerake aborted!
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Faça o mínimo para fazê-lo passar
class Team < ActiveRecord::Base validates_presence_of :name
end
.
Finished in 0.04472 seconds1 example, 0 failures
# Saída# Saída
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Refatore se possível
describe Team do it "should not save a Team with blank name" do @team = Team.new(:name => "") @team.should_not be_valid end end
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Refatore se possível
describe Team do it { should validates_presence_of :name}
end
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Escreva um teste que falhe
describe Team do it { should validates_presence_of :name}
it { should validates_uniqueness_of :name}
end
.F
Failures:
1) Team Failure/Error: it {should validate_uniqueness_of :name} Can't find first Team # ./spec/models/team_spec.rb:10:in `block (2 levels) in <top (required)>'
Finished in 0.13438 seconds2 examples, 1 failurerake aborted!
TDDTDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Faça o mínimo para fazê-lo passar
class Team < ActiveRecord::Base validates_presence_of :name
validates_uniqueness_of :name
end
..
Finished in 0.04472 seconds2 example, 0 failures
# Saída# Saída
describe Team do before do @team = Factory(:team) end
it { should validates_presence_of :name}
it { should validates_uniqueness_of :name}
end
BDDBDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
BDD (Behavior Driven Development) baseia-se na descrição do comportamento da aplicação baseado na opinião dos clientes.
BDDBDD
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Os três princípios são: O suficiente é suficiente: Designs gigantescos, análises intermináveis. Deve-se fazer o menos possível para começar e, qualquer coisa além disso, é um desperdício. Isso também nos ajuda a pensar em sempre automatizar as tarefas repetitivas como deploy e build;
Entregar algo de valor: Se você está fazendo algo que não tem valor ou não está aumentando sua habilidade de entregar valor, pare e faça outra coisa;
Tudo é comportamento: Independente se é em nível de codificação, aplicação ou algo além, deve-se sempre usar o mesmo pensamento e linguística de construção para descrever comportamento em qualquer nível de granularidade.
RspecRspec
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
O RSpec é uma DSL (Domain-Specific Language) para especificar o comportamento
desejado do código Ruby
RspecRspec
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Subject Code: O código cujo comportamento está sendo especificando com o RSpec;
• Expectation: Uma expressão de como o subject code deve se comportar;
• Code Example: Um exemplo executável de como o subject code pode ser usado e como
o seu comportamento esperado (expresso com expectations) em um determinado contexto;
• Example group : Grupo de code examples.
RspecRspec
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
require 'spec_helper'
describe Team do
before(:each) do
@team = Factory(:team)
end
it {should validate_presence_of :name}
it {should validate_uniqueness_of :name}
it {should belong_to :user }
end
end
end
CucumberCucumber
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
O Cucumber é um framework de alto nível para testes automatizados. Mais utilizado para testes de aceitação, ele permite descrever uma estória e implementar o código de acordo com essa estória.
CucumberCucumber
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
• Feature: Define a funcionalidade do sistema.
• Scenario: Define um possível cenário da aplicação.
• Given: Usado para determinar o estado da aplicação no momento que o teste é
executado;
• When: Usado para especificar as ações a serem executadas;
• Then: Usado para especificar o resultado esperado.
• And: Usa-se como adendo, podendo unir vários Given/When/Then.
FeatureFeature
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Feature: home
As a user
I want to see the teams link
to go to the team list page
Scenario: Go to the team list page
Given I visit the home page
When I click on Teams link
Then should go to the team list page
rake cucumber
StepsSteps
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Given /^I visit the home page$/ do
peding…
end
When /^I click on Teams link$/ do
pending…
end
Then /^should go to the team list page$/ do
pending…
end
StepsSteps
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Given /^I visit the home page$/ do
visit root_path
end
When /^I click on Teams link$/ do
click_link "Teams List"
end
Then /^should go to the team list page$/ do
visit teams_path
end
ConclusãoConclusão
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails
Utilizando testes automatizados podemos garantir que o software que estamos
escrevendo realmente atende a necessidade estabelecida por nosso cliente. Quando
escrevemos o código e terminamos, realmente terminamos.
FIMFIM
Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails