SlideShare a Scribd company logo
1 of 58
Download to read offline
Introducing
Spring Auto REST Docs
Florian Benz
@flbenz
@spring_io
#springio17
DR REST DOCS
OR: HOW I LEARNED TO STOP WORRYING
AND LOVE DOCUMENTATION
@spring_io
#springio17
Florian Benz
Software Engineer
@flbenz
@spring_io
#springio17
Scalable Capital
• Europe’s fastest growing Digital Wealth Manager
• Authorized financial institute in Germany and the UK
• From scratch with Spring Boot
• Joined effort with Juraj Misur @juraj_misur
@spring_io
#springio17
Spring Auto REST Docs
Scalable Capital
founded
Dec 2014
Proof of concept
Jul 2015
First article
Nov 2015
@spring_io
#springio17
Spring Auto REST Docs
Open source
&
First release
Dec 2016
DZone article
Jan 2017
Two releases
with fixes and
features
Feb & Mar 2017
@spring_io
#springio17
Our Story
@spring_io
#springio17
Manual Documentation
DocumentationCode
@spring_io
#springio17
A single big document
@spring_io
#springio17
Specification-Driven
Documentation
DocumentationCode
Specification
@spring_io
#springio17
RAML Specification
/weather:
get:
queryParameters:
city:
description: Name of a city in the given country.
responses:
200:
body:
application/json:
schema: |
{ "$schema": "http://json-schema.org/schema",
"type": "object",
"description": "Weather information",
"properties": {
"temperature": { "type": "number" }
}
}
@spring_io
#springio17
Swagger / OpenAPI
@GetMapping("weatherParam")
@ApiOperation("weather")
@ApiImplicitParams({
@ApiImplicitParam(name = "country", value = "Country code", required = true,
dataType = "string", paramType = "query"),
@ApiImplicitParam(name = "city", value = "City", required = true,
dataType = "string", paramType = "query")
})
@ApiResponses({
@ApiResponse(code = 200, message = "Success", response =
WeatherResponse.class)
})
public WeatherResponse weatherParam(@RequestParam @IsoCountryCode String
country,
@RequestParam String city) {
return new WeatherResponse(20);
}
@spring_io
#springio17
Swagger / OpenAPI
@spring_io
#springio17
Postman
@spring_io
#springio17
Test-Driven Documentation
DocumentationCode
Tests
@spring_io
#springio17
Spring REST Docs
Generated
snippets
Tests
Hand-written
documentation
Documentation
@spring_io
#springio17
Spring MVC Test
@Test
public void shouldReturnWeatherForBarcelona() throws Exception {
mockMvc.perform(
post("/weather")
.contentType(MediaType.APPLICATION_JSON)
.content("{"country": "ES", "city": "Barcelona"}")
)
.andExpect(status().isOk())
.andExpect(jsonPath("$.temperature", is(20)));
}
@spring_io
#springio17
Spring REST Docs
@Test
public void shouldReturnWeatherForBarcelona() throws Exception {
mockMvc.perform(
post("/weather")
.contentType(MediaType.APPLICATION_JSON)
.content("{"country": "ES", "city": "Barcelona"}")
)
.andExpect(status().isOk())
.andExpect(jsonPath("$.temperature", is(20)));
.andDo(document("weather",
requestFields(
fieldWithPath("country").description("Country code"),
fieldWithPath("city").description("City name"))));
}
@spring_io
#springio17
Generated snippet
|===
|Path|Type|Optional|Description
|country
|String
|false
|Country Code.
|city
|false
|true
|City name.
|===
@spring_io
#springio17
AsciiDoc
[[resources-weather]]
= Weather for your city
`POST /weather`
Up-to-date temperature for the given city
== Response structure
include::{snippets}/weather/response-fields.adoc[]
== Example request/response
include::{snippets}/weather/curl-request.adoc[]
include::{snippets}/weather/http-response.adoc[]
@spring_io
#springio17
Spring REST Docs
@spring_io
#springio17
Spring REST Docs
@spring_io
#springio17
Spring REST Docs
Controller
POJO
Response Entity
Jackson
HTTP response Documented
@spring_io
#springio17
Extending
Spring REST Docs
@spring_io
#springio17
Motivation
.andDo(document("weather",
requestFields(
fieldWithPath("country").description("Country code"),
fieldWithPath("city").description("Name of a city"))));
We are lazy
@spring_io
#springio17
Proof of concept
@spring_io
#springio17
Spring Auto REST Docs
Controller
POJO
Response Entity
Jackson
HTTP response
Javadoc
Introspection
@spring_io
#springio17
Spring REST Docs
@Test
public void shouldReturnWeatherForBarcelona() throws Exception {
mockMvc.perform(
post("/weather")
.contentType(MediaType.APPLICATION_JSON)
.content("{"country": "ES", "city": "Barcelona"}")
)
.andExpect(status().isOk())
.andExpect(jsonPath("$.temperature", is(20)));
.andDo(document("weather",
requestFields(
fieldWithPath("country").optional().description("Country code"),
fieldWithPath("city").optional().description("City name"))));
}
@spring_io
#springio17
Spring Auto REST Docs
@Test
public void shouldReturnWeatherForBarcelona() throws Exception {
mockMvc.perform(
post("/weather")
.contentType(MediaType.APPLICATION_JSON)
.content("{"country": "ES", "city": "Barcelona"}")
)
.andExpect(status().isOk())
.andExpect(jsonPath("$.temperature", is(20)));
.andDo(document("weather"));
}
@spring_io
#springio17
Javadoc
class WeatherRequest {
/**
* Country code.
*/
private String country;
/**
* City name.
*/
private String city;
}
Path Type Optional Description
country String true Country code.
city String true City name.
@spring_io
#springio17
Constraints
class WeatherRequest {
/**
* Country code, e.g. ES, DE, US.
*/
@NotNull
@IsoCountryCode
private String country;
/**
* City name.
*/
@NotBlank
private String city;
}
Path Type Optional Description
country String false Country code.
Must be an ISO country code.
city String false City name.
@spring_io
#springio17
Constraints
package.OneOf.description=Must be one of ${value}
package.IsoCountryCode.description=Must be an ISO country code
ConstraintDesciptions.properties
@spring_io
#springio17
Constraints
class WeatherRequest {
/**
* Country code, e.g. ES, DE, US.
*/
@NotNull
@IsoCountryCode(groups = Iso.class)
@CountryName(groups = Plain.class)
private String country;
}
Path Type Optional Description
country String false Country code.
ISO: Must be an ISO country code.
Plain: Must be a country name.
@spring_io
#springio17
Enums
class WeatherRequest {
/**
* Country code, e.g. ES, DE, US.
*/
@NotNull
private Country country;
/**
* City name.
*/
@NotBlank
private String city;
}
Path Type Optional Description
country String false Country code.
Must be one of [DE, ES, FR, PT, US].
city String false City name.
@spring_io
#springio17
Original: hand-written
2.8. Weather
POST /weather
Up-to-date weather data for cities around the globe.
[[resources-weather]]
= Weather for your city
`POST /weather`
Up-to-date temperature for the given city
@spring_io
#springio17
Extension: Javadoc on method
/**
* Up-to-date weather data for cities around the globe.
*/
@PostMapping("weather")
public WeatherResponse weather(
@RequestBody @Valid WeatherRequest weatherRequest) {
return new WeatherResponse(20);
}
2.8. Weather
POST /weather
Up-to-date weather data for cities around the globe.
@spring_io
#springio17
Original: Path Parameters
.andDo(document("weather",
pathParameters(
parameterWithName("country").description("Country code"),
parameterWithName("city").description("City name"))));
@spring_io
#springio17
Extension: Path Parameters
/**
* Up-to-date weather data for cities around the globe.
*
* @param country Country code.
* @param city City name.
*/
@GetMapping("weather/{country}/{city}")
public WeatherResponse weatherPath(
@PathVariable @IsoCountryCode String country,
@PathVariable String city) {
return new WeatherResponse(20);
}
@spring_io
#springio17
Path Parameters
@spring_io
#springio17
Path Parameters
@spring_io
#springio17
Original: Query Parameters
.andDo(document("weather",
requestParameters(
parameterWithName("country").description("Country code"),
parameterWithName("city").description("City name"))));
@spring_io
#springio17
Extension: Query Parameters
/**
* Up-to-date weather data for cities around the globe.
*
* @param country Country code.
* @param city City name.
*/
@GetMapping("weatherParam")
public WeatherResponse weatherParam(
@RequestParam @IsoCountryCode String country,
@RequestParam String city) {
return new WeatherResponse(20);
}
@spring_io
#springio17
Query Parameters
@spring_io
#springio17
Query Parameters
@spring_io
#springio17
Section Snippet
[[resources-weather]]
=== Weather for your city
`POST /weather`
Up-to-date temperature for the given city
===== Request structure
include::{snippets}/weather/request-fields.adoc[]
===== Response structure
include::{snippets}/weather/response-fields.adoc[]
===== Example request/response
include::{snippets}/weather/curl-request.adoc[]
include::{snippets}/weather/http-response.adoc[]
include::{snippets}/weather/section.adoc[]
Documentation path
Spring MVC Controller
Javadoc
Method name
@spring_io
#springio17
Authorization snippet
@spring_io
#springio17
Content Modifiers
[
1,
2,
3,
4,
5
]
[
1,
2,
3
]
array shortener
@spring_io
#springio17
Content Modifiers
%PDF-1.5
%����
12 0 obj
<<
/Length 3654
/Filter /FlateDecode
>>
<binary>
binary replacement
@spring_io
#springio17
Benefits
Less to write
Code review Maintainability
Happier developers
DRY
Accurate
@spring_io
#springio17
Sounds good!
Issues?
@spring_io
#springio17
Issues
@spring_io
#springio17
Issues
@spring_io
#springio17
Issues
@spring_io
#springio17
It’s an extension
Authorization snippet
Javadoc/introspection snippets
Content modifiers
@spring_io
#springio17
Spring Auto REST Docs
at Scalable Capital
@spring_io
#springio17
Spring Auto REST Docs
at Scalable Capital
@spring_io
#springio17
Thank you
@spring_io
#springio17
Q&A
@flbenz

