Testes Automatizados em Ruby on Rails

Preview:

DESCRIPTION

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

Citation preview

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: a@a.a

  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