SlideShare a Scribd company logo
1 of 153
Download to read offline
PHPSpec & Behat: Two Testing
Tools That Write Code For You
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/13744
• 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 up a level from TDD.
Graphic thanks to BugHuntress
TDD generally deals with functional units.
BDD steps up a level to consider complete features.
In BDD, you write feature files 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: Up and Running

In order to confirm Behat is Working

As a developer

I need to see a homepage





Scenario: Homepage Exists

When I go to "/bdd/"

Then I should see "Welcome to the world of BDD"

BDD gets all stakeholders to agree on what “done”
looks like before you write a single line of code
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
Specification Behavior Driven
Development
Before you write a line of code, you write a
specification for how that code should work
Focuses you on architectural decisions up-front
PHPSpec
Open Source tool for specification 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 quickly
Guides planning and ensuring that all stakeholders are
in agreement
Why Not PHPUnit?
PHPSpec is opinionated - in every sense of the word
PHPSpec forces you to think differently and creates a
mindset that encourages usage
PHPSpec tests are much more readable
Read any of Marcello Duarte’s slides on testing
What About Performance?
Tests that take days to run won’t be used
PHPSpec is fast
Behat supports parallel execution
Behat and PHPSpec will be at least as fast as the
existing testing tools, and can be much faster
Enough Theory:

Let’s Build Something!
We’ll be building a basic time-off request app.
Visitors can specify their name and a reason
for their time off request.
Time off requests can be viewed, approved
and denied.
Intentionally keeping things simple, but you
can follow this pattern to add authentication,
roles, etc.
Want to follow along or view the sample
code?
Vagrant box:
https://github.com/joshuaswarren/bdd-box
Project code:
https://github.com/joshuaswarren/bdd
Setting up Our Project
Setup a folder for your project
Use composer to install Behat, phpspec & friends
composer require behat/behat —dev
composer require behat/mink-goutte-driver —dev
composer require phpspec/phpspec —dev
We now have Behat and Phpspec installed
We also have Mink - an open source browser
emulator/controller
Mink Drivers
Goutte - headless, fast, no JS
Selenium2 - requires Selenium server, slower,
supports JS
Zombie - headless, fast, does support JS
We are using Goutte today because we don’t need
Javascript support
We’ll perform some basic configuration to let Behat
know to use Goutte
And we need to let phpspec know where our code
should go
Run:
vendor/bin/behat —init
Create /behat.yml
default:

extensions:

BehatMinkExtension:

base_url: http://192.168.33.10/

default_session: goutte

goutte: ~

features/bootstrap/FeatureContext.php
use BehatBehatContextContext;

use BehatBehatContextSnippetAcceptingContext;

use BehatGherkinNodePyStringNode;

use BehatGherkinNodeTableNode;

use BehatMinkExtensionContextMinkContext;



/**

* Defines application features from the specific context.

*/

class FeatureContext extends BehatMinkExtensionContextMinkContext

{



}
Create /phpspec.yml
suites:

app_suites:

namespace: App

psr4_prefix: App

src_path: app

Features
features/UpAndRunning.feature
Feature: Up and Running

In order to confirm Behat is Working

As a developer

I need to see a homepage





Scenario: Homepage Exists

When I go to "/bdd/"

Then I should see "Welcome to the world of BDD"

Run:
bin/behat
features/SubmitTimeOffRequest.feature
Feature: Submit Time Off Request

In order to request time off

As a developer

I need to be able to fill out a time off request form



Scenario: Time Off Request Form Exists

When I go to "/bdd/timeoff/new"

Then I should see "New Time Off Request"



Scenario: Time Off Request Form Works

When I go to "/bdd/timeoff/new"

And I fill in "name" with "Josh"

And I fill in "reason" with "Attending a great conference"

And I press "submit"

Then I should see "Time Off Request Submitted"

features/SubmitTimeOffRequest.feature
Feature: Submit Time Off Request

In order to request time off

As a developer

I need to be able to fill out a time off request form



Scenario: Time Off Request Form Exists

When I go to "/bdd/timeoff/new"

Then I should see "New Time Off Request"



Scenario: Time Off Request Form Works

When I go to "/bdd/timeoff/new"

And I fill in "name" with "Josh"

