BDD +              =

By: Vitor Mattos

BDD +              =

"Os comportamentos de uma história são simplesmente seus critérios de aceitação

Chris Matts & Dan North

Fotografem, comentem, twittem!

@VitorMattosRJ

Quem sou eu?

Realizador de sonhos desde 2003
Amante de opensource
Palestrante
PHP Zend Certified Engineer ( ZEND024235 )
PHPRio ( https://telegram.me/phprio )

CTO Lyseon Tech
Redes sociais: ( VitorMattos ou VitorMattosRJ )

A Lyseon Tech é uma cooperativa de trabalho com modelo de gestão democrática, segura e eficiente composta por profissionais de T.I. altamente qualificados e experientes no mercado. Prezamos por apresentar vantagens, tanto para o cooperado como para as empresas parceiras.

O culpado...

Testes

Porque fazê-los se já posso começar desenvolvendo?

“Se alguma coisa tem a mais remota chance de dar errado, certamente dará.”

Edward A. Murphy

Lei de Murphy

"É de conhecimento geral entre os analistas de softwares que nunca se elimina o último bug de um programa. Os bugs são aceitos como uma triste realidade. Esperamos eliminá-los todos, um por um, mas nunca conseguiremos nos livrar deles."

Escrevendo testes

Tom DeMarco

"Depois eu escrevo o plano de testes..."

"Vamos deixar os testes para a próxima fase..."

"Na minha máquina funcionou..."

"Temos que entregar o produto na semana que vem..."

Teste unitário

O que é isso?

Um exemplo de TDD com PHPUnit

<?php

use PHPUnit\Framework\TestCase;

classs CalculatorTest extends TestCase
{
	private $calculator;
    protected function setUp()
    {
    	require_once 'calculator.php';
        $this->calculator = new Calculator
    }
}

Test Driven Development

Test Driven Development

Como testar se não existe código escrito?

Test Driven Development

Behavior

© 2003, Dan North

Tá bom…. BDD pode me ajudar

mas...

O que é BDD?

Definição de BDD por Dan North

“BDD is a second-generation, outside–in, pull-based, multiple-stakeholder, multiple-scale, high-automation, agile methodology.

 

 

It describes a cycle of interactions with well-defined outputs, resulting in the delivery of working, tested software that matters.”

Testes...

Podem ser escritos manualmente

Testes automatizados

A preguiça é a mãe do progresso. Se o homem não tivesse preguiça de caminhar, não teria inventado a roda

Mário Quintana

Pirâmide de testes

Pirâmide de testes

Ice-cream testing

Melhorando os testes

“I have a dream”

Martin Luther King

O centro do problema

דרישות

Tələblər

المتطلبات

skenario

需求

потребностей

Programadores conversam usando jargões técnicos

( design patterns, abreviações, termos técnicos )

 

Especialistas do Domínio usam terminologias específicas de suas áreas de conhecimento

(economia, hotelaria, telecom, …)

 

Softwares são escritos em diversas linguagens

Alguém tem que ceder

Agile prega que programadores devem usar a linguagem de domínio como nomenclaturas no código fonte

(“ubiquitous language”,

“system metaphor” na XP)

O acordo

A language structured around the domain model and used by all team members to connect all the activities of the team with the software.

(Excerpted from Domain-Driven Design by Eric Evans).

 

We understand each other.

(Excerpted from The Art of Agile Development

by James Shore and Shane Warden,published by O'Reilly.

© 2008 the authors.)

u. bí .qu:o

Escreva histórias e cenários de testes

com linguagem ubiqua

Gherkin

Escrevendo histórias

com linguagem ubiqua

Como [X]

eu quero [Y]

para que [Z]

Os comportamentos de uma história são simplesmente seus critérios de aceitação

Chris Matts & Dan North

Escrevendo histórias

com linguagem ubiqua

Feature: Feature description

         In order to

         As a …

         I need …

 

Escrevendo histórias

com linguagem ubiqua

Feature: Feature description

         In order to

         As a …

         I need …

 

       Given some initial context (the givens),

        When an event occurs,

        Then ensure some outcomes.

Escrevendo histórias

com linguagem ubiqua

Feature: Feature description

         In order to

         As a …

         I need …

 

       Given some initial context (the givens),

        When an event occurs,

        Then ensure some outcomes.

 

       Given some initial context (the givens),

       When an event occurs,

       Then ensure some outcomes.

Escrevendo histórias

com linguagem ubiqua

Feature: Feature description

         In order to

         As a …

         I need …


         Scenario: 1st scenario title

        Given some initial context (the givens),

         When an event occurs,

         Then ensure some outcomes.
 

        Scenario: 2nd scenario title

        Given some initial context (the givens),

        When an event occurs,

        Then ensure some outcomes.

Escrevendo histórias

com linguagem ubiqua

Feature

Funcionalidade

Feature: Feature description

         In order to

         As a …

         I need …


         Scenario: 1st scenario title

        Given some initial context (the givens),

         When an event occurs,

         Then ensure some outcomes.
 

        Scenario: 2nd scenario title

        Given some initial context (the givens),

        When an event occurs,

        Then ensure some outcomes.

Escrevendo histórias

com linguagem ubiqua

Scenario

Cenário

Feature

Funcionalidade

Feature: Feature description

         In order to

         As a …

         I need …


         Scenario: 1st scenario title

        Given some initial context (the givens),

         When an event occurs,

         Then ensure some outcomes.
 

        Scenario: 2nd scenario title

        Given some initial context (the givens),

        When an event occurs,

        Then ensure some outcomes.

Escrevendo histórias

com linguagem ubiqua

Step

Passo

Scenario

Cenário

Feature

Funcionalidade

Feature: Feature description

         In order to

         As a …

         I need …


         Scenario: 1st scenario title

        Given some initial context (the givens),

         When an event occurs,

         Then ensure some outcomes.
 

        Scenario: 2nd scenario title

        Given some initial context (the givens),

        When an event occurs,

        Then ensure some outcomes.

BDD no PHP

como faz?

MUITO CÓDIGO

TEM CÓDIGO PHP

Escrevendo uma Feature

Feature: Feature description

         In order to

         As a …

         I need …

 

       Given some initial context (the givens),

        When an event occurs,

        Then ensure some outcomes.

 

       Given some initial context (the givens),

       When an event occurs,

       Then ensure some outcomes.

 

Escrevendo uma Feature

Feature: Feature description

         In order to

         As a …

         I need …

 

       Given some initial context (the givens),

        When an event occurs,

        Then ensure some outcomes.

 

       Given some initial context (the givens),

       When an event occurs,

       Then ensure some outcomes.

 

Escrevendo uma História!

#language: pt

Funcionalidade: Descrição da feature

          Com o objetivo de …

          Como …

          Eu preciso …

 

          Cenário: título do primeiro cenário

          Dado algum contexto inicial,

          Quando ocorre um evento,

          Então verifique alguns resultados.

 

          Cenário: título do segundo cenário

          Dado algum contexto inicial,

          Quando ocorre um evneto,

          Então verifique alguns resultados.

Escrevendo uma História!

#language: ja

フィーチャ: Descrição da feature

          Com o objetivo de …

          Como …

          Eu preciso …

 

          シナリオ: título do primeiro cenário

          前提< algum contexto inicial,

          もし< ocorre um evento,

          ならば< verifique alguns resultados.

 

          シナリオ: título do segundo cenário

          前提< algum contexto inicial,

          もし< ocorre um evneto,

          ならば< verifique alguns resultados.

Escrevendo uma História!

#language: fr

Fonctionnalité: Descrição da feature

          Com o objetivo de …

          Como …

          Eu preciso …

 

          Scénario: título do primeiro cenário

          Étant donnée algum contexto inicial,

          Lorsque ocorre um evento,

          Alors verifique alguns resultados.

 

          Scénario: título do segundo cenário

          Étant donnée algum contexto inicial,

          Lorsque ocorre um evneto,

          Alors verifique alguns resultados.

Escrevendo uma História!

#language: el

Δυνατότητα: Descrição da feature

          Com o objetivo de …

          Como …

          Eu preciso …

 

          Σενάριο: título do primeiro cenário

          Δεδομένου algum contexto inicial,

          Όταν ocorre um evento,

          Τότε verifique alguns resultados.

 

          Σενάριο: título do segundo cenário

          Δεδομένου algum contexto inicial,

           Όταν ocorre um evneto,

          Τότε verifique alguns resultados.

Instalando o behat

Instalando o behat

O que é Composer?

mas...

Socorro! Ele já está falando

coisas que não entendo

novamente!

getcomposer.org

Como utilizar o composer?

Baixe o instalador do composer

Como utilizar o composer?

Como utilizar o composer?

Como utilizar o composer?

N º instalações

desde v2.2

(2011-12-14)

Executando o composer

e instalando o behat

Como utilizar o composer?

Iniciar o projeto com Behat

Um teste local simples

Feature: ls

   In order to see the directory structure

   As a UNIX user

   I need to be able to list the current directory's contents
 

 Scenario:

    Given I am in a directory "test"

    And I have a file named "foo"

    And I have a file named "bar"

    When I run "ls"

    Then I should get:

     """

     bar

     foo

     """

Arquivo:  features/ls.feature

Vamos ver como funciona?

Talk is cheap. Show me the code.

(Linus Torvalds)

Annotations

@nnotations

@Given

@When

@Then

Annotations

@nnotations

@Given

@When

@Then

 

 

 

@And

@But

 

Annotations

@nnotations

@Given

@When

@Then

 

 

 

@And

@But

 

/**
 * Opens specified page
 * Example: Given I am on "http://batman.com"
 * Example: And I am on "/articles/isBatmanBruceWayne"
 * Example: When I go to "/articles/isBatmanBruceWayne"
 *
 * @Given /^(?:|I )am on "(?P<page>[^"]+)"$/
 * @When /^(?:|I )go to "(?P<page>[^"]+)"$/
 */
public function visit($page)
{
    $this->visitPath($page);
}

Suítes de teste v3.x

Profile

suite #1

.feature #1

.feature #2

classe de contexto

suite #1

.feature #1

.feature #2

classe de contexto

# behat.yml
 

default:

   suites:

       core_features:

           paths:   [ %paths.base%/features/core ]

           contexts: [ CoreDomainContext ]

       user_features:

           paths:   [ %paths.base%/features/web ]

           filters: { tags: @user }

           contexts: [ UserContext ]

       admin_features:

           paths:   [ %paths.base%/features/web ]

           filters: { tags: @admin }

           contexts: [ AdminContext ]

Suítes de teste v3.x

# behat.yml
 

default:

   suites:

       core_features:

           paths:   [%paths.base%/features/core ]

           contexts:

             - FeatureContext:

                   args:

                       base_url: http://meusite.dev

                   parameter1: value1

                   parameter2:

                       usuario: vitor

                       senha: whiskassache

Suítes de teste v3.x

Mas… quais palavras posso usar?

Sintaxe da história

Sintaxe da história

Dicionário de Dados

Usando PHPUnit no Behat

Resultado dos testes

passed => passou

 failed => falhou

  pending => pendente

undefined => indefinido

skipped => omitido

Hooks para Behat

Uma maneira limpa e simples

de customizar o behat

@BeforeFeature, @AfterFeature

@BeforeScenario, @AfterScenario

@BeforeStep, @AfterStep

Hooks para Behat

Melhorando os testes

“I have a dream”

Martin Luther King

Evoluindo para a web

Multiplos navegadores

Headless browser

# language: pt

Funcionalidade: Busca na Wikipedia

    Vamos buscar na Wikipedia por Ada Lovelace

    e precisamos ver se retorna isto mesmo.

 

    @javascript

    Cenário: Busca por Ada Lovelace

        Dado estou na página de entrada

        E preencho "search" com "Ada Lovelace"

        E pressiono "go"

        Então devo ver "Ada Augusta King"

Um breve exemplo

Vamos ver como funciona?

Conclusão

“Eu cheguei a seguinte conclusão: não adianta consertar o resto, conserta a gente ajuda pra caramba”

Renato Russo

Transparência na escrita dos  testes

# language: pt

Funcionalidade: Busca na Wikipedia

 Vamos buscar na Wikipedia por Ada Lovelace

 e precisamos ver se retorna isto mesmo.

 @javascript

 Cenário: Busca por Ada Lovelace

   Dado estou na página de entrada

   E preencho "search" com "Ada Lovelace"

   E pressiono "go"

   Então devo ver "Ada Augusta King"

Integra não desenvolvedores na escrita dos testes

TDD não resolve tudo

BDD também não

Possibilidade de automatização de testes

Velocidade para implementar algo em produção

Deploys automatizados

Baixo custo para implementar testes

Vitor Mattos

vitor@LT.coop.br

t.me/VitorMattos

BDD + PHP = Behat

By Vitor Mattos

BDD + PHP = Behat

https://youtu.be/vwAp5teylF8 https://youtu.be/QVZe7fQck8s https://youtu.be/3j9nnYjOzoc Se você se preocupa com a qualidade de suas aplicações e quer aprender uma forma divertida e muito útil de escrever testes de comportamento, fazer isto com gherkin é o que há de melhor para a sua necessidade!

  • 1,064