SlideShare a Scribd company logo
1 of 69
Download to read offline
Behaviour­Driven Development 
       (BDD) em Python




      Hugo Lopes Tavares
Parte 1: Conceitos
TestDox
Public class FooTest extends TestCase {
    public void testIsASingleton() {}
    public void testAReallyLongNameIsAGoodThing() {}
}




 Foo
 - is a singleton
 - a really long name is a good thing
“Getting the words
             right”
Palavra mágica:
    should
public class CustomerLookupTest {
    @Test
    public void shouldFindCustomerById() { }
    @Test
    public void shouldFailForDuplicatedCustomers() { }
}




CustomerLookup
- should find customer by id
- should fail for duplicated customers
Ubiquitous Language
    para análise de 
           software
Histórias
    e
Cenários
“It's all behaviour”
→
histórias e cenários   aplicação
exemplos             → código
Outside­In Development
O que precisamos 
sempre manter em 
mente?
Specification,
not Verification
todo comportamento 
precisa de exemplos
Benefícios
foco
documentação correta 
 em sincronia com o 
       código
Cenários:
testes de aceitação 
  e de regressão
Exemplos:
testes unitários
       e
  documentação
YAGNI
Mock
Objects
Como fazer BDD no 
   dia­a­dia?
Todas as práticas 
em BDD são novas?
Beer­Driven 
Development
Parte 2:
Ferramentas em 
    Python
Mock Frameworks
Mockito
from mockito import Mock, when, verify

class MaquinaDeSaque(object):
    @staticmethod
    def transferir(valor, conta1, conta2):
        if conta2.pegar_saldo() >= valor:
            conta2.sacar(valor)
            conta1.depositar(valor)

conta2 = Mock()
conta1 = Mock()
when(conta2).pegar_saldo().thenReturn(200)

MaquinaDeSaque.transferir(100, conta1, conta2)

verify(conta1).depositar(100)
verify(conta2).sacar(100)
Ludíbrio
from __future__ import with_statement
from ludibrio import Mock

class MaquinaDeSaque(object):
    @staticmethod
    def transferir(valor, conta1, conta2):
        if conta2.pegar_saldo() >= valor:
            conta2.sacar(valor)
            conta1.depositar(valor)

with Mock() as conta1:
    conta1.depositar(100)

with Mock() as conta2:
    conta2.pegar_saldo() << 200
    conta2.sacar(100)

MaquinaDeSaque.transferir(100, conta1, conta2)
http://bitbucket.org/szczepiq/mockito­python


http://github.com/nsigustavo/ludibrio
Should-DSL
2 |should_be.greater_than| 1

'hugo' |should_not_be.equal_to| 'Hugo'

5 |should_be.less_than| 10

['python', 'C'] |should_have| 'python'

'C' |should_be.into| ['python', 'C']




                             assert 2 > 1

                             assert 'hugo' == 'Hugo'

                             assert 5 < 10

                             assert 'C' in '[python', 'C']
>>> from should_dsl import matcher, should_be

>>> @matcher
... def abs_of():
...     return lambda x, y: x == abs(y),
...            '%s is%s the abs of %s'
... 

>>> 1 |should_be.abs_of| ­1
True
>>> from math import sqrt

>>> deve_ser = should_be

>>> @matcher
... def a_raiz_quadrada_de():
...     return lambda x,y: x == sqrt(y),
...            "%s %se' a raiz quadrada de %s"
... 

>>> 2 |deve_ser.a_raiz_quadrada_de| 4
True
http://github.com/hugobr/should­dsl
Example Frameworks
PySpec
behaviour_spec.py:
import stack         # import production code
from pyspec import * # import pyspec framework

class Behavior_Stack(object):
  @context
  def new_stack(self):
    self.stack = stack.Stack()

  @spec
  def should_be_empty(self):
    About(self.stack).should_be_empty()

if __name__ == "__main__":
  run_test()
stack.py:
    class Stack(object):
      def __len__(self):
        return 0



$ python behavior_stack.py

new stack
    should be empty ... OK

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
Ran 1 spec in 0.048s
OK
Behaviour
class verifyUserSpecification(behaviour.Behaviour):

    def setUp(self):
        self.user = User("Mark Dancer")

    def verifyInitialUserNameIsNameInConstructor(self):
        self.shouldBeEqual(self.user.name, "Mark Dancer")

    def verifyInitialUserHasNoLanguages(self):
        self.shouldBeEmpty(self.user.languages)
Yeti
# coding: spec
from should_dsl import should_be