More Related Content

What's hot

サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
koji lin
 
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
Amazon Web Services Japan
 

What's hot (20)

Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツール
 
TidalScaleで複数の物理サーバを集約しインメモリーコンピューティングを実現
TidalScaleで複数の物理サーバを集約しインメモリーコンピューティングを実現TidalScaleで複数の物理サーバを集約しインメモリーコンピューティングを実現
TidalScaleで複数の物理サーバを集約しインメモリーコンピューティングを実現
 
サーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよサーバーサイドでの非同期処理で色々やったよ
サーバーサイドでの非同期処理で色々やったよ
 
Java Web, o Tutorial
Java Web, o TutorialJava Web, o Tutorial
Java Web, o Tutorial
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
 
Spring 5でSpring Testのここが変わる_公開版
Spring 5でSpring Testのここが変わる_公開版Spring 5でSpring Testのここが変わる_公開版
Spring 5でSpring Testのここが変わる_公開版
 
ヤフー発のメッセージキュー「Pulsar」のご紹介
ヤフー発のメッセージキュー「Pulsar」のご紹介ヤフー発のメッセージキュー「Pulsar」のご紹介
ヤフー発のメッセージキュー「Pulsar」のご紹介
 
T4 Template 入門
T4 Template 入門T4 Template 入門
T4 Template 入門
 