And I fill in "reason" with "Attending a great conference"

And I press "submit"

Then I should see "Time Off Request Submitted"

features/SubmitTimeOffRequest.feature
Feature: Submit Time Off Request

In order to request time off

As a developer

I need to be able to fill out a time off request form



Scenario: Time Off Request Form Exists

When I go to "/bdd/timeoff/new"

Then I should see "New Time Off Request"



Scenario: Time Off Request Form Works

When I go to "/bdd/timeoff/new"

And I fill in "name" with "Josh"

And I fill in "reason" with "Attending a great conference"

And I press "submit"

Then I should see "Time Off Request Submitted"

features/SubmitTimeOffRequest.feature
Feature: Submit Time Off Request

In order to request time off

As a developer

I need to be able to fill out a time off request form



Scenario: Time Off Request Form Exists

When I go to "/bdd/timeoff/new"

Then I should see "New Time Off Request"



Scenario: Time Off Request Form Works

When I go to "/bdd/timeoff/new"

And I fill in "name" with "Josh"

And I fill in "reason" with "Attending a great conference"

And I press "submit"

Then I should see "Time Off Request Submitted"

features/ProcessTimeOffRequest.feature
Feature: Process Time Off Request

In order to manage my team

As a manager

I need to be able to approve and deny time off requests



Scenario: Time Off Request Management View Exists

When I go to "/bdd/timeoff/manage"

Then I should see "Manage Time Off Requests"



Scenario: Time Off Request List

When I go to "/bdd/timeoff/manage"

And I press "View"

Then I should see "Pending Time Off Request Details"



Scenario: Approve Time Off Request

When I go to "/bdd/timeoff/manage"

And I press "View"

And I press "Approve"

Then I should see "Time Off Request Approved"



Scenario: Deny Time Off Request

When I go to "/bdd/timeoff/manage"

And I press "View"

And I press "Deny"

Then I should see "Time Off Request Denied"
features/ProcessTimeOffRequest.feature
Feature: Process Time Off Request

In order to manage my team

As a manager

I need to be able to approve and deny time off requests
features/ProcessTimeOffRequest.feature
Scenario: Time Off Request Management View Exists

When I go to "/bdd/timeoff/manage"

Then I should see "Manage Time Off Requests"



Scenario: Time Off Request List

When I go to "/bdd/timeoff/manage"

And I press "View"

Then I should see "Pending Time Off Request Details"
features/ProcessTimeOffRequest.feature
Scenario: Approve Time Off Request

When I go to "/bdd/timeoff/manage"

And I press "View"

And I press "Approve"

Then I should see "Time Off Request Approved"



Scenario: Deny Time Off Request

When I go to "/bdd/timeoff/manage"

And I press "View"

And I press "Deny"

Then I should see "Time Off Request Denied"
run behat: bin/behat
Behat Output
--- Failed scenarios:
features/ProcessTimeOffRequest.feature:6
features/ProcessTimeOffRequest.feature:10
features/ProcessTimeOffRequest.feature:15
features/ProcessTimeOffRequest.feature:21
features/SubmitTimeOffRequest.feature:6
features/SubmitTimeOffRequest.feature:10
7 scenarios (1 passed, 6 failed)
22 steps (8 passed, 6 failed, 8 skipped)
0m0.61s (14.81Mb)
Behat Output
Scenario: Time Off Request Management View Exists
When I go to “/bdd/timeoff/manage"
Then I should see "Manage Time Off Requests"
The text "Manage Time Off Requests" was not found
anywhere in the text of the current page.
These failures show us that Behat is testing
our app properly, and now we just need to
write the application logic.
Specifications
Now we write specifications for how our
application should work.
These specifications should provide the logic
to deliver the results that Behat is testing for.
bin/phpspec describe AppTimeoff
PHPSpec generates a basic spec file for us
specTimeoffSpec.php
namespace specApp;



use PhpSpecObjectBehavior;

use ProphecyArgument;



class TimeoffSpec extends ObjectBehavior

{

function it_is_initializable()

{

$this->shouldHaveType('AppTimeoff');

}

}

