SlideShare a Scribd company logo
MULTIPLAYER
GAME TESTING IN
ACTIONS
Yevhen Rudiev
• QA Automation Lead at
GamePoint
• 7 years experience in IT
• 4 years experience in Automated
Testing
• Founder of Game Unit Lab
organization
GAMES
GAMES
MULTIPLAYER
GAME
SERVER
DB
DESKTOP
CLIENT
WEB
CLIENT
MOBILE
CLIENT
PAYMENTPLATFORM
DB DB
ENTERPRIS
E
SERVER
DB
DESKTOP
CLIENT
WEB
CLIENT
MOBILE
CLIENT
PAYMENTPLATFORM
DB DB
CLIENTS
CLIENTS
CLIENTS
MAIN FOCUSES
• Interesting
• Easy to play
• Fast
• Beautiful
• Stable
• Synchronized
GAME
SERVER
DB
DESKTOP
CLIENT
WEB
CLIENT
MOBILE
CLIENT
PAYMENTPLATFORM
DB DB
MANUAL
END2END
SYSTEM
UNIT
UNIT TESTS
LEGACY CODE
REFACTORING
REFACTORING
SYSTEM TESTS
GAME SERVER
GAME
SERVER
CLIENT CLIENT
CLIENT
CLIENT
CLIENT
CLIENT
CLIENT CLIENT
DIFFERENCE
ORDINARY BACK-END GAME SERVER
VS
ENTERPRISE
SERVER
CLIENT
REST API
COMMUNICATION
GAME
SERVER
CLIENT
SOCKET API
COMMUNICATION
SOCKET
GAME
SERVER
CLIENT
SOCKET API
REST API
SOCKET
OWN TOOLS
FUNCTIONAL TESTS
GAME
SERVER
DB
CLIENT
FUNCTIONAL TESTS
GAME
SERVER
DB
TEST
FUNCTIONAL TESTS
SINGLEPLAYER
GAME
SERVER
DB
TEST
SINGLEPLAYER FLOW
PLAYER
public class Player
{
public int Id {get; set;}
public string Name {get; set;}
public string Password {get; set;}
private SocketClient Client {get;}
public void Login()
{
Client.Send(new Message(Protocol.C_LOGIN, this.Id, this.Password));
Client.MessageReceived(Protocol.S_LOGIN_OK);
}
}
PLAYER
[Test]
public void PlayerSetStatus_Away_Positive()
{
Given().PlayerLoggedIn();
When().Message(new Message(Protocol.C_SET_PERSONAL_MESSAGE, Status.Away))
.WasSent();
Then().MessageWithConditionReceived(Protocol.S_SET_PERSONAL_MESSAGE,
msg => msg.Value == Status.Away)
.DBEntityIsRecorded(entity => entity.PlayerId == Context.Current.Player.Id &&
entity.Status == Status.Away.ToString());
}
SINGLEPLAYER
MULTIPLAYER
GAME
SERVER
DB
TEST
MULTIPLAYER FLOW
PLAYER
PLAYER
[Test]
public void OpponentSetStatus_Playing_Positive_PlayerReceivedOpponentStatus()
{
Given().Opponents(1)
.OpponentLoggedIn(Context.Current.Opponents[0])
.PlayerLoggedIn();
When().Message(new Message(Protocol.C_SET_PERSONAL_MESSAGE, Status.Playing))
.WasSentBy(Context.Current.Opponents[0]);
Then().MessageWithConditionReceivedBy(Context.Current.Player,
Protocol.S_SET_PERSONAL_MESSAGE,
msg => msg.Value == Status.Playing.ToString());
}
MULTIPLAYER
GAME
SERVER
DB
TEST
SYNCHRONIZATION
PLAYER
PLAYER
ADMIN’S TESTS
GAME
SERVER
DB
TEST
ADMIN FLOW
PLAYER
ADMIN
GAME
SERVER
DB
TEST
ADMIN FLOW
PLAYER
PLAYER
ADMIN
[Test]
public void AdminBanPlayer_Success()
{
Given().PlayerIsAdmin()
.Opponents(1)
.OpponentLoggedIn(Context.Current.Opponents[0])
.PlayerLoggedIn();
When().Message(new Message(Protocol.C_BAN, Context.Current.Opponents[0].Id, “Reason: You was bad!”))
.WasSentBy(Context.Current.Player);
Then().MessageWithConditionReceivedBy(Context.Current.Opponents[0],
Protocol.S_BAN, msg => msg.Value == “Reason: You was bad!”)
.DBEntityIsRecorded(entity => entity.PlayerId == Context.Current.Opponents[0].Id &&
entity.Status == Status.Banned, entity.Reason == “Reason: You was bad!”);
}
ADMIN
DEPENDENT FLOWS
PLAYER
LOGIN
SEARCHING FOR A
OPPONENT
OPPONENT
LOGIN
ENTER INTO A
GAME
PLAY GAME
SEARCHING FOR A
OPPONENT
DEPENDENT FLOWS
PLAY AGAIN
ENTER INTO A
GAME
END GAME
LOSE
PLAY GAME
WIN
FEATURE BASED TESTS
[Test]
public void ClassicGame_PositiveScenario()
{
Given().Opponents(1)
.OpponentLoggedIn(Context.Current.Opponents[0])
.PlayerLoggedIn();
Feature<ClassicModeGame>()
.PlayerEntersToGame_Success(Context.Current.Player)
.PlayerEntersToGame_Success(Context.Current.Opponents[0])
.TwoPlayersAreReady_GameIsStarted()
.PlayerMakeWrongTurn_ScoreWasDescreased(Context.Current.Player)
.PlayerMakeGoodTurn_ScoreWasIncreased(Context.Current.Opponents[0])
.GameTimeWasFinished_ResultsWereReceived();
}
FEATURE BASED TESTS
GAME
SERVER
TEST
PARALLEL PROCESSING
P
P
TEST
P
P
TEST
P
TEST
P
TEST
P
P
TEST
P P
TEST
P P
A
CLIENT
CLIENT
DIFFERENCE
• Technologies
DIFFERENCE
DIFFERENCE
DIFFERENCE
• Technologies
• Test Frameworks
TEST FRAMEWORKS
TEST FRAMEWORKS
TEST FRAMEWORKS
TEST FRAMEWORKS
PUPPETRY
https://www.youtube.com/watch?v=miO5-jmOZPc
PUPPETRY
• Click
• SendKeys
• DragTo
• Swipe
• GetComponent
• GetCoordinates
• Count
public class LoginScreen
{
GameObject nameField = new GameObject(“Canvas”, “nameField”);
GameObject passwordField = new GameObject(“Canvas”, “passwordField”);
GameObject loginButton = new GameObject().ByUPath(“//Canvas//loginButton”);
public MainManuScreen MakeSuccessLogin(string name, string password)
{
nameField.SendKeys(name);
passwordField.SendKeys(password);
loginButton.Click();
return new MainMenuScreen();
}
}
PUPPETRY
TEST
[Test]
public void Login_CorrectCredentials_Success()
{
//Arrange
var name = "Yevhen";
var password = “SeleniumCamp2019";
//Act
var screen = new LoginScreen().MakeSuccessLogin(name, password);
//Assert
Assert.IsTrue(screen.IsScreenOpened,
$"Main Menu was not opened after login with {name} and {password}")
}
FUNCTIONAL UI TESTS
GAME
SERVER
CLIENT
APPROACH
TEST
CLIENT
APPROACH
TEST
TESTS
• CRUD tests
• Functional tests
GAME
SERVER
CLIENT
APPROACH
TEST
GAME
SERVER
FAKE
CLIENT
APPROACH
TEST
PLATFORMS
COMMON LOGIC
CUSTOM LOGIC
OTHER PLAYER RELATED UI
GAME
SERVER
FAKE
CLIENT
SOCKET API
OPPONENT
TEST CLIENT
GAME
SERVER
FAKE
CLIENT
FAKE CONTROLLER
TEST
REST API
SOCKET API
FAKE
REST
CONTROLLER
CONNECTION
CONNECTION MANAGER
CLIENT TEST
public class ScenarioBuilder
{
public ScenarioBuilder MakeSuccessLogin_MainManuIsLoaded()
{
Context.Current.Page = new LoginScreen()
.MakeSuccessLogin()
.IsLoaded();
return this;
}
public ScenarioBuilder StartPlayGame_SearchingForOpponentWasStarted()
{
Context.Current.Page = ((MainMenuScreen)Context.Current.Page)
.ClickPlayGameButton()
.SearchingForOpponentMessageIsShown();
return this;
}
}
PLAYER SCENARIO
END2END TESTS
GAME
SERVER
DB
CLIENT
PAYMENTPLATFORM
DB DB
TEST
GAME
SERVER
DB
CLIENT
PAYMENTPLATFORM
DB DB
TEST
GAME
SERVER
DB
CLIENT
PAYMENTPLATFORM
DB DB
TEST
GAME
SERVER
DB
CLIENT
PAYMENTPLATFORM
DB DB
TEST
LACK OF TECHNOLOGIES
CROSSBREEDING
CROSSBREEDING
• Puppetry + Appium
GAME
SERVER
DB
MOBILE
CLIENT
TEST
APPIUM
PUPPETR
YOPPONENT
CROSSBREEDING
• Puppetry + Appium
• Puppetry + Selenium
MANUAL TESTING
MANUAL TESTING
• New functionality
• Functionality that hard to automate
• Exploratory testing
• Layout and visual testing
• Testing of sounds
• Localization testing
WHAT’S NEXT?
• Performance testing of Game Server
• Performance testing of Client
• Visual testing
• Bot for exploratory testing
CONCLUSION
• Games are not usual enterprise application, but
have a lot of common
• You can re-use common approaches
• You can invent your own approaches
CONTACTS:
www.linkedin.com/in/yevhen-rudiev-a5609590
www.facebook.com/evgeniy.rudev.5
yrudiev@gmail.com
@gameunitlab
Multiplayer game testing in actions

More Related Content

Similar to Multiplayer game testing in actions

Automated interactive testing for i os
Automated interactive testing for i osAutomated interactive testing for i os
Automated interactive testing for i os
Mobile March
 
Testing mit Codeception: Full-stack testing PHP framework
Testing mit Codeception: Full-stack testing PHP frameworkTesting mit Codeception: Full-stack testing PHP framework
Testing mit Codeception: Full-stack testing PHP framework
SusannSgorzaly
 
MBL203 Building a Mobile Application Platform on AWS - AWS re: Invent 2012
MBL203 Building a Mobile Application Platform on AWS - AWS re: Invent 2012MBL203 Building a Mobile Application Platform on AWS - AWS re: Invent 2012
MBL203 Building a Mobile Application Platform on AWS - AWS re: Invent 2012
Amazon Web Services
 
Javascript testing should be awesome
Javascript testing should be awesomeJavascript testing should be awesome
Javascript testing should be awesome
Abderrazak BOUADMA
 
Under the Wire PowerShell workshop - BSides Augusta 2018
Under the Wire PowerShell workshop - BSides Augusta 2018Under the Wire PowerShell workshop - BSides Augusta 2018
Under the Wire PowerShell workshop - BSides Augusta 2018
Fernando Tomlinson, CISSP, MBA
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFX
Hendrik Ebbers
 
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQUA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
Michelangelo van Dam
 
Mobile developer is Software developer
Mobile developer is Software developerMobile developer is Software developer
Mobile developer is Software developer
Eugen Martynov
 
Take Data Validation Seriously - Paul Milham, WildWorks
Take Data Validation Seriously - Paul Milham, WildWorksTake Data Validation Seriously - Paul Milham, WildWorks
Take Data Validation Seriously - Paul Milham, WildWorks
NodejsFoundation
 
Testing for fun in production Into The Box 2018
Testing for fun in production Into The Box 2018Testing for fun in production Into The Box 2018
Testing for fun in production Into The Box 2018
Ortus Solutions, Corp
 
Using Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development CycleUsing Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development Cycle
seleniumconf
 
Making a game "Just Right" through testing and play balancing
Making a game "Just Right" through testing and play balancingMaking a game "Just Right" through testing and play balancing
Making a game "Just Right" through testing and play balancing
Julio Gorgé
 
AdVenture Capitalist Post-Mortem
AdVenture Capitalist Post-MortemAdVenture Capitalist Post-Mortem
AdVenture Capitalist Post-Mortem
PlayFab, Inc.
 
Gatcha for developers
Gatcha for developersGatcha for developers
Gatcha for developers
Pieter De Schepper
 
UA Testing with Selenium and PHPUnit - ZendCon 2013
UA Testing with Selenium and PHPUnit - ZendCon 2013UA Testing with Selenium and PHPUnit - ZendCon 2013
UA Testing with Selenium and PHPUnit - ZendCon 2013
Michelangelo van Dam
 
Node.js vs Play Framework (with Japanese subtitles)
Node.js vs Play Framework (with Japanese subtitles)Node.js vs Play Framework (with Japanese subtitles)
Node.js vs Play Framework (with Japanese subtitles)
Yevgeniy Brikman
 
Advantages of Vue JS - Presented at the Rangle.io VueJS Meetup in January
Advantages of Vue JS - Presented at the Rangle.io VueJS Meetup in January Advantages of Vue JS - Presented at the Rangle.io VueJS Meetup in January
Advantages of Vue JS - Presented at the Rangle.io VueJS Meetup in January
Evan Schultz
 
Top100summit 谷歌-scott-improve your automated web application testing
Top100summit  谷歌-scott-improve your automated web application testingTop100summit  谷歌-scott-improve your automated web application testing
Top100summit 谷歌-scott-improve your automated web application testing
drewz lin
 
All a flutter about Flutter.io
All a flutter about Flutter.ioAll a flutter about Flutter.io
All a flutter about Flutter.io
Steven Cooper
 
Testing for Pragmatic People
Testing for Pragmatic PeopleTesting for Pragmatic People
Testing for Pragmatic People
davismr
 

Similar to Multiplayer game testing in actions (20)

Automated interactive testing for i os
Automated interactive testing for i osAutomated interactive testing for i os
Automated interactive testing for i os
 
Testing mit Codeception: Full-stack testing PHP framework
Testing mit Codeception: Full-stack testing PHP frameworkTesting mit Codeception: Full-stack testing PHP framework
Testing mit Codeception: Full-stack testing PHP framework
 
MBL203 Building a Mobile Application Platform on AWS - AWS re: Invent 2012
MBL203 Building a Mobile Application Platform on AWS - AWS re: Invent 2012MBL203 Building a Mobile Application Platform on AWS - AWS re: Invent 2012
MBL203 Building a Mobile Application Platform on AWS - AWS re: Invent 2012
 
Javascript testing should be awesome
Javascript testing should be awesomeJavascript testing should be awesome
Javascript testing should be awesome
 
Under the Wire PowerShell workshop - BSides Augusta 2018
Under the Wire PowerShell workshop - BSides Augusta 2018Under the Wire PowerShell workshop - BSides Augusta 2018
Under the Wire PowerShell workshop - BSides Augusta 2018
 
Test Driven Development with JavaFX
Test Driven Development with JavaFXTest Driven Development with JavaFX
Test Driven Development with JavaFX
 
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQUA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
UA testing with Selenium and PHPUnit - PHPBenelux Summer BBQ
 
Mobile developer is Software developer
Mobile developer is Software developerMobile developer is Software developer
Mobile developer is Software developer
 
Take Data Validation Seriously - Paul Milham, WildWorks
Take Data Validation Seriously - Paul Milham, WildWorksTake Data Validation Seriously - Paul Milham, WildWorks
Take Data Validation Seriously - Paul Milham, WildWorks
 
Testing for fun in production Into The Box 2018
Testing for fun in production Into The Box 2018Testing for fun in production Into The Box 2018
Testing for fun in production Into The Box 2018
 
Using Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development CycleUsing Selenium to Improve a Teams Development Cycle
Using Selenium to Improve a Teams Development Cycle
 
Making a game "Just Right" through testing and play balancing
Making a game "Just Right" through testing and play balancingMaking a game "Just Right" through testing and play balancing
Making a game "Just Right" through testing and play balancing
 
AdVenture Capitalist Post-Mortem
AdVenture Capitalist Post-MortemAdVenture Capitalist Post-Mortem
AdVenture Capitalist Post-Mortem
 
Gatcha for developers
Gatcha for developersGatcha for developers
Gatcha for developers
 
UA Testing with Selenium and PHPUnit - ZendCon 2013
UA Testing with Selenium and PHPUnit - ZendCon 2013UA Testing with Selenium and PHPUnit - ZendCon 2013
UA Testing with Selenium and PHPUnit - ZendCon 2013
 
Node.js vs Play Framework (with Japanese subtitles)
Node.js vs Play Framework (with Japanese subtitles)Node.js vs Play Framework (with Japanese subtitles)
Node.js vs Play Framework (with Japanese subtitles)
 
Advantages of Vue JS - Presented at the Rangle.io VueJS Meetup in January
Advantages of Vue JS - Presented at the Rangle.io VueJS Meetup in January Advantages of Vue JS - Presented at the Rangle.io VueJS Meetup in January
Advantages of Vue JS - Presented at the Rangle.io VueJS Meetup in January
 
Top100summit 谷歌-scott-improve your automated web application testing
Top100summit  谷歌-scott-improve your automated web application testingTop100summit  谷歌-scott-improve your automated web application testing
Top100summit 谷歌-scott-improve your automated web application testing
 
All a flutter about Flutter.io
All a flutter about Flutter.ioAll a flutter about Flutter.io
All a flutter about Flutter.io
 
Testing for Pragmatic People
Testing for Pragmatic PeopleTesting for Pragmatic People
Testing for Pragmatic People
 

Recently uploaded

Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
Peter Muessig
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
mz5nrf0n
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Łukasz Chruściel
 
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdfAutomated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
timtebeek1
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
Hornet Dynamics
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptxLORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
lorraineandreiamcidl
 
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesE-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
Quickdice ERP
 
Microservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we workMicroservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we work
Sven Peters
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
SOCRadar
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
Łukasz Chruściel
 
Unveiling the Advantages of Agile Software Development.pdf
Unveiling the Advantages of Agile Software Development.pdfUnveiling the Advantages of Agile Software Development.pdf
Unveiling the Advantages of Agile Software Development.pdf
brainerhub1
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
lorraineandreiamcidl
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
Hironori Washizaki
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
Philip Schwarz
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata
 

Recently uploaded (20)

Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
 
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdfAutomated software refactoring with OpenRewrite and Generative AI.pptx.pdf
Automated software refactoring with OpenRewrite and Generative AI.pptx.pdf
 
Vitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdfVitthal Shirke Java Microservices Resume.pdf
Vitthal Shirke Java Microservices Resume.pdf
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptxLORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
 
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian CompaniesE-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
E-Invoicing Implementation: A Step-by-Step Guide for Saudi Arabian Companies
 
Microservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we workMicroservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we work
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
 
Unveiling the Advantages of Agile Software Development.pdf
Unveiling the Advantages of Agile Software Development.pdfUnveiling the Advantages of Agile Software Development.pdf
Unveiling the Advantages of Agile Software Development.pdf
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
 

Multiplayer game testing in actions