JavaScript難読化読経
JavaScript難読化読経JavaScript難読化読経
JavaScript難読化読経
 
広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015
広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015
広告配信のための高速疎ベクトル検索エンジンの開発@WebDBフォーラム2015 #webdbf2015
 
Planet-scale Data Ingestion Pipeline: Bigdam
Planet-scale Data Ingestion Pipeline: BigdamPlanet-scale Data Ingestion Pipeline: Bigdam
Planet-scale Data Ingestion Pipeline: Bigdam
 
お金が無いときのMySQL Cluster頼み
お金が無いときのMySQL Cluster頼みお金が無いときのMySQL Cluster頼み
お金が無いときのMySQL Cluster頼み
 
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
 
WebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみたWebSocketでカメラの映像を共有してみた
WebSocketでカメラの映像を共有してみた
 
Perl ウェブ開発の中世〜CGI と Plack の間〜
Perl ウェブ開発の中世〜CGI と Plack の間〜Perl ウェブ開発の中世〜CGI と Plack の間〜
Perl ウェブ開発の中世〜CGI と Plack の間〜
 
YJTC18 D-5 日本のインターネットを守る!Yahoo! JAPANの不正利用対策 - Splunkによる不正ログイン検知
YJTC18 D-5 日本のインターネットを守る!Yahoo! JAPANの不正利用対策 - Splunkによる不正ログイン検知YJTC18 D-5 日本のインターネットを守る!Yahoo! JAPANの不正利用対策 - Splunkによる不正ログイン検知
YJTC18 D-5 日本のインターネットを守る!Yahoo! JAPANの不正利用対策 - Splunkによる不正ログイン検知
 