This default spec tells PHPSpec to expect a
class named Timeoff.
Now we add a bit more to the file so PHPSpec
will understand what this class should do.
specTimeoffSpec.php
function it_creates_timeoff_requests() {

$this->create("Name", "reason")->shouldBeString();

}



function it_loads_all_timeoff_requests() {

$this->loadAll()->shouldBeArray();

}



function it_loads_a_timeoff_request() {

$this->load("uuid")->shouldBeArray();

}



function it_loads_pending_timeoff_requests() {

$this->loadPending()->shouldBeArray();

}



function it_approves_timeoff_requests() {

$this->approve("id")->shouldReturn(true);

}



function it_denies_timeoff_requests() {

$this->deny("id")->shouldReturn(true);

}
specTimeoffSpec.php
function it_creates_timeoff_requests() {

$this->create("Name", "reason")->shouldBeString();

}



function it_loads_all_timeoff_requests() {

$this->loadAll()->shouldBeArray();

}
specTimeoffSpec.php
function it_loads_a_timeoff_request() {

$this->load("uuid")->shouldBeArray();

}



function it_loads_pending_timeoff_requests() {

$this->loadPending()->shouldBeArray();

}

specTimeoffSpec.php
function it_approves_timeoff_requests() {

$this->approve("id")->shouldReturn(true);

}



function it_denies_timeoff_requests() {

$this->deny("id")->shouldReturn(true);

}
Now we run PHPSpec once more…
Phpspec output
10 ✔ is initializable
15 ! creates timeoff requests
method AppTimeoff::create not found.
19 ! loads all timeoff requests
method AppTimeoff::loadAll not found.
23 ! loads pending timeoff requests
method AppTimeoff::loadPending not found.
27 ! approves timeoff requests
method AppTimeoff::approve not found.
31 ! denies timeoff requests
method AppTimeoff::deny not found.
Lots of failures…
But wait a second - PHPSpec prompts us!
PHPSpec output
Do you want me to create `AppTimeoff::create()` 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 files should be located.
And now, the easy part…
Implementation
Implement logic in the new Timeoff class in
the locations directed by PHPSpec
Implement each function one at a time, running
phpspec after each one.
specTimeoffSpec.php
public function create($name, $reason)

