SlideShare a Scribd company logo
1 of 66
Download to read offline
Lights and shadows of BDD in Sylius
and probably other companies as well
Mateusz Zalewski
2
2
3 https://www.freepik.com/icon/black-hole_3061985
3
4
?
https://www.freepik.com/icon/black-hole_3061985
4
5
5
BDD IS THE ULTIMATE THEORY
OF DEVELOPMENT PROCESSES
(KIND OF)
6 https://www.freepik.com/icon/black-hole_3061985
6
BDD
7 https://www.freepik.com/icon/black-hole_3061985
7
BDD
$$$
MISCONCEPTIONS
8
Better TDD
9
TDD on steroids
BDD tests
TDD with
different naming
BDD is UI testing
10
BDD is a way for software teams to work that closes the gap
between business people and technical people
https://cucumber.io/docs/bdd/
Behaviour-driven development is an “outside-in” methodology. It starts
at the outside by identifying business outcomes, and then drills
down into the feature set that will achieve those outcomes.
https://dannorth.net/whats-in-a-story/
BDD is a process designed to aid the management and the delivery of software
development projects by improving communication between engineers
and business professionals. https://inviqa.com/blog/bdd-guide
11
BDD is too complex at first sight
TDD is conceptually simple
12
ClassRemapping=PecanGame.PecanSeqAct_AttachXenoToTether ->
PecanGame.PecanSeqAct_AttachPawnToTeather
ClassRemapping=PecanGame.PecanSeqAct_AttachXenoToTether ->
PecanGame.PecanSeqAct_AttachPawnToTether
https://www.reddit.com/r/Games/comments/8yp1um/modder_fixes_alien_colonial_marines_by_fixing_a/
13
RED
14
GREEN
REFACTOR
15
The goal of BDD is a
SMART GOAL
16
The goal of BDD is a
SMART GOAL
specific measurable attainable relevant time-bound
https://inviqa.com/blog/bdd-guide
Test-Driven Development focused on WHY
17 https://www.toptal.com/freelance/your-boss-won-t-appreciate-tdd-try-bdd
BDD (over)simplified:
~=
18
BDD is too natural
19
20
WHERE IS THE CODE? 🤷
21
22
23
24
25
I’m here to write code, not tales 😡
BAD EXAMPLES
26
27
28 https://docs.behat.org/en/latest/user_guide/writing_scenarios.html
29
BEHAT
PHPUNIT
30
It’s hard to start
31
32
33
34
35
<?php
declare(strict_types=1);
namespace specSyliusBundleCoreBundleEventListener;
use …
final class CustomerDefaultAddressListenerSpec extends ObjectBehavior
{
function it_adds_the_address_as_default_to_the_customer_on_pre_create_resource_controller_event(
ResourceControllerEvent $event,
AddressInterface $address,
CustomerInterface $customer,
): void {
$event->getSubject()->willReturn($address);
$address->getCustomer()->willReturn($customer);
$customer->getDefaultAddress()->willReturn(null);
$customer->setDefaultAddress($address)->shouldBeCalled();
$this->preCreate($event);
}
}
36
<?php
declare(strict_types=1);
namespace specSyliusBundleCoreBundleEventListener;
use …
final class CustomerDefaultAddressListenerSpec extends ObjectBehavior
{
function it_adds_the_address_as_default_to_the_customer_on_pre_create_resource_controller_event(
ResourceControllerEvent $event,
AddressInterface $address,
CustomerInterface $customer,
): void {
$event->getSubject()->willReturn($address);
$address->getCustomer()->willReturn($customer);
$customer->getDefaultAddress()->willReturn(null);
$customer->setDefaultAddress($address)->shouldBeCalled();
$this->preCreate($event);
}
}
37
Scenario: Having cart maintained after logging in
When I add "Stark T-Shirt" product to the cart
And I log in as "robb@stark.com" with "KingInTheNorth" password
And I see the summary of my cart
Then there should be one item in my cart
And this item should have name "Stark T-Shirt"
38
/**
* @Given /^I (?:add|added) ("[^"]+" product) to the (cart)$/
*/
public function iAddProductToTheCart(ProductInterface $product): void
{
$this->productShowPage->open(['slug' => $product->getSlug()]);
$this->productShowPage->addToCart();
$this->sharedStorage->set('product', $product);
}
39
/**
* @Given /^I (?:add|added) ("[^"]+" product) to the (cart)$/
*/
public function iAddProductToTheCart(ProductInterface $product): void
{
$this->productShowPage->open(['slug' => $product->getSlug()]);
$this->productShowPage->addToCart();
$this->sharedStorage->set('product', $product);
}
JUST DO IT!
40
BUT REMEMBER...
/**
* @Given /^I (?:add|added) ("[^"]+" product) to the (cart)$/
*/
public function iAddProductToTheCart(ProductInterface $product): void
{
$this->productShowPage->open(['slug' => $product->getSlug()]);
$this->productShowPage->addToCart();
$this->sharedStorage->set('product', $product);
}
/**
* @Transform /^"([^"]+)" product(?:|s)$/
*/
public function getProductByName(string $productName): ProductInterface
{
return $this->productRepository->findOneByName($productName, $this->locale);
}
41
BUT REMEMBER...
/**
* @Given /^I (?:add|added) ("[^"]+" product) to the (cart)$/
*/
public function iAddProductToTheCart(ProductInterface $product): void
{
$this->productShowPage->open(['slug' => $product->getSlug()]);
$this->productShowPage->addToCart();
$this->sharedStorage->set('product', $product);
}
/**
* @Transform /^"([^"]+)" product(?:|s)$/
*/
public function getProductByName(string $productName): ProductInterface
{
return $this->productRepository->findOneByName($productName, $this->locale);
}
class ShowPage extends SymfonyPage implements ShowPageInterface
{
public function getRouteName(): string
{
return 'sylius_shop_product_show';
}
public function addToCart(): void
{
$this->getElement('add_to_cart_button')->click();
$this->waitForCartSummary();
}
}
42
BUT REMEMBER...
/**
* @Given /^I (?:add|added) ("[^"]+" product) to the (cart)$/
*/
public function iAddProductToTheCart(ProductInterface $product): void
{
$this->productShowPage->open(['slug' => $product->getSlug()]);
$this->productShowPage->addToCart();
$this->sharedStorage->set('product', $product);
}
/**
* @Transform /^"([^"]+)" product(?:|s)$/
*/
public function getProductByName(string $productName): ProductInterface
{
return $this->productRepository->findOneByName($productName, $this->locale);
}
class ShowPage extends SymfonyPage implements ShowPageInterface
{
public function getRouteName(): string
{
return 'sylius_shop_product_show';
}
public function addToCart(): void
{
$this->getElement('add_to_cart_button')->click();
$this->waitForCartSummary();
}
}
class SharedStorage implements SharedStorageI
{
private array $clipboard = [];
private ?string $latestKey = null;
/**
* @Given /^I (?:add|added) ("[^"]+" product) to the (cart)$/
*/
public function iAddProductToTheCart(ProductInterface $product): void
{
$this->productShowPage->open(['slug' => $product->getSlug()]);
$this->productShowPage->addToCart();
$this->sharedStorage->set('product', $product);
}
/**
* @Transform /^"([^"]+)" product(?:|s)$/
*/
public function getProductByName(string $productName): ProductInterface
{
return $this->productRepository->findOneByName($productName, $this->locale);
}
class ShowPage extends SymfonyPage implements ShowPageInterface
{
public function getRouteName(): string
{
return 'sylius_shop_product_show';
}
public function addToCart(): void
{
$this->getElement('add_to_cart_button')->click();
$this->waitForCartSummary();
}
}
class SharedStorage implements SharedStorageI
{
private array $clipboard = [];
private ?string $latestKey = null;
43
44
45
46
It’s hard to start
And it’s ok
47
Probably not for every project
48
49
50
But I do not
like PHPSpec...
51
BDD IS NOT ABOUT THE SPECIFIC TOOL
52
So it seems it’s not so cool...
53
So it seems it’s not so cool...
54
IT IS!
SPEED UP
THE DEVELOPMENT
55
56
22
24
26
28
30
1 2 3
with TDD no TDD
http://codemanship.co.uk/slow_and_dirty_with_callouts.pdf
SPEED UP
THE DEVELOPMENT
DELIVERING
RELIABLE VALUE
57
58
BOTH TECHNICALLY AND BUSINESSLY
59
$ UNDERSTANDING
60
COGNITIVE DIVERSITY
61
LIVING DOCUMENTATION
61
62
SAFETY + NO REGRESSION
63
COEXIST WITH OTHER AGILE
METHODOLOGIES
CODING EXPERIENCE
64
Zales0123
@mpzalewski
mpzalewski.com
65
Thank you
@CommerceWeavers @Sylius @mpzalewski

More Related Content

What's hot

A testing strategy for hexagonal applications
A testing strategy for hexagonal applicationsA testing strategy for hexagonal applications
A testing strategy for hexagonal applications
Matthias Noback
 

What's hot (20)

Fed-Batch fermentation for the Production of penicillin G from Penicillium Ch...
Fed-Batch fermentation for the Production of penicillin G from Penicillium Ch...Fed-Batch fermentation for the Production of penicillin G from Penicillium Ch...
Fed-Batch fermentation for the Production of penicillin G from Penicillium Ch...
 
LINEログインの最新アップデートとアプリ連携ウォークスルー
LINEログインの最新アップデートとアプリ連携ウォークスルーLINEログインの最新アップデートとアプリ連携ウォークスルー
LINEログインの最新アップデートとアプリ連携ウォークスルー
 
RedisConf18 - Introducing RediSearch Aggregations
RedisConf18 - Introducing RediSearch AggregationsRedisConf18 - Introducing RediSearch Aggregations
RedisConf18 - Introducing RediSearch Aggregations
 
Food Microbiology (CHEESE AND KEFIR)
Food Microbiology (CHEESE AND KEFIR)Food Microbiology (CHEESE AND KEFIR)
Food Microbiology (CHEESE AND KEFIR)
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Action Jackson! Effective JSON processing in Spring Boot Applications
Action Jackson! Effective JSON processing in Spring Boot ApplicationsAction Jackson! Effective JSON processing in Spring Boot Applications
Action Jackson! Effective JSON processing in Spring Boot Applications
 
From ActiveRecord to EventSourcing
From ActiveRecord to EventSourcingFrom ActiveRecord to EventSourcing
From ActiveRecord to EventSourcing
 
20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POP20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POP
 
Resilient microservices
Resilient microservicesResilient microservices
Resilient microservices
 
Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표Overlapped IO와 IOCP 조사 발표
Overlapped IO와 IOCP 조사 발표
 
Dependency injection presentation
Dependency injection presentationDependency injection presentation
Dependency injection presentation
 
Web assembly 맛보기
Web assembly 맛보기Web assembly 맛보기
Web assembly 맛보기
 
Event-driven architecture, the easy way.pdf
Event-driven architecture, the easy way.pdfEvent-driven architecture, the easy way.pdf
Event-driven architecture, the easy way.pdf
 
C++과 Lua script연동
C++과 Lua script연동C++과 Lua script연동
C++과 Lua script연동
 
FEVR - Micro Frontend
FEVR - Micro FrontendFEVR - Micro Frontend
FEVR - Micro Frontend
 
User stories for BAs: overview and tips
User stories for BAs: overview and tipsUser stories for BAs: overview and tips
User stories for BAs: overview and tips
 
A testing strategy for hexagonal applications
A testing strategy for hexagonal applicationsA testing strategy for hexagonal applications
A testing strategy for hexagonal applications
 
Deploying a Low-Latency Multiplayer Game Globally: Loadout
Deploying a Low-Latency Multiplayer Game Globally: Loadout Deploying a Low-Latency Multiplayer Game Globally: Loadout
Deploying a Low-Latency Multiplayer Game Globally: Loadout
 
Configuration As Code - Adoption of the Job DSL Plugin at Netflix
Configuration As Code - Adoption of the Job DSL Plugin at NetflixConfiguration As Code - Adoption of the Job DSL Plugin at Netflix
Configuration As Code - Adoption of the Job DSL Plugin at Netflix
 
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
 

Similar to [ForumPHP 2023] Lights and shadows of BDD in Sylius (and probably other companies as well)

Knockout.js presentation
Knockout.js presentationKnockout.js presentation
Knockout.js presentation
Scott Messinger
 

Similar to [ForumPHP 2023] Lights and shadows of BDD in Sylius (and probably other companies as well) (20)

[PHPCon 2023] Blaski i cienie BDD
[PHPCon 2023] Blaski i cienie BDD[PHPCon 2023] Blaski i cienie BDD
[PHPCon 2023] Blaski i cienie BDD
 
BDD Revolution - or how we came back from hell
BDD Revolution - or how we came back from hellBDD Revolution - or how we came back from hell
BDD Revolution - or how we came back from hell
 
BDD revolution - or how we came back from hell
BDD revolution - or how we came back from hellBDD revolution - or how we came back from hell
BDD revolution - or how we came back from hell
 
Design Patterns for JavaScript Web Apps - JavaScript Conference 2012 - OPITZ ...
Design Patterns for JavaScript Web Apps - JavaScript Conference 2012 - OPITZ ...Design Patterns for JavaScript Web Apps - JavaScript Conference 2012 - OPITZ ...
Design Patterns for JavaScript Web Apps - JavaScript Conference 2012 - OPITZ ...
 
Rapid HTML Prototyping with Bootstrap - Chris Griffith
Rapid HTML Prototyping with Bootstrap - Chris GriffithRapid HTML Prototyping with Bootstrap - Chris Griffith
Rapid HTML Prototyping with Bootstrap - Chris Griffith
 
Knockout.js presentation
Knockout.js presentationKnockout.js presentation
Knockout.js presentation
 
Test upload
Test uploadTest upload
Test upload
 
Workflow Essentials for Web Development
Workflow Essentials for Web DevelopmentWorkflow Essentials for Web Development
Workflow Essentials for Web Development
 
AppForum 2014 Boost Hybrid App Performance
AppForum 2014 Boost Hybrid App PerformanceAppForum 2014 Boost Hybrid App Performance
AppForum 2014 Boost Hybrid App Performance
 
A (very) opinionated guide to MSBuild and Project Files
A (very) opinionated guide to MSBuild and Project FilesA (very) opinionated guide to MSBuild and Project Files
A (very) opinionated guide to MSBuild and Project Files
 
Citrix Internals: Tracing, Debugging & Troubleshooting
Citrix Internals: Tracing, Debugging & TroubleshootingCitrix Internals: Tracing, Debugging & Troubleshooting
Citrix Internals: Tracing, Debugging & Troubleshooting
 
WordPress Accessibility: WordCamp Chicago
WordPress Accessibility: WordCamp ChicagoWordPress Accessibility: WordCamp Chicago
WordPress Accessibility: WordCamp Chicago
 
Write once, ship multiple times
Write once, ship multiple timesWrite once, ship multiple times
Write once, ship multiple times
 
Demystifying The Solid Works Api
Demystifying The Solid Works ApiDemystifying The Solid Works Api
Demystifying The Solid Works Api
 
Create and Maintain COMPLEX HIERARCHIES easily
Create and Maintain COMPLEX HIERARCHIES easilyCreate and Maintain COMPLEX HIERARCHIES easily
Create and Maintain COMPLEX HIERARCHIES easily
 
GDG Mediterranean Dev Fest Code lab #DevFestMed15 da android ad android wear ...
GDG Mediterranean Dev Fest Code lab #DevFestMed15 da android ad android wear ...GDG Mediterranean Dev Fest Code lab #DevFestMed15 da android ad android wear ...
GDG Mediterranean Dev Fest Code lab #DevFestMed15 da android ad android wear ...
 
Polytechnic speaker deck oluwadamilare
Polytechnic speaker deck oluwadamilarePolytechnic speaker deck oluwadamilare
Polytechnic speaker deck oluwadamilare
 
Polytechnic speaker deck oluwadamilare
Polytechnic speaker deck oluwadamilarePolytechnic speaker deck oluwadamilare
Polytechnic speaker deck oluwadamilare
 
Dropwizard Restful 微服務 (microservice) 初探 - JCConf TW 2014
Dropwizard Restful 微服務 (microservice) 初探 - JCConf TW 2014Dropwizard Restful 微服務 (microservice) 初探 - JCConf TW 2014
Dropwizard Restful 微服務 (microservice) 初探 - JCConf TW 2014
 
One Size Fits All
One Size Fits AllOne Size Fits All
One Size Fits All
 

More from Mateusz Zalewski

More from Mateusz Zalewski (7)

[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...
[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...
[PHPCon 2023] “Kto to pisał?!... a, to ja.”, czyli sposoby żeby znienawidzić ...
 
[PHPers Summit 2023] Business logic testing
[PHPers Summit 2023] Business logic testing[PHPers Summit 2023] Business logic testing
[PHPers Summit 2023] Business logic testing
 
"Kto to pisał?!... A, to ja.", czyli sposoby, żeby znienawidzić siebie z prze...
"Kto to pisał?!... A, to ja.", czyli sposoby, żeby znienawidzić siebie z prze..."Kto to pisał?!... A, to ja.", czyli sposoby, żeby znienawidzić siebie z prze...
"Kto to pisał?!... A, to ja.", czyli sposoby, żeby znienawidzić siebie z prze...
 
Confoo 2023 - BDD revolution, or how we came back from hell
Confoo 2023 - BDD revolution, or how we came back from hellConfoo 2023 - BDD revolution, or how we came back from hell
Confoo 2023 - BDD revolution, or how we came back from hell
 
Confoo 2023 - Business logic testing with Behat, Twig and Api Platform
Confoo 2023 - Business logic testing with Behat, Twig and Api PlatformConfoo 2023 - Business logic testing with Behat, Twig and Api Platform
Confoo 2023 - Business logic testing with Behat, Twig and Api Platform
 
What is Sylius and why should you know it?
What is Sylius and why should you know it?What is Sylius and why should you know it?
What is Sylius and why should you know it?
 
Why you should be doing BDD
Why you should be doing BDDWhy you should be doing BDD
Why you should be doing BDD
 

Recently uploaded

Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
Lisi Hocke
 

Recently uploaded (20)

Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
 
WSO2Con2024 - Software Delivery in Hybrid Environments
WSO2Con2024 - Software Delivery in Hybrid EnvironmentsWSO2Con2024 - Software Delivery in Hybrid Environments
WSO2Con2024 - Software Delivery in Hybrid Environments
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
 
WSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security ProgramWSO2CON 2024 - How to Run a Security Program
WSO2CON 2024 - How to Run a Security Program
 
WSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - KanchanaWSO2Con2024 - Hello Choreo Presentation - Kanchana
WSO2Con2024 - Hello Choreo Presentation - Kanchana
 
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
WSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in Uganda
 
Novo Nordisk: When Knowledge Graphs meet LLMs
Novo Nordisk: When Knowledge Graphs meet LLMsNovo Nordisk: When Knowledge Graphs meet LLMs
Novo Nordisk: When Knowledge Graphs meet LLMs
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
WSO2Con2024 - Unleashing the Financial Potential of 13 Million People
WSO2Con2024 - Unleashing the Financial Potential of 13 Million PeopleWSO2Con2024 - Unleashing the Financial Potential of 13 Million People
WSO2Con2024 - Unleashing the Financial Potential of 13 Million People
 
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
 
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
Team Transformation Tactics for Holistic Testing and Quality (NewCrafts Paris...
 
WSO2Con2024 - Low-Code Integration Tooling
WSO2Con2024 - Low-Code Integration ToolingWSO2Con2024 - Low-Code Integration Tooling
WSO2Con2024 - Low-Code Integration Tooling
 
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdfAzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public AdministrationWSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
 
WSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
WSO2CON2024 - Why Should You Consider Ballerina for Your Next IntegrationWSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
WSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
 
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
WSO2CON 2024 - Unlocking the Identity: Embracing CIAM 2.0 for a Competitive A...
 

[ForumPHP 2023] Lights and shadows of BDD in Sylius (and probably other companies as well)