15分でお届けする Elastic Stack on Azure 設計・構築ノウハウ
15分でお届けする Elastic Stack on Azure 設計・構築ノウハウ15分でお届けする Elastic Stack on Azure 設計・構築ノウハウ
15分でお届けする Elastic Stack on Azure 設計・構築ノウハウ
 
deep dive distributed tracing
deep dive distributed tracingdeep dive distributed tracing
deep dive distributed tracing
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
 
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud GatewaySpring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
Spring IO 2023 - Dynamic OpenAPIs with Spring Cloud Gateway
 

Similar to Introducing Spring Auto REST Docs - Spring IO 2017

Supersize me
Supersize meSupersize me
Supersize me
dominion
 
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
Thomas Conté
 

Similar to Introducing Spring Auto REST Docs - Spring IO 2017 (20)

Introducing Spring Auto REST Docs - Spring Community Meetup Munich
Introducing Spring Auto REST Docs - Spring Community Meetup MunichIntroducing Spring Auto REST Docs - Spring Community Meetup Munich
Introducing Spring Auto REST Docs - Spring Community Meetup Munich
 
Wso2 Scenarios Esb Webinar July 1st
Wso2 Scenarios Esb Webinar July 1stWso2 Scenarios Esb Webinar July 1st
Wso2 Scenarios Esb Webinar July 1st
 
Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...
Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...
Visualize Your Smart City: Build a Real-Time Smart City Dashboard for SensorT...
 
Open source report writing tools for IBM i Vienna 2012
Open source report writing tools for IBM i  Vienna 2012Open source report writing tools for IBM i  Vienna 2012
Open source report writing tools for IBM i Vienna 2012
 
Where is the World is my Open Government Data?
Where is the World is my Open Government Data?Where is the World is my Open Government Data?
Where is the World is my Open Government Data?
 
the Spring Update from JavaOne 2013
the Spring Update from JavaOne 2013the Spring Update from JavaOne 2013
the Spring Update from JavaOne 2013
 
Semantic Web & TYPO3
Semantic Web & TYPO3Semantic Web & TYPO3
Semantic Web & TYPO3
 
Accessing loosely structured data from F# and C#
Accessing loosely structured data from F# and C#Accessing loosely structured data from F# and C#
Accessing loosely structured data from F# and C#
 
WELCOME TO OUR PRESENTION.pptx
WELCOME TO OUR PRESENTION.pptxWELCOME TO OUR PRESENTION.pptx
WELCOME TO OUR PRESENTION.pptx
 
Server Side Swift - AppBuilders 2017
Server Side Swift - AppBuilders 2017Server Side Swift - AppBuilders 2017
Server Side Swift - AppBuilders 2017
 
Novidades do c# 7 e 8
Novidades do c# 7 e 8Novidades do c# 7 e 8
Novidades do c# 7 e 8
 
Supersize me
Supersize meSupersize me
Supersize me
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
 
Андрей Шумада "Data migration in node.js rest api and mongo db "
Андрей Шумада "Data migration in node.js rest api and mongo db "Андрей Шумада "Data migration in node.js rest api and mongo db "
Андрей Шумада "Data migration in node.js rest api and mongo db "
 
Creating a Facebook Clone - Part V - Transcript.pdf
Creating a Facebook Clone - Part V - Transcript.pdfCreating a Facebook Clone - Part V - Transcript.pdf
Creating a Facebook Clone - Part V - Transcript.pdf
 
The never changing face of immutability
The never changing face of immutabilityThe never changing face of immutability
The never changing face of immutability
 
Predictive Analytics with Airflow and PySpark
Predictive Analytics with Airflow and PySparkPredictive Analytics with Airflow and PySpark
Predictive Analytics with Airflow and PySpark
 
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
MS Day EPITA 2010: Visual Studio 2010 et Framework .NET 4.0
 
Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)
Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)
Developing with the Modern App Stack: MEAN and MERN (with Angular2 and ReactJS)
 
Django tech-talk
Django tech-talkDjango tech-talk
Django tech-talk
 

Recently uploaded

AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
VictorSzoltysek
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 

Recently uploaded (20)

Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
ManageIQ - Sprint 236 Review - Slide Deck
ManageIQ - Sprint 236 Review - Slide DeckManageIQ - Sprint 236 Review - Slide Deck
ManageIQ - Sprint 236 Review - Slide Deck
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedSector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 

Introducing Spring Auto REST Docs - Spring IO 2017