{

$uuid1 = Uuid::uuid1();

$uuid = $uuid1->toString();

DB::table('requests')->insert([

'name' => $name,

'reason' => $reason,

'uuid' => $uuid,

]);

return $uuid;

}
specTimeoffSpec.php
public function load($uuid) {

$results = DB::select('select * from requests WHERE
uuid = ?', [$uuid]);

return $results;

}
specTimeoffSpec.php
public function loadAll()

{

$results = DB::select('select * from requests');

return $results;

}
specTimeoffSpec.php
public function loadPending()

{

$results = DB::select('select * from requests WHERE
reviewed = ?', [0]);

return $results;

}
specTimeoffSpec.php
public function approve($uuid)

{

DB::update('update requests set reviewed = 1,
approved = 1 where uuid = ?', [$uuid]);

return true;

}
specTimeoffSpec.php
public function deny($uuid)

{

DB::update('update requests set reviewed = 1,
approved = 0 where uuid = ?', [$uuid]);

return true;

}
phpspec should be returning all green
Move on to implementing the front-end
behavior
Using Lumen means our view/display logic is
very simple
appHttproute.php
$app->get('/bdd/', function() use ($app) {

return "Welcome to the world of BDD";

});
appHttproute.php
$app->get('/bdd/timeoff/new/', function() use ($app) {

if(Request::has('name')) {

$to = new AppTimeoff();

$name = Request::input('name');

$reason = Request::input('reason');

$to->create($name, $reason);

return "Time off request submitted";

} else {

return view('request.new');

}

});
appHttproute.php
$app->get('/bdd/timeoff/manage/', function() use ($app) {

$to = new AppTimeoff();

if(Request::has('uuid')) {

$uuid = Request::input('uuid');

if(Request::has('process')) {

$process = Request::input('process');

if($process == 'approve') {

$to->approve($uuid);

return "Time Off Request Approved";

} else {

if($process == 'deny') {

$to->deny($uuid);

return "Time Off Request Denied";

}

}

} else {

$request = $to->load($uuid);

return view('request.manageSpecific', ['request' => $request]);

}

} else {

$requests = $to->loadAll();

return view('request.manage', ['requests' => $requests]);

}
appHttproute.php
$app->get('/bdd/timeoff/manage/', function() use ($app) {

$to = new AppTimeoff();

if(Request::has('uuid')) {

$uuid = Request::input('uuid');

if(Request::has('process')) {

$process = Request::input('process');

if($process == 'approve') {

$to->approve($uuid);

return "Time Off Request Approved";

} else {

if($process == 'deny') {

$to->deny($uuid);

return "Time Off Request Denied";

}

}
…
appHttproute.php
…

} else {

$request = $to->load($uuid);

return view('request.manageSpecific',
['request' => $request]);

}
…
appHttproute.php
…

} else {

$requests = $to->loadAll();

return view('request.manage', ['requests' =>
$requests]);

}
Our views are located in resourcesviewsrequest and
are simple HTML forms
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 confidence that the
application logic was implemented correctly.
Behat gives us confidence that the feature is
being displayed properly to users.
Running both as we refactor and add new
features will give us confidence we haven’t
broken an existing feature
Success!
Our purpose today was 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
Advanced Behat & PHPSpec
I encourage you to learn more about Behat &
phpspec. Here’s a few areas to consider…
Parallel Execution
A few approaches to running Behat in parallel
to improve it’s performance. Start with:
shvetsgroup/ParallelRunner
Behat - Reusable Actions
“I should see”, “I go to” are just steps - you can
write your own steps.
Mocking & Prophesying
Mock objects are simulated objects that
mimic the behavior of real objects
Helpful to mock very complex objects, or
objects that you don’t want to call while
testing - i.e., APIs
Prophecy is a highly opinionated PHP mocking
framework by the Phpspec team
Take a look at the sample code on Github - I
mocked a Human Resource Management
System API
Mocking with Prophecy
$this->prophet = new ProphecyProphet;
$prophecy = $this->prophet->prophesize('AppHrmsApi');
$prophecy->getUser(Argument::type('string'))-
>willReturn('name');
$prophecy->decrement('name', Argument::type('integer'))-
>willReturn(true);
$dummyApi = $prophecy->reveal();
PhantomJS
Stick around - Michelle Sanver is up next at
3:30PM in this room to discuss Behat +
PhantomJS including automated screenshots
and screenshot comparision
Two Tasks For You
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/13744
• @JoshuaSWarren
• JoshuaWarren.com

More Related Content

What's hot

Joomla security nuggets
Joomla security nuggetsJoomla security nuggets
Joomla security nuggetsguestbd1cdca
 
Introduction to Web Programming with Perl
Introduction to Web Programming with PerlIntroduction to Web Programming with Perl
Introduction to Web Programming with PerlDave Cross
 
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)James Titcumb
 
BDD to the Bone: Using Behave and Selenium to Test-Drive Web Applications
BDD to the Bone: Using Behave and Selenium to Test-Drive Web ApplicationsBDD to the Bone: Using Behave and Selenium to Test-Drive Web Applications
BDD to the Bone: Using Behave and Selenium to Test-Drive Web ApplicationsPatrick Viafore
 
Writing automation tests with python selenium behave pageobjects
Writing automation tests with python selenium behave pageobjectsWriting automation tests with python selenium behave pageobjects
Writing automation tests with python selenium behave pageobjectsLeticia Rss
 
Working Effectively With Legacy Code
Working Effectively With Legacy CodeWorking Effectively With Legacy Code
Working Effectively With Legacy Codescidept
 
Building Desktop RIAs With PHP And JavaScript
Building Desktop RIAs With PHP And JavaScriptBuilding Desktop RIAs With PHP And JavaScript
Building Desktop RIAs With PHP And JavaScriptfunkatron
 
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)James Titcumb
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy CodeRowan Merewood
 
API Technical Writing
API Technical WritingAPI Technical Writing
API Technical WritingSarah Maddox
 
Zend Studio Tips and Tricks
Zend Studio Tips and TricksZend Studio Tips and Tricks
Zend Studio Tips and TricksRoy Ganor
 
Behavior Driven Development with Cucumber
Behavior Driven Development with CucumberBehavior Driven Development with Cucumber
Behavior Driven Development with CucumberAsheesh Mehdiratta
 
BDD - Keep love alive
BDD - Keep love aliveBDD - Keep love alive
BDD - Keep love aliveRory Preddy
 
Architecture | Busy Java Developers Guide to NoSQL | Ted Neward
Architecture | Busy Java Developers Guide to NoSQL | Ted NewardArchitecture | Busy Java Developers Guide to NoSQL | Ted Neward
Architecture | Busy Java Developers Guide to NoSQL | Ted NewardJAX London
 
How To Become A Good C# Programmer
How To Become A Good C# ProgrammerHow To Become A Good C# Programmer
How To Become A Good C# ProgrammerLearnItFirst.com
 
Perl web programming
Perl web programmingPerl web programming
Perl web programmingJohnny Pork
 
Eugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryEugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryRefresh Events
 
Node.JS error handling best practices
Node.JS error handling best practicesNode.JS error handling best practices
Node.JS error handling best practicesYoni Goldberg
 

What's hot (20)

Joomla security nuggets
Joomla security nuggetsJoomla security nuggets
Joomla security nuggets
 
Introduction to Web Programming with Perl
Introduction to Web Programming with PerlIntroduction to Web Programming with Perl
Introduction to Web Programming with Perl
 
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
 
BDD to the Bone: Using Behave and Selenium to Test-Drive Web Applications
BDD to the Bone: Using Behave and Selenium to Test-Drive Web ApplicationsBDD to the Bone: Using Behave and Selenium to Test-Drive Web Applications
BDD to the Bone: Using Behave and Selenium to Test-Drive Web Applications
 
Writing automation tests with python selenium behave pageobjects
Writing automation tests with python selenium behave pageobjectsWriting automation tests with python selenium behave pageobjects
Writing automation tests with python selenium behave pageobjects
 
Working Effectively With Legacy Code
Working Effectively With Legacy CodeWorking Effectively With Legacy Code
Working Effectively With Legacy Code
 
Building Desktop RIAs With PHP And JavaScript
Building Desktop RIAs With PHP And JavaScriptBuilding Desktop RIAs With PHP And JavaScript
Building Desktop RIAs With PHP And JavaScript
 
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
API Technical Writing
API Technical WritingAPI Technical Writing
API Technical Writing
 
Zend Studio Tips and Tricks
Zend Studio Tips and TricksZend Studio Tips and Tricks
Zend Studio Tips and Tricks
 
Behavior Driven Development with Cucumber
Behavior Driven Development with CucumberBehavior Driven Development with Cucumber
Behavior Driven Development with Cucumber
 
BDD - Keep love alive
BDD - Keep love aliveBDD - Keep love alive
BDD - Keep love alive
 
DDD with Behat
DDD with BehatDDD with Behat
DDD with Behat
 
Architecture | Busy Java Developers Guide to NoSQL | Ted Neward
Architecture | Busy Java Developers Guide to NoSQL | Ted NewardArchitecture | Busy Java Developers Guide to NoSQL | Ted Neward
Architecture | Busy Java Developers Guide to NoSQL | Ted Neward
 
TDD, BDD, RSpec
TDD, BDD, RSpecTDD, BDD, RSpec
TDD, BDD, RSpec
 
How To Become A Good C# Programmer
How To Become A Good C# ProgrammerHow To Become A Good C# Programmer
How To Become A Good C# Programmer
 
Perl web programming
Perl web programmingPerl web programming
Perl web programming
 
Eugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryEugene Andruszczenko: jQuery
Eugene Andruszczenko: jQuery
 
Node.JS error handling best practices
Node.JS error handling best practicesNode.JS error handling best practices
Node.JS error handling best practices
 

Viewers also liked

Test driven development - Zombie proof your code
Test driven development - Zombie proof your codeTest driven development - Zombie proof your code
Test driven development - Zombie proof your codePascal Larocque
 
Selenium Conference 2014 -- Bangalore
Selenium Conference 2014 -- BangaloreSelenium Conference 2014 -- Bangalore
Selenium Conference 2014 -- BangalorePrasanna Kanagasabai
 
Experience Agile Programming - Kiev
Experience Agile Programming - KievExperience Agile Programming - Kiev
Experience Agile Programming - KievJohannes Brodwall
 
BDD with Behat and PHPSpec
BDD with Behat and PHPSpecBDD with Behat and PHPSpec
BDD with Behat and PHPSpecRob Ingram
 
Pair Programming, TDD and other impractical things
Pair Programming, TDD and other impractical thingsPair Programming, TDD and other impractical things
Pair Programming, TDD and other impractical thingsMarcello Duarte
 
Emergent design with phpspec
Emergent design with phpspecEmergent design with phpspec
Emergent design with phpspecMarcello Duarte
 
Web Acceptance Testing with Behat
Web Acceptance Testing with BehatWeb Acceptance Testing with Behat
Web Acceptance Testing with BehatFabian Kiss
 
Introduction to Unit Testing with PHPUnit
Introduction to Unit Testing with PHPUnitIntroduction to Unit Testing with PHPUnit
Introduction to Unit Testing with PHPUnitMichelangelo van Dam
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesMarcello Duarte
 
How to Automate API Testing
How to Automate API TestingHow to Automate API Testing
How to Automate API TestingBruno Pedro
 
Scaling Agile at Spotify (representation)
Scaling Agile at Spotify (representation)Scaling Agile at Spotify (representation)
Scaling Agile at Spotify (representation)Vlad Mysla
 
FARMACOLOGÍA - MEDICAMENTOS BÁSICOS EN ODONTOLOGÍA
FARMACOLOGÍA - MEDICAMENTOS BÁSICOS EN ODONTOLOGÍAFARMACOLOGÍA - MEDICAMENTOS BÁSICOS EN ODONTOLOGÍA
FARMACOLOGÍA - MEDICAMENTOS BÁSICOS EN ODONTOLOGÍAdedy jhan carlos
 

Viewers also liked (20)

SpecBDD in PHP
SpecBDD in PHPSpecBDD in PHP
SpecBDD in PHP
 
Test driven development - Zombie proof your code
Test driven development - Zombie proof your codeTest driven development - Zombie proof your code
Test driven development - Zombie proof your code
 
Automated tests to a REST API
Automated tests to a REST APIAutomated tests to a REST API
Automated tests to a REST API
 
Hexagonal symfony
Hexagonal symfonyHexagonal symfony
Hexagonal symfony
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
Selenium Conference 2014 -- Bangalore
Selenium Conference 2014 -- BangaloreSelenium Conference 2014 -- Bangalore
Selenium Conference 2014 -- Bangalore
 
Javascript Testing
Javascript TestingJavascript Testing
Javascript Testing
 
Experience Agile Programming - Kiev
Experience Agile Programming - KievExperience Agile Programming - Kiev
Experience Agile Programming - Kiev
 
BDD with Behat and PHPSpec
BDD with Behat and PHPSpecBDD with Behat and PHPSpec
BDD with Behat and PHPSpec
 
IronSAP
IronSAP IronSAP
IronSAP
 
Pair Programming, TDD and other impractical things
Pair Programming, TDD and other impractical thingsPair Programming, TDD and other impractical things
Pair Programming, TDD and other impractical things
 
Emergent design with phpspec
Emergent design with phpspecEmergent design with phpspec
Emergent design with phpspec
 
Web Acceptance Testing with Behat
Web Acceptance Testing with BehatWeb Acceptance Testing with Behat
Web Acceptance Testing with Behat
 
BDD for APIs
BDD for APIsBDD for APIs
BDD for APIs
 
Introduction to Unit Testing with PHPUnit
Introduction to Unit Testing with PHPUnitIntroduction to Unit Testing with PHPUnit
Introduction to Unit Testing with PHPUnit
 
PhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examplesPhpSpec 2.0 ilustrated by examples
PhpSpec 2.0 ilustrated by examples
 
Barely Enough Design
Barely Enough DesignBarely Enough Design
Barely Enough Design
 
How to Automate API Testing
How to Automate API TestingHow to Automate API Testing
How to Automate API Testing
 
Scaling Agile at Spotify (representation)
Scaling Agile at Spotify (representation)Scaling Agile at Spotify (representation)
Scaling Agile at Spotify (representation)
 
FARMACOLOGÍA - MEDICAMENTOS BÁSICOS EN ODONTOLOGÍA
FARMACOLOGÍA - MEDICAMENTOS BÁSICOS EN ODONTOLOGÍAFARMACOLOGÍA - MEDICAMENTOS BÁSICOS EN ODONTOLOGÍA
FARMACOLOGÍA - MEDICAMENTOS BÁSICOS EN ODONTOLOGÍA
 

Similar to PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)

Behavior & Specification Driven Development in PHP - #OpenWest
Behavior & Specification Driven Development in PHP - #OpenWestBehavior & Specification Driven Development in PHP - #OpenWest
Behavior & Specification Driven Development in PHP - #OpenWestJoshua Warren
 
Behat - Drupal South 2018
Behat  - Drupal South 2018Behat  - Drupal South 2018
Behat - Drupal South 2018Berend de Boer
 
Php[tek] 2016 - BDD with Behat for Beginners
Php[tek] 2016 - BDD with Behat for BeginnersPhp[tek] 2016 - BDD with Behat for Beginners
Php[tek] 2016 - BDD with Behat for BeginnersAdam Englander
 
BDD with Behat and Symfony2
BDD with Behat and Symfony2BDD with Behat and Symfony2
BDD with Behat and Symfony2katalisha
 
Zend con 2016 bdd with behat for beginners
Zend con 2016   bdd with behat for beginnersZend con 2016   bdd with behat for beginners
Zend con 2016 bdd with behat for beginnersAdam Englander
 
Functional testing with behat
Functional testing with behatFunctional testing with behat
Functional testing with behatTahmina Khatoon
 
Enterprise PHP (PHP London Conference 2008)
Enterprise PHP (PHP London Conference 2008)Enterprise PHP (PHP London Conference 2008)
Enterprise PHP (PHP London Conference 2008)Ivo Jansch
 
PHPConf.asia 2016 - BDD with Behat for Beginners
PHPConf.asia 2016 - BDD with Behat for BeginnersPHPConf.asia 2016 - BDD with Behat for Beginners
PHPConf.asia 2016 - BDD with Behat for BeginnersAdam Englander
 
Behat - human-readable automated testing
Behat - human-readable automated testingBehat - human-readable automated testing
Behat - human-readable automated testingnyccamp
 
Php Development Stack
Php Development StackPhp Development Stack
Php Development Stackshah_neeraj
 
[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Behat per Drupal: test automatici e molto di più[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Behat per Drupal: test automatici e molto di piùDrupalDay
 
Apache HTTPD 2.4 - GWO2016
Apache HTTPD 2.4 - GWO2016Apache HTTPD 2.4 - GWO2016
Apache HTTPD 2.4 - GWO2016Jim Jagielski
 
BDD with SpecFlow and Selenium
BDD with SpecFlow and SeleniumBDD with SpecFlow and Selenium
BDD with SpecFlow and SeleniumLiraz Shay
 
Effizientere WordPress-Plugin-Entwicklung mit Softwaretests
Effizientere WordPress-Plugin-Entwicklung mit SoftwaretestsEffizientere WordPress-Plugin-Entwicklung mit Softwaretests
Effizientere WordPress-Plugin-Entwicklung mit SoftwaretestsDECK36
 
Behaviour Driven Development
Behaviour Driven DevelopmentBehaviour Driven Development
Behaviour Driven DevelopmentAndy Kelk
 

Similar to PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition) (20)

Behavior & Specification Driven Development in PHP - #OpenWest
Behavior & Specification Driven Development in PHP - #OpenWestBehavior & Specification Driven Development in PHP - #OpenWest
Behavior & Specification Driven Development in PHP - #OpenWest
 
Behat - Drupal South 2018
Behat  - Drupal South 2018Behat  - Drupal South 2018
Behat - Drupal South 2018
 
Php[tek] 2016 - BDD with Behat for Beginners
Php[tek] 2016 - BDD with Behat for BeginnersPhp[tek] 2016 - BDD with Behat for Beginners
Php[tek] 2016 - BDD with Behat for Beginners
 
BDD with Behat and Symfony2
BDD with Behat and Symfony2BDD with Behat and Symfony2
BDD with Behat and Symfony2
 
Zend con 2016 bdd with behat for beginners
Zend con 2016   bdd with behat for beginnersZend con 2016   bdd with behat for beginners
Zend con 2016 bdd with behat for beginners
 
Functional testing with behat
Functional testing with behatFunctional testing with behat
Functional testing with behat
 
Improving qa on php projects
Improving qa on php projectsImproving qa on php projects
Improving qa on php projects
 
Enterprise PHP (PHP London Conference 2008)
Enterprise PHP (PHP London Conference 2008)Enterprise PHP (PHP London Conference 2008)
Enterprise PHP (PHP London Conference 2008)
 
PHPConf.asia 2016 - BDD with Behat for Beginners
PHPConf.asia 2016 - BDD with Behat for BeginnersPHPConf.asia 2016 - BDD with Behat for Beginners
PHPConf.asia 2016 - BDD with Behat for Beginners
 
Cqrs api
Cqrs apiCqrs api
Cqrs api
 
Behat - human-readable automated testing
Behat - human-readable automated testingBehat - human-readable automated testing
Behat - human-readable automated testing
 
PHP
PHPPHP
PHP
 
Php Development Stack
Php Development StackPhp Development Stack
Php Development Stack
 
Php Development Stack
Php Development StackPhp Development Stack
Php Development Stack
 
[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Behat per Drupal: test automatici e molto di più[drupalday2017] - Behat per Drupal: test automatici e molto di più
[drupalday2017] - Behat per Drupal: test automatici e molto di più
 
Apache httpd v2.4
Apache httpd v2.4Apache httpd v2.4
Apache httpd v2.4
 
Apache HTTPD 2.4 - GWO2016
Apache HTTPD 2.4 - GWO2016Apache HTTPD 2.4 - GWO2016
Apache HTTPD 2.4 - GWO2016
 
BDD with SpecFlow and Selenium
BDD with SpecFlow and SeleniumBDD with SpecFlow and Selenium
BDD with SpecFlow and Selenium
 
Effizientere WordPress-Plugin-Entwicklung mit Softwaretests
Effizientere WordPress-Plugin-Entwicklung mit SoftwaretestsEffizientere WordPress-Plugin-Entwicklung mit Softwaretests
Effizientere WordPress-Plugin-Entwicklung mit Softwaretests
 
Behaviour Driven Development
Behaviour Driven DevelopmentBehaviour Driven Development
Behaviour Driven Development
 

More from Joshua Warren

Enhancing the Customer Experience with Chatbots
Enhancing the Customer Experience with ChatbotsEnhancing the Customer Experience with Chatbots
Enhancing the Customer Experience with ChatbotsJoshua Warren
 
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 MagentoJoshua Warren
 
Its Just Commerce - IRCE 2018
Its Just Commerce - IRCE 2018Its Just Commerce - IRCE 2018
Its Just Commerce - IRCE 2018Joshua Warren
 
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 SummitJoshua Warren
 
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 DinosaursJoshua Warren
 
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 ExpansionJoshua Warren
 
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 DynamicsJoshua Warren
 
What's New With Magento 2?
What's New With Magento 2?What's New With Magento 2?
What's New With Magento 2?Joshua Warren
 
Magento 2 Performance: Every Second Counts
Magento 2 Performance: Every Second CountsMagento 2 Performance: Every Second Counts
Magento 2 Performance: Every Second CountsJoshua Warren
 
Magento 2 Development for PHP Developers
Magento 2 Development for PHP DevelopersMagento 2 Development for PHP Developers
Magento 2 Development for PHP DevelopersJoshua Warren
 
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-AllJoshua Warren
 
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 2016Joshua Warren
 
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] 2015Joshua Warren
 
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] 2015Joshua Warren
 
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 EditionJoshua Warren
 
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 2015Joshua Warren
 
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 YouJoshua Warren
 
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 2015Joshua Warren
 
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 - #OpenWestJoshua Warren
 
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 - #OpenWestJoshua Warren
 

More from 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
 
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
 
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
 

Recently uploaded

Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelDeepika Singh
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
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 educationjfdjdjcjdnsjd
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
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 Takeoffsammart93
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 

Recently uploaded (20)

Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
+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...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
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
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
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
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 

PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)