SlideShare ist ein Scribd-Unternehmen logo
1 von 94
Downloaden Sie, um offline zu lesen
Behavior & SpeciïŹcation
Driven Development in PHP
Presented by Joshua Warren
OR:
I heard you like to code, so let’s
write code that writes code while
you code.
About Me
PHP Developer
Working with PHP since 1999
Founder & CEO
Founded Creatuity in 2008
PHP Development Firm
Focused on the Magento platform
Tink, a Creatuity shareholder
JoshuaWarren.com
@JoshuaSWarren
IMPORTANT!
‱ joind.in/14065
‱ Download slides
‱ Post comments
‱ Leave a rating!
What You Need To Know
ASSUMPTIONS
Today we assume you’re a PHP developer.
That you are familiar with test driven development.
And that you’ve at least tried PHPUnit, Selenium or
another testing tool.
BDD - no, the B does not stand for beer, despite what a Brit might tell you
Behavior Driven Development
Think of BDD as stepping back a level from TDD.
Graphic thanks to BugHuntress
TDD generally deals with functional units.
BDD steps back a level to consider complete features.
In BDD, you write feature ïŹles in the form of user stories
that you test against.
BDD uses a ubiquitous language - basically, a language
that business stakeholders, project managers, developers
and our automated tools can all understand.
Sample Behat Feature File
Feature: Laravel Test‹
In order to demonstrate Laravel and Behat‹
As a user‹
I need to be able to visit the homepage of a new Laravel app‹
‹
Scenario: Homepage‹
Given I am on the homepage‹
Then I should see "Laravel 5"‹
Behat
We implement BDD in PHP with a tool called Behat
Behat is a free, open source tool designed for BDD
and PHP
behat.org
SpecBDD - aka, Testing Tongue Twisters
SpeciïŹcation Behavior Driven
Development
Before you write a line of code, you write a
speciïŹcation for how that code should work
Focuses you on architectural decisions up-front
PHPSpec
Open Source tool for speciïŹcation driven
development in PHP
www.phpspec.net
Why Use Behat and PHPSpec?
These tools allow you to focus exclusively on logic
Helps build functional testing coverage
Guides planning and ensuring that all
stakeholders are in agreement
Let’s Build Something!

 what we’re building 

Setting up Our Project
Setup a Laravel 5 project
Run composer require —dev
behat/behat
behat/mink
behat/mink-extensions
laracasts/behat-laravel-extension
phpspec/phpspec
benconstable/phpspec-laravel
Run:
vendor/bin/behat —init
Create /behat.yaml
default:‹
extensions:‹
LaracastsBehat: ~‹
BehatMinkExtensionServiceContainerMinkExtension:‹
default_session: laravel‹
laravel: ~‹
Create /phpspec.yaml
suites:
main:
namespace: App
psr4_prefix: App
src_path: app
extensions:
- PhpSpecLaravelExtensionLaravelExtension
Features
features/ïŹtbit.feature
Feature: Fitbit Integration‹
In order to obtain Fitbit data‹
As a user‹
I need to be able to authenticate with Fitbit‹
Scenario: Not yet authenticated‹
Given I am not logged in as “josh@creatuity.com”
When I go to "/fitbit/"‹
Then I should see "Please authenticate"‹
‹
vendor/bin/behat —append-snippets
Scenario: Not yet authenticated:6
Given I am not logged in as “josh@creatuity.com
When I go to "/fitbit/"
Then I should see "Please authenticate"
1 scenario (1 undefined)
3 steps (1 undefined, 2 skipped)
0m0.48s (11.00Mb)
u features/bootstrap/FeatureContext.php - `I am not logged in as`
definition added
Behat’s written code for us!
/features/bootstrap/FeatureContext.php
/**‹
* @Given I am not logged in as :arg1‹
*/‹
public function iAmNotLoggedInAs($arg1)‹
{‹
throw new PendingException();‹
}‹
Behat writes just enough to get us show us where
to add our logic.
Behat expects us to add logic to this function to
detect the user is not logged in.
Before we do that, let’s ïŹnish out our feature ïŹle.
features/ïŹtbit.feature continued
Scenario: I have authenticated‹
Given I am logged in as “josh@creatuity.com”
When I go to "/fitbit/"‹
Then I should see "Welcome back"‹
Scenario: I have sleep data‹
Given I am logged in as “josh@creatuity.com”‹
When I go to "/fitbit/sleep/"‹
Then I should see "Sleep Report"‹
Run vendor/bin/behat —append-snippets one
more time
Now, let’s ïŹll in the logic Behat needs us to add.
/features/bootstrap/FeatureContext.php
/**‹
* @Given I am not logged in as :email‹
*/‹
public function iAmNotLoggedInAs($email)‹
{‹
// We completely log out‹
// Destroy the previous session‹
if (Session::isStarted()) {‹
Session::regenerate(true);‹
} else {‹
Session::start();‹
}‹
}‹
/features/bootstrap/FeatureContext.php
public function iAmLoggedInAs($email)‹
{‹
// Destroy the previous session‹
if (Session::isStarted()) {‹
Session::regenerate(true);‹
} else {‹
Session::start();‹
}‹
‹
// Login the user and since the driver and this code now‹
// share a session this will also login the driver session‹
$user = User::where('email', $email)->firstOrFail();‹
Auth::login($user);‹
‹
// Save the session data to disk or to memcache‹
Session::save();‹
‹
// Hack for Selenium‹
// Before setting a cookie the browser needs to be launched‹
if ($this->getSession()->getDriver() instanceof BehatMinkDriverSelenium2Driver) {‹
$this->visit('login');‹
}‹
‹
// Get the session identifier for the cookie‹
$encryptedSessionId = Crypt::encrypt(Session::getId());‹
$cookieName = Session::getName();‹
‹
// Set the cookie‹
$minkSession = $this->getSession();‹
$minkSession->setCookie($cookieName, $encryptedSessionId);‹
}
We run vendor/bin/behat once more
vendor/bin/behat


