Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

BDD + PHP = behat!

2,265 views

Published on

Aprenda como escrever testes de comportamento para suas aplicações utilizando a linguagem gherkin de forma bem simples.

Published in: Technology

BDD + PHP = behat!

  1. 1. BDD + =
  2. 2. BDD + = “Os comportamentos de uma história são simplesmente seus critérios de aceitação” Chris Matts & Dan North
  3. 3. Quem vos apresenta BDD: Eu! :D Vitor Mattos
  4. 4. O culpado...
  5. 5. Testes Por que fazê-los se eu já posso começar desenvolvendo?
  6. 6. “Se alguma coisa tem a mais remota chance de dar errado, certamente dará.” Edward A. Murphy Lei de Murphy
  7. 7. Escrevendo testes "É 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." Tom DeMarco
  8. 8. Teste unitário O que é isso?
  9. 9. Um exemplo de TDD com PHPUnit
  10. 10. Test Driven Development
  11. 11. Test Driven Development Como testar se não tem nem código escrito?
  12. 12. Test Driven Development Behavior © 2003, Dan North
  13. 13. O que é BDD? Tá bom…. BDD pode me ajudar mas...
  14. 14. 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.”
  15. 15. Testes... Podem ser escritos manualmente
  16. 16. 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
  17. 17. Pirâmide de testes
  18. 18. Ice-cream testing
  19. 19. BDD no PHP Como faz?
  20. 20. MUITO CÓDIGO
  21. 21. TEM CÓDIGO PHP
  22. 22. Melhorando os testes “I have a dream” Martin Luther King
  23. 23. O centro do problema ‫דרישות‬ потребностей ‫اﻟﻣﺗطﻠﺑﺎت‬ skenario 需求 Tələblər
  24. 24. 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!
  25. 25. O acordo Agile prega que programadores devem usar a linguagem de domínio como nomenclaturas no código fonte (“ubiquitous language”, “system metaphor” na XP)
  26. 26. u. bí .qu:o 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.)
  27. 27. Gherkin Escreva histórias e cenários de testes com linguagem ubiqua
  28. 28. 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
  29. 29. Escrevendo histórias com linguagem ubiqua Feature: Feature description In order to … As a … I need …
  30. 30. 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.
  31. 31. 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.
  32. 32. 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.
  33. 33. 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. Feature Funcionaldiade
  34. 34. 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. Feature Funcionaldiade Scenario Cenário
  35. 35. 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. Feature Funcionaldiade Scenario Cenário Step Passo
  36. 36. Escrevendo uma Feature 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.
  37. 37. Escrevendo uma Feature 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.
  38. 38. 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.
  39. 39. 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.
  40. 40. 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.
  41. 41. 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.
  42. 42. Instalando o behat
  43. 43. Instalando o behat
  44. 44. O que é Composer? mas... Socorro! Ele já está falando coisas que não entendo novamente!
  45. 45. Como utilizar o Composer? getcomposer.org
  46. 46. Como utilizar o Composer? Baixe o instalador do composer
  47. 47. Como utilizar o Composer? O que é um phar?
  48. 48. Como utilizar o Composer? O que é um phar? Php ARchive
  49. 49. Como utilizar o Composer? Cirando arquivo de dependências .json
  50. 50. Como utilizar o Composer?
  51. 51. Como utilizar o Composer? 4.926.844 instalações desde v2.2 (2011-12-14)
  52. 52. Como utilizar o Composer? Executando o composer e instalando o behat
  53. 53. Como utilizar o Composer? Executando o composer e instalando o behat
  54. 54. Iniciar o projeto com Behat
  55. 55. Um teste local simples Arquivo: features/ls.feature 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 """
  56. 56. Vamos ver como funciona? Talk is cheap. Show me the code. (Linus Torvalds)
  57. 57. Annotations @nnotations @Given @When @Then
  58. 58. Annotations @nnotations @Given @When @Then @And @But
  59. 59. Annotations @nnotations @Given @When @Then @And @But
  60. 60. Profile Suítes de teste v3.x
  61. 61. Suítes de teste v3.x Profile suite #1 suite #1
  62. 62. Profile suite #1 .feature #1 .feature #2 Classe de contexto suite #1 .feature #1 .feature #2 Classe de contexto Suítes de teste v3.x
  63. 63. Suítes de teste v3.x # 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 ]
  64. 64. # 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
  65. 65. Mas… quais palavras posso usar?
  66. 66. Sintaxe da história
  67. 67. Sintaxe da história
  68. 68. Dicionário de dados
  69. 69. Usando PHPUnit no Behat
  70. 70. Resultado dos testes passed => passou failed => falhou pending => pendente undefined => indefinido skipped => omitido
  71. 71. Hooks para Behat Uma maneira limpa e simples de customizar o behat @BeforeFeature, @AfterFeature @BeforeScenario, @AfterScenario @BeforeStep, @AfterStep
  72. 72. Hooks para Behat
  73. 73. Melhorando os testes “I have a dream” Martin Luther King
  74. 74. Evoluindo para a web
  75. 75. Múltiplos navegadores
  76. 76. Headless browser
  77. 77. Um breve exemplo... # 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"
  78. 78. Vamos ver como funciona?
  79. 79. Conclusão “Eu cheguei a seguinte conclusão: não adianta consertar o resto, conserta a gente ajuda pra caramba” Renato Russo Que país é esse?
  80. 80. 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 Byron King"
  81. 81. Integra não desenvolvedores na escrita dos testes
  82. 82. TDD não resolve tudo BDD também não
  83. 83. Possibilidade de automatização de testes
  84. 84. Velocidade para implementar algo em produção
  85. 85. Deploys automatizados
  86. 86. Baixo custo para implementar testes
  87. 87. Avaliações
  88. 88. Perguntas vitor.mattos@phprio.org linkedin.com/in/vitormattos

×