testes automatizados em ruby on rails

35
Introdução a Testes Introdução a Testes Automatizados em Ruby On Automatizados em Ruby On Rails Rails Thiago Cifani Ayres Escola Thiago Cifani Ayres Escola

Upload: thiago-cifani

Post on 13-Jan-2015

3.134 views

Category:

Technology


5 download

DESCRIPTION

Apresentação da defesa de monografia de Testes automatizados em Ruby on Rails

TRANSCRIPT

Page 1: Testes Automatizados em Ruby on Rails

Introdução a Testes Automatizados Introdução a Testes Automatizados em Ruby On Railsem Ruby On Rails

Thiago Cifani Ayres EscolaThiago Cifani Ayres Escola

Page 2: Testes Automatizados em Ruby on Rails

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

Page 3: 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

Page 4: Testes Automatizados em Ruby on Rails

Tecnologias UtilizadasTecnologias Utilizadas

Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails

Page 5: 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

Page 6: Testes Automatizados em Ruby on Rails

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

Page 7: Testes Automatizados em Ruby on Rails

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 )

Page 8: Testes Automatizados em Ruby on Rails

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

Page 9: Testes Automatizados em Ruby on Rails

Testes AutomatizadosTestes Automatizados

Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails

Page 10: 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

Page 11: Testes Automatizados em Ruby on Rails

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

Page 12: Testes Automatizados em Ruby on Rails

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 ]

Page 13: Testes Automatizados em Ruby on Rails

TDDTDD

Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails

Page 14: 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

Page 15: Testes Automatizados em Ruby on Rails

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)

Page 16: Testes Automatizados em Ruby on Rails

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

Page 17: 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

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

Page 18: Testes Automatizados em Ruby on Rails

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!

Page 19: Testes Automatizados em Ruby on Rails

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

Page 20: Testes Automatizados em Ruby on Rails

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

Page 21: Testes Automatizados em Ruby on Rails

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

Page 22: 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

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!

Page 23: Testes Automatizados em Ruby on Rails

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

Page 24: Testes Automatizados em Ruby on Rails

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.

Page 25: Testes Automatizados em Ruby on Rails

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.

Page 26: Testes Automatizados em Ruby on Rails

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

Page 27: Testes Automatizados em Ruby on Rails

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.

Page 28: Testes Automatizados em Ruby on Rails

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

Page 29: Testes Automatizados em Ruby on Rails

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.

Page 30: Testes Automatizados em Ruby on Rails

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.

Page 31: Testes Automatizados em Ruby on Rails

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

Page 32: Testes Automatizados em Ruby on Rails

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

Page 33: Testes Automatizados em Ruby on Rails

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

Page 34: Testes Automatizados em Ruby on Rails

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.

Page 35: Testes Automatizados em Ruby on Rails

FIMFIM

Introdução a Testes Automatizados em Ruby On RailsIntrodução a Testes Automatizados em Ruby On Rails