Scenario: I have sleep data
Given I am logged in as "josh@creatuity.com"
When I go to "/fitbit/sleep/"
Then I should see "Sleep Report"
The text "Sleep Report" was not found anywhere in the text of
the current page. (BehatMinkExceptionResponseTextException)
--- Failed scenarios:
features/fitbit.feature:6
features/fitbit.feature:11
features/fitbit.feature:16
A perfect failure!
These failures show us that Behat is testing our
app properly, and now we just need to write the
application logic.
SpeciïŹcations
Now we write speciïŹcations for how our Fitbit class
should work.
These speciïŹcations should provide the logic to
deliver the results that Behat is testing for.
vendor/bin/phpspec describe Fitbit
Specification for Fitbit created in <project root>/spec/
FitbitSpec.php
PHPSpec generates a basic spec ïŹle for us
spec/FitbitSpec.php
namespace spec;‹
‹
use PhpSpecObjectBehavior;‹
use ProphecyArgument;‹
‹
class FitbitSpec extends ObjectBehavior‹
{‹
function it_is_initializable()‹
{‹
$this->shouldHaveType('Fitbit');‹
}‹
}‹
This default spec tells PHPSpec to expect a class
named Fitbit.
Now we add a bit more to the ïŹle so PHPSpec will
understand what this class should do.
spec/FitbitSpec.php continued
function it_connects_to_fitbit($email)‹
{‹
$this->connect($email)->shouldReturn('Success');‹
}‹
‹
function it_returns_sleep_data($email)‹
{‹
$this->sleepData($email)->shouldReturn([8, 8, 8, 8, 8]);‹
}‹
Now we run PHPSpec once more

vendor/bin/phpspec run
10 ! is initializable (142ms)
class Fitbit does not exist.
15 ! connects to fitbit (100ms)
class Fitbit does not exist.
20 ! returns sleep data
class Fitbit does not exist.
---- broken examples
Fitbit
10 ! is initializable (142ms)
class Fitbit does not exist.
Fitbit
15 ! connects to fitbit (100ms)
class Fitbit does not exist.
Fitbit
20 ! returns sleep data
class Fitbit does not exist.
1 specs
3 examples (3 broken)
Lots of failures

