SlideShare ist ein Scribd-Unternehmen logo
1 von 129
Downloaden Sie, um offline zu lesen
PEGGY • SENIOR DEVELOPER • ATLASSIAN • @PYKO
Mock servers
Fake all the things!
CREATING MOCK SERVERS
WHY USE MOCK SERVERS?
TESTING WITH MOCKS
THINGS TO LOOK OUT FOR
Agenda
THE PROBLEM
The problem
Simple servers that provide dummy data to
mock or simulate external dependencies.
“
”
Why use mock servers?
• Big cool statistic
• 2,56
9
• Add-Ons in Marketplace
Isolation
Self-contained
Decoupled
Stable
• Big cool statistic
• 2,56
9
• Add-Ons in Marketplace
Faster dev loop
127.0.0.1
• Big cool statistic
• 2,56
9
• Add-Ons in Marketplace
Better testing
Full control
Edge cases
E2E tests
Creating mock servers
3rd party libraries
vs
Build your own
WireMock
MockServer
and more…
Build your own
36 lines of code
// Assume all requests are successful
app.post('/rest/billing/1/product/*',
function(req, res) {
res.type('application/json');
res.status(202).send();
});
// Assume all requests are successful
app.post('/rest/billing/1/product/*',
function(req, res) {
res.type('application/json');
res.status(202).send();
});
// Assume all requests are successful
app.post('/rest/billing/1/product/*',
function(req, res) {
res.type('application/json');
res.status(202).send();
});
// Mock out the APIs.
// Directory path reflects the REST path.
app.all('/rest/billing/1/*', function(req, res) {
var method = req.method.toLowerCase();
var path = req.path.replace('/rest/billing/1/', '') + 

'-' + method + '.json';
res.send(require('./' + path));
});
// Mock out the APIs.
// Directory path reflects the REST path.
app.all('/rest/billing/1/*', function(req, res) {
var method = req.method.toLowerCase();
var path = req.path.replace('/rest/billing/1/', '') + 

'-' + method + '.json';
res.send(require('./' + path));
});
// Mock out the APIs.
// Directory path reflects the REST path.
app.all('/rest/billing/1/*', function(req, res) {
var method = req.method.toLowerCase();
var path = req.path.replace('/rest/billing/1/', '') + 

'-' + method + '.json';
res.send(require('./' + path));
});
GET /rest/billing/1/instance/pricing
GET /rest/billing/1/instance/pricing
// Mock out the APIs.
// Directory path reflects the REST path.
app.all('/rest/billing/1/*', function(req, res) {
var method = req.method.toLowerCase();
var path = req.path.replace('/rest/billing/1/', '') + 

'-' + method + '.json';
res.send(require('./' + path));
});
get /rest/billing/1/instance/pricing
// Mock out the APIs.
// Directory path reflects the REST path.
app.all('/rest/billing/1/*', function(req, res) {
var method = req.method.toLowerCase();
var path = req.path.replace('/rest/billing/1/', '') + 

'-' + method + '.json';
res.send(require('./' + path));
});
path = 'instance/pricing-get.json'get instance/pricing
// Mock out the APIs.
// Directory path reflects the REST path.
app.all('/rest/billing/1/*', function(req, res) {
var method = req.method.toLowerCase();
var path = req.path.replace('/rest/billing/1/', '') + 

'-' + method + '.json';
res.send(require('./' + path));
});
// Mock out the APIs.
// Directory path reflects the REST path.
app.all('/rest/billing/1/*', function(req, res) {
var method = req.method.toLowerCase();
var path = req.path.replace('/rest/billing/1/', '') + 

'-' + method + '.json';
res.send(require('./' + path));
});
require('./instance/pricing-get.json');
instance
pricing-get.json
product-usage-get.json
prospective-prices-post.json
require('./instance/pricing-get.json');
{
"hostname": "stubbed-host-response",
"active": true,
"currentBillingPeriod": {
"startDate": "2014-05-18",
"endDate": "2014-06-18",
"renewalFrequency": "monthly"
},
…
./instance/pricing-get.json
{
"hostname": "stubbed-host-response",
"active": true,
"currentBillingPeriod": {
"startDate": "2014-05-18",
"endDate": "2014-06-18",
"renewalFrequency": "monthly"
},
…
GET /rest/billing/1/instance/pricing
instance
pricing-get.json
product-usage-get.json
prospective-prices-post.json
instance
pricing-get.json
product-usage-get.json
prospective-prices-post.json
instance
pricing-get.json
product-usage-get.json
prospective-prices-post.json
POST data
instance
pricing-get.json
product-usage-get.json
prospective-prices-post.json
prospective-prices-postData.json
// Mock out the APIs.
// Directory path reflects the REST path.
app.all('/rest/billing/1/*', function(req, res) {
var method = req.method.toLowerCase();
var path = req.path.replace('/rest/billing/1/', '') + 

'-' + method + '.json';
res.send(require('./' + path));
});
app.post('/rest/billing/1/*', function (req, res) {
validatePostData(req);
res.send(getJsonFileForRequest(req, 'post'));
});
app.get('/rest/billing/1/*', function (req, res) {
res.send(getJsonFileForRequest(req, 'get'));
});
app.post('/rest/billing/1/*', function (req, res) {
validatePostData(req);
res.send(getJsonFileForRequest(req, 'post'));
});
app.get('/rest/billing/1/*', function (req, res) {
res.send(getJsonFileForRequest(req, 'get'));
});
app.post('/rest/billing/1/*', function (req, res) {
validatePostData(req);
res.send(getJsonFileForRequest(req, 'post'));
});
app.get('/rest/billing/1/*', function (req, res) {
res.send(getJsonFileForRequest(req, 'get'));
});
scenarios
states
all-the-products
annual-cc-noError
annual-cc-paymentError
monthly-cc-expiredCC
monthly-cc-productActivating
monthly-one-product-in-eval
…
app.get('/state/:state', function (req, res) {
app.state = req.params.state;
res.redirect('/billing/overview');
});
app.get('/state/:state', function (req, res) {
app.state = req.params.state;
res.redirect('/billing/overview');
});
GET /state/all-the-products
app.get('/state/:state', function (req, res) {
app.state = req.params.state;
res.redirect(‘/admin/billing/overview');
});
app.state = 'all-the-products'
function getJsonFilePath(path, suffix, ignoreState) {
var basePath = '/' + path.replace('/rest/billing/1/', '');
var filePath;
if (app.state && !ignoreState) {
basePath = '/states/' + app.state + basePath;
}
filePath = __dirname + basePath + '-' + suffix + '.json';
return filePath;
}
app.state = 'all-the-products'
function getJsonFilePath(path, suffix, ignoreState) {
var basePath = '/' + path.replace('/rest/billing/1/', '');
var filePath;
if (app.state && !ignoreState) {
basePath = '/states/' + app.state + basePath;
}
filePath = __dirname + basePath + '-' + suffix + '.json';
return filePath;
}
app.state = 'all-the-products'
states
all-the-products
annual-cc-noError
annual-cc-paymentError
monthly-cc-expiredCC
monthly-cc-productActivating
monthly-one-product-in-eval
…
GET /state/all-the-products
GET /state/jira-activating
GET /state/cc-paymentError
442 lines of code
GET /instance/{uuid}/pricing
"headers": {
"uuid": scenarioUuid
}
GET /instance/jira-activating/pricing
"headers": {
"uuid": "jira-activating"
}
smarter JSON
{
"interactions": [
{
"request": {...},
"response": {...}
},
{
"request": {...},
"response": {...}
}
]
}
{
"interactions": [
{
"request": {...},
"response": {...}
},
{
"request": {...},
"response": {...}
}
]
}
{
"interactions": [
{
"request": {...},
"response": {...}
},
{
"request": {...},
"response": {...}
}
]
}
{
"request": {
"method": "POST",
"contentType": "application/json",
"body": {
"products": ["jira.ondemand"]
}
},
"response": {
"status": 200,
"body": {
"productKeys":
["jira-core.ondemand",
"jira-software.ondemand"
"jira-servicedesk.ondemand"]
}
}
},
{
"interactions": [
{
"request": {...},
"response": {...}
},
{
"request": {...},
"response": {...}
}
]
}
{
"request": {
"method": "POST",
"contentType": "application/json",
"body": {
"products": ["jira.ondemand"]
}
},
"response": {
"status": 200,
"body": {
"productKeys":
["jira-core.ondemand",
"jira-software.ondemand"
"jira-servicedesk.ondemand"]
}
}
},
{
"interactions": [
{
"request": {...},
"response": {...}
},
{
"request": {...},
"response": {...}
}
]
}
{
"request": {
"method": "POST",
"contentType": "application/json",
"body": {
"products": ["jira.ondemand"]
}
},
"response": {
"status": 200,
"body": {
"productKeys":
["jira-core.ondemand",
"jira-software.ondemand",
"jira-servicedesk.ondemand"]
}
}
},
{
"interactions": [
{
"request": {...},
"response": {...}
},
{
"request": {...},
"response": {...}
}
]
}
{
"interactions": [
{
"request": {...},
"response": {...}
},
{
"request": {...},
"response": {...}
}
]
}
{
"request": {
"method": "POST",
"contentType": "application/json",
"body": {
"products": ["jira-software.ondemand"]
}
},
"response": {
"status": 200,
"body": {
"productKeys": ["jira-software.ondemand"]
}
}
}
{
"interactions": [
{
"request": {...},
"response": {...}
},
{
"request": {...},
"response": {...}
}
]
}
{
"request": {
"method": "POST",
"contentType": "application/json",
"body": {
"products": ["jira-software.ondemand"]
}
},
"response": {
"status": 200,
"body": {
"productKeys": ["jira-software.ondemand"]
}
}
}
{
"interactions": [
{
"request": {...},
"response": {...}
},
{
"request": {...},
"response": {...}
}
]
}
{
"request": {
"method": "POST",
"contentType": "application/json",
"body": {
"products": ["jira-software.ondemand"]
}
},
"response": {
"status": 200,
"body": {
"productKeys": ["jira-software.ondemand"]
}
}
}
• Big cool statistic
• 2,56
9
• Add-Ons in Marketplace
Testing with mocks
• Big cool statistic
• 2,56
9
• Add-Ons in Marketplace
• Big cool statistic
• 2,56
9
• Add-Ons in Marketplace
page = world.openBillingOverviewPage();
expect(page.getTotalAmount()).toBe('$20');
instance
pricing-get.json
product-usage-get.json
prospective-prices-post.json
world.changeStateTo('all-the-products');
all-the-products
pricing-get.json
product-usage-get.json
prospective-prices-post.json
states
page = world.openBillingOverviewPage();
expect(page.getTotalAmount()).toBe('$750');
Things to look out for
JD Hancock
Mocks need to be
up to date and accurate!
JSON schema
http://json-schema.org
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [
"hostname",
"currentBillingPeriod", "nextBillingPeriod",
"activeProducts", "deactivatedProducts"
],
"properties": {
"hostname": {
"type": "string"
},
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [
"hostname",
"currentBillingPeriod", "nextBillingPeriod",
"activeProducts", "deactivatedProducts"
],
"properties": {
"hostname": {
"type": "string"
},
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [
"hostname",
"currentBillingPeriod", "nextBillingPeriod",
"activeProducts", "deactivatedProducts"
],
"properties": {
"hostname": {
"type": "string"
},
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"required": [
"hostname",
"currentBillingPeriod", "nextBillingPeriod",
"activeProducts", "deactivatedProducts"
],
"properties": {
"hostname": {
"type": "string"
},
"properties": {
"hostname": {
"type": "string"
},
"currentBillingPeriod": {
"$ref": "#/definitions/billingPeriod"
},
"nextBillingPeriod": {
"$ref": "#/definitions/billingPeriod"
},
"activeProducts": {
"type": "array",
"properties": {
"hostname": {
"type": "string"
},
"currentBillingPeriod": {
"$ref": "#/definitions/billingPeriod"
},
"nextBillingPeriod": {
"$ref": "#/definitions/billingPeriod"
},
"activeProducts": {
"type": "array",
"activeProducts": {
"type": "array",
"items": {
"$ref": "#/definitions/product"
}
},
"deactivatedProducts": {
"type": "array",
"items": {
"$ref": "#/definitions/product"
}
}
"activeProducts": {
"type": "array",
"items": {
"$ref": "#/definitions/product"
}
},
"deactivatedProducts": {
"type": "array",
"items": {
"$ref": "#/definitions/product"
}
}
"activeProducts": {
"type": "array",
"items": {
"$ref": "#/definitions/product"
}
},
"deactivatedProducts": {
"type": "array",
"items": {
"$ref": "#/definitions/product"
}
}
},
"definitions": {
"billingPeriod": {
"type": "object",
"required": [
"renewalFrequency", "startDate", "endDate"
],
"properties": {
"renewalFrequency": {
"type": "string"
},
"startDate": {
},
"definitions": {
"billingPeriod": {
"type": "object",
"required": [
"renewalFrequency", "startDate", "endDate"
],
"properties": {
"renewalFrequency": {
"type": "string"
},
"startDate": {
},
"definitions": {
"billingPeriod": {
"type": "object",
"required": [
"renewalFrequency", "startDate", "endDate"
],
"properties": {
"renewalFrequency": {
"type": "string"
},
"startDate": {
},
"definitions": {
"billingPeriod": {
"type": "object",
"required": [
"renewalFrequency", "startDate", "endDate"
],
"properties": {
"renewalFrequency": {
"type": "string"
},
"startDate": {
Schema definition
mock server real server
Schema definition
mock server real server
Schema definition
mock server real server
Schema definition
• Big cool statistic
• 2,56
9
• Add-Ons in Marketplace
Isolation
• Big cool statistic
• 2,56
9
• Add-Ons in Marketplace
Faster dev loop
• Big cool statistic
• 2,56
9
• Add-Ons in Marketplace
Better testing
Thank you!
PEGGY • SENIOR DEVELOPER • ATLASSIAN • @PYKO

Weitere ähnliche Inhalte

Was ist angesagt?

Ppt of soap ui
Ppt of soap uiPpt of soap ui
Ppt of soap ui
pkslide28
 

Was ist angesagt? (20)

TestNG Framework
TestNG Framework TestNG Framework
TestNG Framework
 
Resilience testing with Wiremock and Spock
Resilience testing with Wiremock and SpockResilience testing with Wiremock and Spock
Resilience testing with Wiremock and Spock
 
Test automation process
Test automation processTest automation process
Test automation process
 
Automation Testing With Appium
Automation Testing With AppiumAutomation Testing With Appium
Automation Testing With Appium
 
Hybrid Automation Framework Development introduction
Hybrid Automation Framework Development introductionHybrid Automation Framework Development introduction
Hybrid Automation Framework Development introduction
 
Cypress - Best Practices
Cypress - Best PracticesCypress - Best Practices
Cypress - Best Practices
 
Xpath in Selenium | Selenium Xpath Tutorial | Selenium Xpath Examples | Selen...
Xpath in Selenium | Selenium Xpath Tutorial | Selenium Xpath Examples | Selen...Xpath in Selenium | Selenium Xpath Tutorial | Selenium Xpath Examples | Selen...
Xpath in Selenium | Selenium Xpath Tutorial | Selenium Xpath Examples | Selen...
 
Selenium-Locators
Selenium-LocatorsSelenium-Locators
Selenium-Locators
 
Why Should we use Microsoft's Playwright
Why Should we use Microsoft's PlaywrightWhy Should we use Microsoft's Playwright
Why Should we use Microsoft's Playwright
 
Setting up Page Object Model in Automation Framework
Setting up Page Object Model in Automation FrameworkSetting up Page Object Model in Automation Framework
Setting up Page Object Model in Automation Framework
 
Cypress-vs-Playwright-Rematch-Applitools.pdf
Cypress-vs-Playwright-Rematch-Applitools.pdfCypress-vs-Playwright-Rematch-Applitools.pdf
Cypress-vs-Playwright-Rematch-Applitools.pdf
 
Selenium web driver
Selenium web driverSelenium web driver
Selenium web driver
 
Criando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssuredCriando uma arquitetura para seus testes de API com RestAssured
Criando uma arquitetura para seus testes de API com RestAssured
 
POSTMAN.pptx
POSTMAN.pptxPOSTMAN.pptx
POSTMAN.pptx
 
API Testing following the Test Pyramid
API Testing following the Test PyramidAPI Testing following the Test Pyramid
API Testing following the Test Pyramid
 
Beginners - Get Started With Unit Testing in .NET
Beginners - Get Started With Unit Testing in .NETBeginners - Get Started With Unit Testing in .NET
Beginners - Get Started With Unit Testing in .NET
 
Ppt of soap ui
Ppt of soap uiPpt of soap ui
Ppt of soap ui
 
TestNG Annotations in Selenium | Edureka
TestNG Annotations in Selenium | EdurekaTestNG Annotations in Selenium | Edureka
TestNG Annotations in Selenium | Edureka
 
Mocking your Microservices with Mock Server
Mocking your Microservices with Mock ServerMocking your Microservices with Mock Server
Mocking your Microservices with Mock Server
 
QA. Load Testing
QA. Load TestingQA. Load Testing
QA. Load Testing
 

Andere mochten auch

Andere mochten auch (20)

Continuous Delivery in the Cloud with Bitbucket Pipelines
Continuous Delivery in the Cloud with Bitbucket PipelinesContinuous Delivery in the Cloud with Bitbucket Pipelines
Continuous Delivery in the Cloud with Bitbucket Pipelines
 
Releasing the Monolith On a Daily Basis
Releasing the Monolith On a Daily BasisReleasing the Monolith On a Daily Basis
Releasing the Monolith On a Daily Basis
 
Scaling Your First 1000 Containers with Docker
Scaling Your First 1000 Containers with DockerScaling Your First 1000 Containers with Docker
Scaling Your First 1000 Containers with Docker
 
Bitbucket Pipelines: Serverless CI/CD That Will Save Your Life
Bitbucket Pipelines: Serverless CI/CD That Will Save Your LifeBitbucket Pipelines: Serverless CI/CD That Will Save Your Life
Bitbucket Pipelines: Serverless CI/CD That Will Save Your Life
 
Tracking Huge Files with Git LFS
Tracking Huge Files with Git LFSTracking Huge Files with Git LFS
Tracking Huge Files with Git LFS
 
Verifying Microservice Integrations with Contract Testing
Verifying Microservice Integrations with Contract TestingVerifying Microservice Integrations with Contract Testing
Verifying Microservice Integrations with Contract Testing
 
Popular Git Workflows You Haven't Heard About
Popular Git Workflows You Haven't Heard AboutPopular Git Workflows You Haven't Heard About
Popular Git Workflows You Haven't Heard About
 
Takeaways From Migrating to Git and Bitbucket Server
Takeaways From Migrating to Git and Bitbucket ServerTakeaways From Migrating to Git and Bitbucket Server
Takeaways From Migrating to Git and Bitbucket Server
 
Scaling Without Expanding: a DevOps Story
Scaling Without Expanding: a DevOps StoryScaling Without Expanding: a DevOps Story
Scaling Without Expanding: a DevOps Story
 
Code reviews vs Pull requests
Code reviews vs Pull requestsCode reviews vs Pull requests
Code reviews vs Pull requests
 
Git 더하기 GitHub(구름IDE 환경)
Git 더하기 GitHub(구름IDE 환경)Git 더하기 GitHub(구름IDE 환경)
Git 더하기 GitHub(구름IDE 환경)
 
The Secret Sauce of Successful Teams
The Secret Sauce of Successful TeamsThe Secret Sauce of Successful Teams
The Secret Sauce of Successful Teams
 
Give the Power Back: Unleashing Creativity, Drive, and Innovation
Give the Power Back: Unleashing Creativity, Drive, and InnovationGive the Power Back: Unleashing Creativity, Drive, and Innovation
Give the Power Back: Unleashing Creativity, Drive, and Innovation
 
Fast then Faster - a Retrospective on Retrospectives
Fast then Faster - a Retrospective on RetrospectivesFast then Faster - a Retrospective on Retrospectives
Fast then Faster - a Retrospective on Retrospectives
 
DevTools at Netflix: Culture, Speed & Innovation
DevTools at Netflix: Culture, Speed & InnovationDevTools at Netflix: Culture, Speed & Innovation
DevTools at Netflix: Culture, Speed & Innovation
 
Mechanisms of Delight: HipChat Bots for the Masses
Mechanisms of Delight: HipChat Bots for the MassesMechanisms of Delight: HipChat Bots for the Masses
Mechanisms of Delight: HipChat Bots for the Masses
 
'Xero-ing in' on Global Collaboration During Hyper-Growth
'Xero-ing in' on Global Collaboration During Hyper-Growth'Xero-ing in' on Global Collaboration During Hyper-Growth
'Xero-ing in' on Global Collaboration During Hyper-Growth
 
Diversity Matters: How to Be the Change you Seek
Diversity Matters: How to Be the Change you SeekDiversity Matters: How to Be the Change you Seek
Diversity Matters: How to Be the Change you Seek
 
Marketing: Your Unexpected DevOps Allies
Marketing: Your Unexpected DevOps AlliesMarketing: Your Unexpected DevOps Allies
Marketing: Your Unexpected DevOps Allies
 
Practiced Curiosity: Building Collaboration Between Development and Design
Practiced Curiosity: Building Collaboration Between Development and DesignPracticed Curiosity: Building Collaboration Between Development and Design
Practiced Curiosity: Building Collaboration Between Development and Design
 

Ähnlich wie Mock Servers - Fake All the Things!

Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Tatsuhiko Miyagawa
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
Michelangelo van Dam
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
Tom Croucher
 
Do you want a SDK with that API? (Nordic APIS April 2014)
Do you want a SDK with that API? (Nordic APIS April 2014)Do you want a SDK with that API? (Nordic APIS April 2014)
Do you want a SDK with that API? (Nordic APIS April 2014)
Nordic APIs
 
nodejs_at_a_glance.ppt
nodejs_at_a_glance.pptnodejs_at_a_glance.ppt
nodejs_at_a_glance.ppt
WalaSidhom1
 

Ähnlich wie Mock Servers - Fake All the Things! (20)

Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8Unit testing after Zend Framework 1.8
Unit testing after Zend Framework 1.8
 
Building Web Apps with Express
Building Web Apps with ExpressBuilding Web Apps with Express
Building Web Apps with Express
 
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web AppsMashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web Apps
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
 
Silex Cheat Sheet
Silex Cheat SheetSilex Cheat Sheet
Silex Cheat Sheet
 
REST API for your WP7 App
REST API for your WP7 AppREST API for your WP7 App
REST API for your WP7 App
 
Mashing up JavaScript
Mashing up JavaScriptMashing up JavaScript
Mashing up JavaScript
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
API gateway setup
API gateway setupAPI gateway setup
API gateway setup
 
Advanced redux
Advanced reduxAdvanced redux
Advanced redux
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12
 
Spring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. RESTSpring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. REST
 
Creating REST Applications with the Slim Micro-Framework by Vikram Vaswani
Creating REST Applications with the Slim Micro-Framework by Vikram VaswaniCreating REST Applications with the Slim Micro-Framework by Vikram Vaswani
Creating REST Applications with the Slim Micro-Framework by Vikram Vaswani
 
Do you want a SDK with that API? (Nordic APIS April 2014)
Do you want a SDK with that API? (Nordic APIS April 2014)Do you want a SDK with that API? (Nordic APIS April 2014)
Do you want a SDK with that API? (Nordic APIS April 2014)
 
Express JS
Express JSExpress JS
Express JS
 
Why You Should Use TAPIs
Why You Should Use TAPIsWhy You Should Use TAPIs
Why You Should Use TAPIs
 
API Days Paris - Automatic Testing of (RESTful) API Documentation
API Days Paris - Automatic Testing of (RESTful) API DocumentationAPI Days Paris - Automatic Testing of (RESTful) API Documentation
API Days Paris - Automatic Testing of (RESTful) API Documentation
 
nodejs_at_a_glance.ppt
nodejs_at_a_glance.pptnodejs_at_a_glance.ppt
nodejs_at_a_glance.ppt
 

Mehr von Atlassian

Design Your Next App with the Atlassian Vendor Sketch Plugin
Design Your Next App with the Atlassian Vendor Sketch PluginDesign Your Next App with the Atlassian Vendor Sketch Plugin
Design Your Next App with the Atlassian Vendor Sketch Plugin
Atlassian
 

Mehr von Atlassian (20)

International Women's Day 2020
International Women's Day 2020International Women's Day 2020
International Women's Day 2020
 
10 emerging trends that will unbreak your workplace in 2020
10 emerging trends that will unbreak your workplace in 202010 emerging trends that will unbreak your workplace in 2020
10 emerging trends that will unbreak your workplace in 2020
 
Forge App Showcase
Forge App ShowcaseForge App Showcase
Forge App Showcase
 
Let's Build an Editor Macro with Forge UI
Let's Build an Editor Macro with Forge UILet's Build an Editor Macro with Forge UI
Let's Build an Editor Macro with Forge UI
 
Meet the Forge Runtime
Meet the Forge RuntimeMeet the Forge Runtime
Meet the Forge Runtime
 
Forge UI: A New Way to Customize the Atlassian User Experience
Forge UI: A New Way to Customize the Atlassian User ExperienceForge UI: A New Way to Customize the Atlassian User Experience
Forge UI: A New Way to Customize the Atlassian User Experience
 
Take Action with Forge Triggers
Take Action with Forge TriggersTake Action with Forge Triggers
Take Action with Forge Triggers
 
Observability and Troubleshooting in Forge
Observability and Troubleshooting in ForgeObservability and Troubleshooting in Forge
Observability and Troubleshooting in Forge
 
Trusted by Default: The Forge Security & Privacy Model
Trusted by Default: The Forge Security & Privacy ModelTrusted by Default: The Forge Security & Privacy Model
Trusted by Default: The Forge Security & Privacy Model
 
Designing Forge UI: A Story of Designing an App UI System
Designing Forge UI: A Story of Designing an App UI SystemDesigning Forge UI: A Story of Designing an App UI System
Designing Forge UI: A Story of Designing an App UI System
 
Forge: Under the Hood
Forge: Under the HoodForge: Under the Hood
Forge: Under the Hood
 
Access to User Activities - Activity Platform APIs
Access to User Activities - Activity Platform APIsAccess to User Activities - Activity Platform APIs
Access to User Activities - Activity Platform APIs
 
Design Your Next App with the Atlassian Vendor Sketch Plugin
Design Your Next App with the Atlassian Vendor Sketch PluginDesign Your Next App with the Atlassian Vendor Sketch Plugin
Design Your Next App with the Atlassian Vendor Sketch Plugin
 
Tear Up Your Roadmap and Get Out of the Building
Tear Up Your Roadmap and Get Out of the BuildingTear Up Your Roadmap and Get Out of the Building
Tear Up Your Roadmap and Get Out of the Building
 
Nailing Measurement: a Framework for Measuring Metrics that Matter
Nailing Measurement: a Framework for Measuring Metrics that MatterNailing Measurement: a Framework for Measuring Metrics that Matter
Nailing Measurement: a Framework for Measuring Metrics that Matter
 
Building Apps With Color Blind Users in Mind
Building Apps With Color Blind Users in MindBuilding Apps With Color Blind Users in Mind
Building Apps With Color Blind Users in Mind
 
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
Creating Inclusive Experiences: Balancing Personality and Accessibility in UX...
 
Beyond Diversity: A Guide to Building Balanced Teams
Beyond Diversity: A Guide to Building Balanced TeamsBeyond Diversity: A Guide to Building Balanced Teams
Beyond Diversity: A Guide to Building Balanced Teams
 
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed TeamThe Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
The Road(map) to Las Vegas - The Story of an Emerging Self-Managed Team
 
Building Apps With Enterprise in Mind
Building Apps With Enterprise in MindBuilding Apps With Enterprise in Mind
Building Apps With Enterprise in Mind
 

Kürzlich hochgeladen

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
Victor Rentea
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Kürzlich hochgeladen (20)

Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
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
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
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
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
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
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
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
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
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
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
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
 

Mock Servers - Fake All the Things!