class Bowling:
    score = 0
    def hit(self, v):
        self.score += v

describe Bowling:
    def before_each:
        self._bowling = Bowling()

    it "should score 0 for gutter game":
        self._bowling.hit(0)
        self._bowling.score |should_be.equal_to| 0

    it "should score 1 for just one hit":
        self._bowling.hit(1)
        self._bowling.score |should_be.equal_to| 1
http://www.codeplex.com/pyspec

http://pypi.python.org/pypi/Behaviour

http://github.com/fmeyer/yeti
Story/Feature 
 Frameworks
Pyccuracy
As a Google User
I want to search Google
So that I can test Pyccuracy

Scenario 1 ­ Searching for Hello World
Given
  I go to "http://www.google.com"
When
  I fill "q" textbox with "Hello World"
  And I click "btnG" button
  And I wait for 2 seconds
Then
  I see "Hello World ­ Pesquisa Google" title
Pyhistorian
from should_dsl import *
from pyhistorian import *

class Calculator(object):
    def sum(self, n1, n2):
        return n1+n2


class SpecifyingMyNewCalculator(Story):
    """As a lazy mathematician
       I want to use a calculator
       So that I don't waste my time thinking"""
    colored = True
    template_color = 'yellow'
    scenarios = ['SumScenario'] # optional
Pyhistorian
class SumScenario(Scenario):
    @Given('I have a calculator')
    def set_my_calculator(self):
        self.calculator = Calculator()

    @When('I enter with 1 + 1')
    def sum_one_to_one(self):
        self.result = self.calculator.sum(1, 1)

    @Then('I have $value as result', 2)
    def get_result(self, value):
        self.result |should_be| value


if __name__ == '__main__':
    SpecifyingMyNewCalculator.run()
PyCukes
Story: Bowling Game
  As a bowling player
  I want to play bowling online
  So that I can play with everyone in the world

    Scenario 1: Gutter Game
      Given I am playing a bowling game
      When I hit no balls
      Then I have 0 points
PyCukes
from pycukes import *

class BowlingGame(object):
    score = 1
    def hit(self, balls):
        pass


@Given('I am playing a bowling game')
def start_game(context):
    context._bowling_game = BowlingGame()

@When('I hit no balls')
def hit_no_balls(context):
    context._bowling_game.hit(0)

@Then('I have 0 points')
def i_have_zero_points(context):
    assert context._bowling_game.score == 0
Freshen
Feature: Division
  In order to avoid silly mistakes
  Cashiers must be able to calculate a fraction
 
  Scenario: Regular numbers
    Given I have entered 3 into the calculator
    And I have entered 2 into the calculator
    When I press divide
    Then the result should be 1.5 on the screen
 
Freshen
Feature: Addition
  In order to avoid silly mistakes
  As a math idiot
  I want to be told the sum of two numbers
 
  Scenario Outline: Add two numbers
    Given I have entered <input_1> into the calculator
    And I have entered <input_2> into the calculator
    When I press <button>
    Then the result should be <output> on the screen
 
  Examples:
    | input_1 | input_2 | button | output |
    | 20      | 30      | add    | 50     |
    | 2       | 5       | add    | 7      |
    | 0       | 40      | add    | 40     |
 
Freshen
from freshen import *
from freshen.checks import *
 
import calculator
 
@Before
def before(sc):
    scc.calc = calculator.Calculator()
    scc.result = None
 
@Given("I have entered (d+) into the calculator")
def enter(num):
    scc.calc.push(int(num))
 
@When("I press (w+)")
def press(button):
    op = getattr(scc.calc, button)
    scc.result = op()
 
@Then("the result should be (.*) on the screen")
def check_result(value):
    assert_equal(str(scc.result), value)
 
http://github.com/heynemann/pyccuracy

http://github.com/hugobr/pyhistorian

http://github.com/hugobr/pycukes

http://github.com/rlisagor/freshen
Referências
http://dannorth.net/introducing­bdd

http://blog.daveastels.com/files/BDD_Intro.pdf

http://behaviour­driven.org/

http://pt.wikipedia.org/wiki/Behaviour_Driven_Development

http://en.wikipedia.org/wiki/Behaviour_Driven_Development

http://agiledox.sourceforge.net/

http://cukes.info

http://rspec.info
Obrigado!
       hltbra@gmail.com
            @hltbra
 http://hugolt.wordpress.com

More Related Content

Viewers also liked