But wait a second - PHPSpec prompts us!
Do you want me to create `Fitbit` for you?
[Y/n]
PHPSpec will create the class and the methods for us!
This is very powerful with frameworks like Laravel
and Magento, which have PHPSpec plugins that
help PHPSpec know where class ïŹles should be
located.
Fitbit.php - class Fitbit {
function connect($email)‹
{‹
// TODO: write logic here‹
}‹
‹
function sleepData($email)‹
{‹
// TODO: write logic here‹
}‹
And now, the easy part

Implementation
Implement logic in the new Fitbit class in the
locations directed by PHPSpec
Tie that logic into views in our application.
Once we’re done with the implementation, we
move on to

Testing
Once we’re done, running phpspec run should
return green
Once phpspec returns green, run behat, which
should return green as well
We now know that our new feature is working
correctly without needing to open a web browser
PHPSpec gives us conïŹdence that the application
logic was implemented correctly.
Behat gives us conïŹdence that the feature is being
displayed properly to users.
Success!
The purpose of this talk is to get you hooked on
Behat & PHPSpec and show you how easy it is to
get started.
Behat and PHPSpec are both powerful tools
PHPSpec can be used at a very granular level to
ensure your application logic works correctly
Next week, setup Behat and PHPSpec on one of
your projects and take it for a quick test by
implementing one short feature.
Keep In Touch!
‱ joind.in/14065
‱ @JoshuaSWarren
‱ JoshuaWarren.com

Weitere Àhnliche Inhalte

Was ist angesagt?

Symfony2 Introduction Presentation
Symfony2 Introduction PresentationSymfony2 Introduction Presentation
Symfony2 Introduction Presentation
Nerd Tzanetopoulos
 
php_tizag_tutorial
php_tizag_tutorialphp_tizag_tutorial
php_tizag_tutorial
tutorialsruby
 

Was ist angesagt? (20)

Hands-on with the Symfony2 Framework
Hands-on with the Symfony2 FrameworkHands-on with the Symfony2 Framework
Hands-on with the Symfony2 Framework
 
Console Apps: php artisan forthe:win
Console Apps: php artisan forthe:winConsole Apps: php artisan forthe:win
Console Apps: php artisan forthe:win
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is Docker
 
Introduction to CakePHP
Introduction to CakePHPIntroduction to CakePHP
Introduction to CakePHP
 
LvivPy - Flask in details
LvivPy - Flask in detailsLvivPy - Flask in details
LvivPy - Flask in details
 
Introduction to Groovy Monkey
Introduction to Groovy MonkeyIntroduction to Groovy Monkey
Introduction to Groovy Monkey
 
Maven 3.0 at Øredev
Maven 3.0 at ØredevMaven 3.0 at Øredev
Maven 3.0 at Øredev
 
Symfony2 Introduction Presentation
Symfony2 Introduction PresentationSymfony2 Introduction Presentation
Symfony2 Introduction Presentation
 
CakePHP
CakePHPCakePHP
CakePHP
 
Ant tutorial
Ant tutorialAnt tutorial
Ant tutorial
 
Creating a Plug-In Architecture
Creating a Plug-In ArchitectureCreating a Plug-In Architecture
Creating a Plug-In Architecture
 
Python/Flask Presentation
Python/Flask PresentationPython/Flask Presentation
Python/Flask Presentation
 
Php simple
Php simplePhp simple
Php simple
 
php_tizag_tutorial
php_tizag_tutorialphp_tizag_tutorial
php_tizag_tutorial
 
Top 50 Interview Questions and Answers in CakePHP
Top 50 Interview Questions and Answers in CakePHPTop 50 Interview Questions and Answers in CakePHP
Top 50 Interview Questions and Answers in CakePHP
 
Codeception: introduction to php testing (v2 - Aberdeen php)
Codeception: introduction to php testing (v2 - Aberdeen php)Codeception: introduction to php testing (v2 - Aberdeen php)
Codeception: introduction to php testing (v2 - Aberdeen php)
 
Django, What is it, Why is it cool?
Django, What is it, Why is it cool?Django, What is it, Why is it cool?
Django, What is it, Why is it cool?
 
PHP programmimg
PHP programmimgPHP programmimg
PHP programmimg
 
Jumping Into WordPress Plugin Programming
Jumping Into WordPress Plugin ProgrammingJumping Into WordPress Plugin Programming
Jumping Into WordPress Plugin Programming
 
Phpbasics
PhpbasicsPhpbasics
Phpbasics
 

Ähnlich wie Behavior & Specification Driven Development in PHP - #OpenWest

Brian Jackett: Managing SharePoint 2010 Farms with Powershell
Brian Jackett: Managing SharePoint 2010 Farms with PowershellBrian Jackett: Managing SharePoint 2010 Farms with Powershell
Brian Jackett: Managing SharePoint 2010 Farms with Powershell
SharePoint Saturday NY
 
Brian Jackett: Managing SharePoint 2010 Farms with Powershell
Brian Jackett: Managing SharePoint 2010 Farms with PowershellBrian Jackett: Managing SharePoint 2010 Farms with Powershell
Brian Jackett: Managing SharePoint 2010 Farms with Powershell
SharePoint Saturday NY
 

Ähnlich wie Behavior & Specification Driven Development in PHP - #OpenWest (20)

Simplify your professional web development with symfony
Simplify your professional web development with symfonySimplify your professional web development with symfony
Simplify your professional web development with symfony
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php Presentation
 
Enterprise PHP (PHP London Conference 2008)
Enterprise PHP (PHP London Conference 2008)Enterprise PHP (PHP London Conference 2008)
Enterprise PHP (PHP London Conference 2008)
 
All the Laravel things: up and running to making $$
All the Laravel things: up and running to making $$All the Laravel things: up and running to making $$
All the Laravel things: up and running to making $$
 
Effizientere WordPress-Plugin-Entwicklung mit Softwaretests
Effizientere WordPress-Plugin-Entwicklung mit SoftwaretestsEffizientere WordPress-Plugin-Entwicklung mit Softwaretests
Effizientere WordPress-Plugin-Entwicklung mit Softwaretests
 
Don't worry be API with Slim framework and Joomla
Don't worry be API with Slim framework and JoomlaDon't worry be API with Slim framework and Joomla
Don't worry be API with Slim framework and Joomla
 
BDD with Behat and Symfony2
BDD with Behat and Symfony2BDD with Behat and Symfony2
BDD with Behat and Symfony2
 
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
 
Building Large Scale PHP Web Applications with Laravel 4
Building Large Scale PHP Web Applications with Laravel 4Building Large Scale PHP Web Applications with Laravel 4
Building Large Scale PHP Web Applications with Laravel 4
 
Getting started with WordPress development
Getting started with WordPress developmentGetting started with WordPress development
Getting started with WordPress development
 
PHPUnit
PHPUnitPHPUnit
PHPUnit
 
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
Adopt DevOps philosophy on your Symfony projects (Symfony Live 2011)
 
Php Development Stack
Php Development StackPhp Development Stack
Php Development Stack
 
Php Development Stack
Php Development StackPhp Development Stack
Php Development Stack
 
pnwphp - PHPSpec & Behat: Two Testing Tools That Write Code For You
pnwphp - PHPSpec & Behat: Two Testing Tools That Write Code For Youpnwphp - PHPSpec & Behat: Two Testing Tools That Write Code For You
pnwphp - PHPSpec & Behat: Two Testing Tools That Write Code For You
 
Create Your Own Framework by Fabien Potencier
Create Your Own Framework by Fabien PotencierCreate Your Own Framework by Fabien Potencier
Create Your Own Framework by Fabien Potencier
 
Wordpress as a framework
Wordpress as a frameworkWordpress as a framework
Wordpress as a framework
 
Brian Jackett: Managing SharePoint 2010 Farms with Powershell
Brian Jackett: Managing SharePoint 2010 Farms with PowershellBrian Jackett: Managing SharePoint 2010 Farms with Powershell
Brian Jackett: Managing SharePoint 2010 Farms with Powershell
 
Brian Jackett: Managing SharePoint 2010 Farms with Powershell
Brian Jackett: Managing SharePoint 2010 Farms with PowershellBrian Jackett: Managing SharePoint 2010 Farms with Powershell
Brian Jackett: Managing SharePoint 2010 Farms with Powershell
 
LVPHP.org
LVPHP.orgLVPHP.org
LVPHP.org
 

Mehr von Joshua Warren

Mehr von Joshua Warren (20)

Enhancing the Customer Experience with Chatbots
Enhancing the Customer Experience with ChatbotsEnhancing the Customer Experience with Chatbots
Enhancing the Customer Experience with Chatbots
 
Transforming the Customer Experience Across 100 Stores with Magento
Transforming the Customer Experience Across 100 Stores with MagentoTransforming the Customer Experience Across 100 Stores with Magento
Transforming the Customer Experience Across 100 Stores with Magento
 
Its Just Commerce - IRCE 2018
Its Just Commerce - IRCE 2018Its Just Commerce - IRCE 2018
Its Just Commerce - IRCE 2018
 
Rural King Case Study from the Omnichannel Retail Summit
Rural King Case Study from the Omnichannel Retail SummitRural King Case Study from the Omnichannel Retail Summit
Rural King Case Study from the Omnichannel Retail Summit
 
Avoiding Commerce Extinction: Lessons from Retail Dinosaurs
Avoiding Commerce Extinction: Lessons from Retail DinosaursAvoiding Commerce Extinction: Lessons from Retail Dinosaurs
Avoiding Commerce Extinction: Lessons from Retail Dinosaurs
 
Building a Global B2B Empire: Using Magento to Power International Expansion
Building a Global B2B Empire: Using Magento to Power International ExpansionBuilding a Global B2B Empire: Using Magento to Power International Expansion
Building a Global B2B Empire: Using Magento to Power International Expansion
 
Magento 2 ERP Integration Best Practices: Microsoft Dynamics
Magento 2 ERP Integration Best Practices: Microsoft DynamicsMagento 2 ERP Integration Best Practices: Microsoft Dynamics
Magento 2 ERP Integration Best Practices: Microsoft Dynamics
 
What's New With Magento 2?
What's New With Magento 2?What's New With Magento 2?
What's New With Magento 2?
 
Magento 2 Performance: Every Second Counts
Magento 2 Performance: Every Second CountsMagento 2 Performance: Every Second Counts
Magento 2 Performance: Every Second Counts
 
Magento 2 Development for PHP Developers
Magento 2 Development for PHP DevelopersMagento 2 Development for PHP Developers
Magento 2 Development for PHP Developers
 
Pay No Attention to the Project Manager Behind the Curtain: A Magento 2 Tell-All
Pay No Attention to the Project Manager Behind the Curtain: A Magento 2 Tell-AllPay No Attention to the Project Manager Behind the Curtain: A Magento 2 Tell-All
Pay No Attention to the Project Manager Behind the Curtain: A Magento 2 Tell-All
 
Magento 2 Integrations: ERPs, APIs, Webhooks & Rabbits! - MageTitansUSA 2016
Magento 2 Integrations: ERPs, APIs, Webhooks & Rabbits! - MageTitansUSA 2016Magento 2 Integrations: ERPs, APIs, Webhooks & Rabbits! - MageTitansUSA 2016
Magento 2 Integrations: ERPs, APIs, Webhooks & Rabbits! - MageTitansUSA 2016
 
How I Learned to Stop Worrying and Love Composer - php[world] 2015
How I Learned to Stop Worrying and Love Composer - php[world] 2015How I Learned to Stop Worrying and Love Composer - php[world] 2015
How I Learned to Stop Worrying and Love Composer - php[world] 2015
 
Magento 2 Dependency Injection, Interceptors, and You - php[world] 2015
Magento 2 Dependency Injection, Interceptors, and You - php[world] 2015Magento 2 Dependency Injection, Interceptors, and You - php[world] 2015
Magento 2 Dependency Injection, Interceptors, and You - php[world] 2015
 
Work Life Balance for Passionate Developers - Full Stack Toronto 2015 Edition
Work Life Balance for Passionate Developers - Full Stack Toronto 2015 EditionWork Life Balance for Passionate Developers - Full Stack Toronto 2015 Edition
Work Life Balance for Passionate Developers - Full Stack Toronto 2015 Edition
 
Magento 2 - An Intro to a Modern PHP-Based System - ZendCon 2015
Magento 2 - An Intro to a Modern PHP-Based System - ZendCon 2015Magento 2 - An Intro to a Modern PHP-Based System - ZendCon 2015
Magento 2 - An Intro to a Modern PHP-Based System - ZendCon 2015
 
Magento 2 - An Intro to a Modern PHP-Based System - Northeast PHP 2015
Magento 2 - An Intro to a Modern PHP-Based System - Northeast PHP 2015Magento 2 - An Intro to a Modern PHP-Based System - Northeast PHP 2015
Magento 2 - An Intro to a Modern PHP-Based System - Northeast PHP 2015
 
Get Out of the Back Row! A Community Involvement Primer - #OpenWest
Get Out of the Back Row! A Community Involvement Primer - #OpenWestGet Out of the Back Row! A Community Involvement Primer - #OpenWest
Get Out of the Back Row! A Community Involvement Primer - #OpenWest
 
Work-Life Balance For Passionate Geeks - #OpenWest
Work-Life Balance For Passionate Geeks - #OpenWestWork-Life Balance For Passionate Geeks - #OpenWest
Work-Life Balance For Passionate Geeks - #OpenWest
 
High Stakes Continuous Delivery in the Real World #OpenWest
High Stakes Continuous Delivery in the Real World #OpenWestHigh Stakes Continuous Delivery in the Real World #OpenWest
High Stakes Continuous Delivery in the Real World #OpenWest
 

KĂŒrzlich hochgeladen

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

KĂŒrzlich hochgeladen (20)

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
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
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
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 

Behavior & Specification Driven Development in PHP - #OpenWest