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

Testes Automatizados em Ruby on Rails

Embed Size (px)

DESCRIPTION

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

Citation preview

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