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