關於測試,我說的其實是......
關於測試,我說的其實是......關於測試,我說的其實是......
關於測試,我說的其實是......hugo lu
 
BDD with JBehave and Selenium
BDD with JBehave and SeleniumBDD with JBehave and Selenium
BDD with JBehave and SeleniumNikolay Vasilev
 
Behavior Driven Development with Cucumber
Behavior Driven Development with CucumberBehavior Driven Development with Cucumber
Behavior Driven Development with CucumberBrandon Keepers
 
Cucumber: 小黃瓜驗收測試工具
Cucumber: 小黃瓜驗收測試工具Cucumber: 小黃瓜驗收測試工具
Cucumber: 小黃瓜驗收測試工具Wen-Tien Chang
 
認試軟體測試的世界 & TDD/BDD 入門
認試軟體測試的世界 & TDD/BDD 入門認試軟體測試的世界 & TDD/BDD 入門
認試軟體測試的世界 & TDD/BDD 入門wantingj
 
手機自動化測試和持續整合
手機自動化測試和持續整合手機自動化測試和持續整合
手機自動化測試和持續整合Carl Su
 

Viewers also liked (6)

關於測試,我說的其實是......
關於測試,我說的其實是......關於測試,我說的其實是......
關於測試,我說的其實是......
 
BDD with JBehave and Selenium
BDD with JBehave and SeleniumBDD with JBehave and Selenium
BDD with JBehave and Selenium
 
Behavior Driven Development with Cucumber
Behavior Driven Development with CucumberBehavior Driven Development with Cucumber
Behavior Driven Development with Cucumber
 
Cucumber: 小黃瓜驗收測試工具
Cucumber: 小黃瓜驗收測試工具Cucumber: 小黃瓜驗收測試工具
Cucumber: 小黃瓜驗收測試工具
 
認試軟體測試的世界 & TDD/BDD 入門
認試軟體測試的世界 & TDD/BDD 入門認試軟體測試的世界 & TDD/BDD 入門
認試軟體測試的世界 & TDD/BDD 入門
 
手機自動化測試和持續整合
手機自動化測試和持續整合手機自動化測試和持續整合
手機自動化測試和持續整合
 

Similar to Behaviour-Driven Development (BDD) em Python

4. Метапрограмиране
4. Метапрограмиране4. Метапрограмиране
4. МетапрограмиранеStefan Kanev
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everythingnoelrap
 
Using of TDD practices for Magento
Using of TDD practices for MagentoUsing of TDD practices for Magento
Using of TDD practices for MagentoIvan Chepurnyi
 
What's new in Rails 2?
What's new in Rails 2?What's new in Rails 2?
What's new in Rails 2?brynary
 
PGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQL
PGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQLPGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQL
PGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQLPGConf APAC
 
Centralising Authorisation in PostgreSQL
Centralising Authorisation in PostgreSQLCentralising Authorisation in PostgreSQL
Centralising Authorisation in PostgreSQLGary Evans
 
Django - Framework web para perfeccionistas com prazos
Django - Framework web para perfeccionistas com prazosDjango - Framework web para perfeccionistas com prazos
Django - Framework web para perfeccionistas com prazosIgor Sobreira
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialOSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialYi-Ting Cheng
 
Introduction to programming c and data structures
Introduction to programming c and data structuresIntroduction to programming c and data structures
Introduction to programming c and data structuresPradipta Mishra
 
Introduction to programming c and data-structures
Introduction to programming c and data-structures Introduction to programming c and data-structures
Introduction to programming c and data-structures Pradipta Mishra
 
Testing ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using RubyTesting ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using RubyBen Hall
 
Zend Certification PHP 5 Sample Questions
Zend Certification PHP 5 Sample QuestionsZend Certification PHP 5 Sample Questions
Zend Certification PHP 5 Sample QuestionsJagat Kothari
 
AEM Sightly Template Language
AEM Sightly Template LanguageAEM Sightly Template Language
AEM Sightly Template LanguageGabriel Walt
 

Similar to Behaviour-Driven Development (BDD) em Python (20)

4. Метапрограмиране
4. Метапрограмиране4. Метапрограмиране
4. Метапрограмиране
 
How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everything
 
PHPSpec BDD Framework
PHPSpec BDD FrameworkPHPSpec BDD Framework
PHPSpec BDD Framework
 
Using of TDD practices for Magento
Using of TDD practices for MagentoUsing of TDD practices for Magento
Using of TDD practices for Magento
 
Symfony 1, mi viejo amigo
Symfony 1, mi viejo amigoSymfony 1, mi viejo amigo
Symfony 1, mi viejo amigo
 
C tutorial
C tutorialC tutorial
C tutorial
 
What's new in Rails 2?
What's new in Rails 2?What's new in Rails 2?
What's new in Rails 2?
 
DjangoCon09: The Test Client
DjangoCon09: The Test ClientDjangoCon09: The Test Client
DjangoCon09: The Test Client
 
PGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQL
PGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQLPGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQL
PGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQL
 
Centralising Authorisation in PostgreSQL
Centralising Authorisation in PostgreSQLCentralising Authorisation in PostgreSQL
Centralising Authorisation in PostgreSQL
 
Django - Framework web para perfeccionistas com prazos
Django - Framework web para perfeccionistas com prazosDjango - Framework web para perfeccionistas com prazos
Django - Framework web para perfeccionistas com prazos
 
TDD
TDDTDD
TDD
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialOSDC 2009 Rails Turtorial
OSDC 2009 Rails Turtorial
 
Introduction to programming c and data structures
Introduction to programming c and data structuresIntroduction to programming c and data structures
Introduction to programming c and data structures
 
Jicc teaching rails
Jicc teaching railsJicc teaching rails
Jicc teaching rails
 
Introduction to programming c and data-structures
Introduction to programming c and data-structures Introduction to programming c and data-structures
Introduction to programming c and data-structures
 
Testing ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using RubyTesting ASP.net Web Applications using Ruby
Testing ASP.net Web Applications using Ruby
 
Zend Certification PHP 5 Sample Questions
Zend Certification PHP 5 Sample QuestionsZend Certification PHP 5 Sample Questions
Zend Certification PHP 5 Sample Questions
 
Object Exercise
Object ExerciseObject Exercise
Object Exercise
 
AEM Sightly Template Language
AEM Sightly Template LanguageAEM Sightly Template Language
AEM Sightly Template Language
 

More from Hugo Lopes Tavares

Quero ser programador! #comofas?
Quero ser programador! #comofas?Quero ser programador! #comofas?
Quero ser programador! #comofas?Hugo Lopes Tavares
 
Python Packaging: Passado, Presente e Futuro
Python Packaging: Passado, Presente e FuturoPython Packaging: Passado, Presente e Futuro
Python Packaging: Passado, Presente e FuturoHugo Lopes Tavares
 
Collaborative Coding: Git + Github (NSI Tech Talks)
Collaborative Coding: Git + Github (NSI Tech Talks)Collaborative Coding: Git + Github (NSI Tech Talks)
Collaborative Coding: Git + Github (NSI Tech Talks)Hugo Lopes Tavares
 
Collaborative Coding: Git + Github
Collaborative Coding: Git + GithubCollaborative Coding: Git + Github
Collaborative Coding: Git + GithubHugo Lopes Tavares
 
Behaviour-Driven Development: escrevendo especificações ágeis
Behaviour-Driven Development: escrevendo especificações ágeisBehaviour-Driven Development: escrevendo especificações ágeis
Behaviour-Driven Development: escrevendo especificações ágeisHugo Lopes Tavares
 

More from Hugo Lopes Tavares (6)

Quero ser programador! #comofas?
Quero ser programador! #comofas?Quero ser programador! #comofas?
Quero ser programador! #comofas?
 
Python Packaging: Passado, Presente e Futuro
Python Packaging: Passado, Presente e FuturoPython Packaging: Passado, Presente e Futuro
Python Packaging: Passado, Presente e Futuro
 
Collaborative Coding: Git + Github (NSI Tech Talks)
Collaborative Coding: Git + Github (NSI Tech Talks)Collaborative Coding: Git + Github (NSI Tech Talks)
Collaborative Coding: Git + Github (NSI Tech Talks)
 
Collaborative Coding: Git + Github
Collaborative Coding: Git + GithubCollaborative Coding: Git + Github
Collaborative Coding: Git + Github
 
Pyramid - BDD em Python
Pyramid - BDD em PythonPyramid - BDD em Python
Pyramid - BDD em Python
 
Behaviour-Driven Development: escrevendo especificações ágeis
Behaviour-Driven Development: escrevendo especificações ágeisBehaviour-Driven Development: escrevendo especificações ágeis
Behaviour-Driven Development: escrevendo especificações ágeis
 

Recently uploaded

GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 

Recently uploaded (20)

GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 

Behaviour-Driven Development (BDD) em Python

Editor's Notes

  1. Mostrar um exemplo e falar sobre a ideia do should