SlideShare a Scribd company logo
Test Driven
Documentation
with Spring Rest Docs
Tsypuk Roman
@tsypuk_r
tsypuk.conf@gmail.com
About me
• Sr Software engineer at Lohika, Altran Group
• G4 organizer of Lohika Java Community
• java8, spring, spring boot, microservices, security
• radio HAM, software defined radio
2
Agenda
• Age of Swagger
• Test Driven Documentation
• Spring Rest Docs under the hood
• Migration from Swagger to Spring Rest Docs
3
Age of Swagger
4IMG http://swagger.io
Demo
https://github.com/tsypuk/springrestdoc 5
URI-based documentation
6
@GetMapping(path	=	"/speakers/{id}")
public	ResponseEntity<SpeakerResource>	getSpeaker(@PathVariablelong	id)	{
return	speakerRepository.findOne(id)
.map(speaker	->	ResponseEntity.ok(new	SpeakerResource(speaker)))
.orElse(new	ResponseEntity(HttpStatus.NOT_FOUND));
}
RestController
7
@GetMapping(path	=	"/speakers/{id}")
public	ResponseEntity<SpeakerResource>	getSpeaker(@PathVariablelong	id)	{
return	speakerRepository.findOne(id)
.map(speaker	->	ResponseEntity.ok(new	SpeakerResource(speaker)))
.orElse(new	ResponseEntity(HttpStatus.NOT_FOUND));
}
RestController
1
2
3
4
5
6
8
@ApiOperation(
value	=	"Find	speaker	by	ID",
notes	=	"For	valid	response	try	integer	IDs	with	value	1	...	999.",
response	=	SpeakerResource.class)
@ApiResponses(value	 =	{
@ApiResponse(code	 =	200,	message	=	"Successful	retrieve	the	speaker.",	response	=	SpeakerResource.class),
@ApiResponse(code	 =	400,	message	=	"Invalid	ID	supplied"),
@ApiResponse(code	 =	404,	message	=	"Speaker	not	found"),
@ApiResponse(code	 =	500,	message	=	"Internal	server	error.")})
@GetMapping(value	 =	"/{id}")
public	ResponseEntity<SpeakerResource>	 getSpeaker(
@ApiParam(value	=	"ID	of	speaker	that	needs	to	be	fetched",
allowableValues =	"range[1,999]",
required	=	true)
@PathVariable long	id)	{
return	speakerRepository.findOne(id)
.map(speaker	->	ResponseEntity.ok(new	SpeakerResource(speaker)))
.orElse(new	ResponseEntity(HttpStatus.NOT_FOUND));
}
Swagger Documented Controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 10
Swagger Documented Models
1
2
3
4
5
6
7
8
…
@ApiModel(value	 =	"Speaker	Resource",	
description	=	"Speaker	detailed	description.")
public	class	SpeakerResource extends	ResourceSupport {
@ApiModelProperty(value	 =	"Name	of	the	Speaker	in	full	format.",
example	=	"Roman	Tsypuk",
dataType =	"java.lang.String",
required	=	true)
private	String	name;
11
/speakers/{speakerId}:
put:
tags:
- speaker
summary:	Updates	a	speaker	with	new	data
description:	""
operationId:	updateSpeaker
consumes:
- application/json
produces:
- application/json
parameters:
- in:	path
name:	speakerId
description:	ID	of	speaker	that	needs	to	be	updated
required:	true
type:	string
- in:	jsonData
name:	name
description:	Updated	name	of	the	speaker
required:	true
type:	string
- in:	jsonData
name:	company
description:	Updated	company	of	the	speaker
required:	false
type:	string
responses:
"405":
description:	Validation	exception
"404":
description:	Speaker	not	found
"400":
description:	Invalid	ID	supplied
"201":
description:	successful	operation
schema:
type:	array
items:
$ref:	"#/definitions/Speaker"
security:
- service_auth:
- write_speakers
- read_speakers
definitions
Speaker:
description:	Speaker	resource
required:
- name
- photoUrls
properties:
id:
type:	integer
format:	int64
topics:
type:	array
items:
$ref:	"#/definitions/Topic"
name:
type:	string
example:	Josh	Long
company:
type:	string
example:	Pivotal
status:
type:	string
description:	I	love	Spring
Swagger specification yaml file
12
Bottom-up (code-first)
io.swagger.annotations
Top-down (contract-first)
swagger.(yaml/json)
Tightly coupled code
with annotations
Swagger Approaches
13
Hypermedia Support
13
Level	0:	XML	RPC/Remoting
Singular	service	endpoint	 for	everything
Level	1:
Multiple	resources
Level	2:
Proper	use	of	HTTP	verbs
Level	3	HATEOAS:
Discoverability,	Hypermedia	controls
Swagger	2.0
https://martinfowler.com/articles/richardsonMaturityModel.html
Richardson Maturity Model
14
Level	0:	XML	RPC/Remoting
Singular	service	endpoint	 for	everything
Level	1:
Multiple	resources
Level	2:
Proper	use	of	HTTP	verbs
Level	3	HATEOAS:
Discoverability,	Hypermedia	controls
Swagger	2.0
Hypermedia is not supported in swagger 2.0
15
Level	0:	XML	RPC/Remoting
Singular	service	endpoint	 for	everything
Level	1:
Multiple	resources
Level	2:
Proper	use	of	HTTP	verbs
Level	3	HATEOAS:
Discoverability,	Hypermedia	controls
Swagger	2.0
OpenAPI3.0
OpenAPI 3.0 is comming
16
• Depends on the framework implementation details
• Specification is only machine-readable
• The format is not easy to use
• HATEOAS links are not supported (swagger 2.0)
• Annotations
• Documentation can be outdated
Swagger Problems
17
Spring Rest Docs
IMG http://spring.io 18
Spring Rest Docs
• Documentation is built from tests
• Clean code
• Documentation is part of a regular dev cycle
• Immediate reaction to API changes
• HATEOAS
19
Refactor
GREEN
RED
https://martinfowler.com/bliki/TestDrivenDevelopment.html
Classical Test Driven Development
20
Document
GREEN
Refactor
GREEN
RED
Spring Rest Docs Test Driven Documentation
21
Supports Integrated with
22
Spring Rest Docs
How does it work?
23
ResultActions actions	=	mockMvc.perform(get("/speakers/{id}",	SPEAKER_ID))
.andDo(print());
actions.andExpect(status().isOk())
.andExpect(jsonPath("$.name",	is("Roman	Tsypuk")))
.andExpect(jsonPath("$.company",	is("Lohika")));
MockMvc Test
ResultMatcher
24
ResultActions actions	=	mockMvc.perform(get("/speakers/{id}",	SPEAKER_ID))
.andDo(print());
actions.andExpect(status().isOk())
.andExpect(jsonPath("$.name",	is("Roman	Tsypuk")))
.andExpect(jsonPath("$.company",	is("Lohika")))
ResultHandler
MockMvc Key Players
.andDo( … )
25
Inside of ResultActions
ResultActions
MvcResultMockHttpServletRequest
encoding
content
contentType
contentLength
parameters
ServletResponse
headers
status
forwardUrl
includeUrl
errorMessage
HttpServletResponse
authType
cookie
header
method
pathInfo
HttpServletRequestServletRequest
attributes
charEncoding
content
contentType
parameters
serverPort
serverName
schema
async
MockHttpServletResponse
26
actions.andDo(document("{class-name}/{method-name}",
responseFields(
fieldWithPath("name").description("The	name	of	the	Speaker"),
fieldWithPath("company").description(”Speaker’s	company"),
fieldWithPath("status").description("Hope	only	good	:)"),
subsectionWithPath("_links").description("HATEOAS	links")),
links(halLinks(),
linkWithRel("self").description("Link	to	Speaker"),
linkWithRel("topics").description("Topics	of	the	Speaker"))));
ResultsHandler Registration
27
28
DocumentTests TemplateSnippets
Spring Rest Docs Flow
Live Coding
29https://github.com/tsypuk/springrestdoc
• Admonitions (tips, warnings, cautions, importants)
• Text formatting
• Lists (ordered, checklists)
• Code blocks highlighting
• Images/files
• Extensions
Asciidoc is Awesome
30
• NEO4J https://neo4j.com/docs/java-reference/3.1/#call-procedure
• O’Reilly books
• CouchDB http://guide.couchdb.org/draft/consistency.html
• Enterprise Web Development http://enterprisewebbook.com/
• Bintray https://bintray.com/docs/api/
• JBoss CDI Java EE http://docs.jboss.org/cdi/spec/1.1/cdi-spec.html
• SpringFox https://springfox.github.io/springfox/docs/current/
Asciidoc is Widely Used
31
Migration from
Swagger
Челове с	рюкзаком
Карта	с	маршрутом
IMG http://www.visolve.com/migration.php 32
Step 1: use swagger2markup (plug-in/dependency)
33
swagger2markup
paths
overview
definitions
security
Converted
From
Swagger
http://
Step 2: no TDDoc at this stage
34
DocumentTests TemplateSnippets
Converted
From
Swagger
Step 3: start using Spring Rest Docs
35
DocumentTests TemplateSnippets
Converted
From
Swagger
Spring
Rest Docs
Step 4: continue adding more sections
36
DocumentTests TemplateSnippets
Converted
From
Swagger
Spring
Rest Docs
Spring
Rest Docs
Step 5: all sections are under TDDoc control
37
DocumentTests TemplateSnippets
Spring
Rest Docs
Spring
Rest Docs
Spring
Rest Docs
Summary
38
Sources https://github.com/tsypuk/springrestdoc
39
Q&A
40
@tsypuk_r
tsypuk.conf@gmail.com
IMG http://www.melaclaro.com/
Links useful resources
• https://martinfowler.com/articles/richardsonMaturityModel.html
• https://www.tothepoint.company/blog/spring-rest-doc/
• https://opencredo.com/rest-api-tooling-review/
• https://speakerdeck.com/ankinson/documenting-restful-apis-webinar
• https://speakerdeck.com/ankinson/documenting-restful-apis-webinar
• https://projects.spring.io/spring-restdocs/
• https://causecode.com/blog/60/documenting-rest-api-grails-318-with-spring-rest-docs
• http://ditaa.sourceforge.net
• http://asciidoctor.org/docs/what-is-asciidoc/
41

More Related Content

What's hot

Making the Most of Your Gradle Build
Making the Most of Your Gradle BuildMaking the Most of Your Gradle Build
Making the Most of Your Gradle Build
Andres Almiray
 
Regex Considered Harmful: Use Rosie Pattern Language Instead
Regex Considered Harmful: Use Rosie Pattern Language InsteadRegex Considered Harmful: Use Rosie Pattern Language Instead
Regex Considered Harmful: Use Rosie Pattern Language Instead
All Things Open
 
Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発
Recruit Lifestyle Co., Ltd.
 
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
EPAM_Systems_Bulgaria
 
The Gradle in Ratpack: Dissected
The Gradle in Ratpack: DissectedThe Gradle in Ratpack: Dissected
The Gradle in Ratpack: Dissected
David Carr
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring Session
David Gómez García
 
Drools 6.0 (Red Hat Summit)
Drools 6.0 (Red Hat Summit)Drools 6.0 (Red Hat Summit)
Drools 6.0 (Red Hat Summit)
Mark Proctor
 
Journée DevOps : Des dashboards pour tous avec ElasticSearch, Logstash et Kibana
Journée DevOps : Des dashboards pour tous avec ElasticSearch, Logstash et KibanaJournée DevOps : Des dashboards pour tous avec ElasticSearch, Logstash et Kibana
Journée DevOps : Des dashboards pour tous avec ElasticSearch, Logstash et Kibana
Publicis Sapient Engineering
 
Logstash
LogstashLogstash
Logstash
琛琳 饶
 
Docker Logging and analysing with Elastic Stack
Docker Logging and analysing with Elastic StackDocker Logging and analysing with Elastic Stack
Docker Logging and analysing with Elastic Stack
Jakub Hajek
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
Mail.ru Group
 
Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud
Shekhar Gulati
 
Altitude NY 2018: Programming the edge workshop
Altitude NY 2018: Programming the edge workshopAltitude NY 2018: Programming the edge workshop
Altitude NY 2018: Programming the edge workshop
Fastly
 
We Are All Testers Now: The Testing Pyramid and Front-End Development
We Are All Testers Now: The Testing Pyramid and Front-End DevelopmentWe Are All Testers Now: The Testing Pyramid and Front-End Development
We Are All Testers Now: The Testing Pyramid and Front-End Development
All Things Open
 
Monitoring with Graylog - a modern approach to monitoring?
Monitoring with Graylog - a modern approach to monitoring?Monitoring with Graylog - a modern approach to monitoring?
Monitoring with Graylog - a modern approach to monitoring?
inovex GmbH
 
Retrofit
RetrofitRetrofit
Retrofit
bresiu
 
Contract-driven development with OpenAPI 3 and Vert.x | DevNation Tech Talk
Contract-driven development with OpenAPI 3 and Vert.x | DevNation Tech TalkContract-driven development with OpenAPI 3 and Vert.x | DevNation Tech Talk
Contract-driven development with OpenAPI 3 and Vert.x | DevNation Tech Talk
Red Hat Developers
 
A Modest Introduction To Swift
A Modest Introduction To SwiftA Modest Introduction To Swift
A Modest Introduction To Swift
John Anderson
 
Drools 6.0 (JudCon 2013)
Drools 6.0 (JudCon 2013)Drools 6.0 (JudCon 2013)
Drools 6.0 (JudCon 2013)
Mark Proctor
 
Distributed Eventing in OSGi - Carsten Ziegeler
Distributed Eventing in OSGi - Carsten ZiegelerDistributed Eventing in OSGi - Carsten Ziegeler
Distributed Eventing in OSGi - Carsten Ziegeler
mfrancis
 

What's hot (20)

Making the Most of Your Gradle Build
Making the Most of Your Gradle BuildMaking the Most of Your Gradle Build
Making the Most of Your Gradle Build
 
Regex Considered Harmful: Use Rosie Pattern Language Instead
Regex Considered Harmful: Use Rosie Pattern Language InsteadRegex Considered Harmful: Use Rosie Pattern Language Instead
Regex Considered Harmful: Use Rosie Pattern Language Instead
 
Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発
 
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
Tech Talks_25.04.15_Session 3_Tibor Sulyan_Distributed coordination with zook...
 
The Gradle in Ratpack: Dissected
The Gradle in Ratpack: DissectedThe Gradle in Ratpack: Dissected
The Gradle in Ratpack: Dissected
 
Managing user's data with Spring Session
Managing user's data with Spring SessionManaging user's data with Spring Session
Managing user's data with Spring Session
 
Drools 6.0 (Red Hat Summit)
Drools 6.0 (Red Hat Summit)Drools 6.0 (Red Hat Summit)
Drools 6.0 (Red Hat Summit)
 
Journée DevOps : Des dashboards pour tous avec ElasticSearch, Logstash et Kibana
Journée DevOps : Des dashboards pour tous avec ElasticSearch, Logstash et KibanaJournée DevOps : Des dashboards pour tous avec ElasticSearch, Logstash et Kibana
Journée DevOps : Des dashboards pour tous avec ElasticSearch, Logstash et Kibana
 
Logstash
LogstashLogstash
Logstash
 
Docker Logging and analysing with Elastic Stack
Docker Logging and analysing with Elastic StackDocker Logging and analysing with Elastic Stack
Docker Logging and analysing with Elastic Stack
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
 
Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud Java(ee) mongo db applications in the cloud
Java(ee) mongo db applications in the cloud
 
Altitude NY 2018: Programming the edge workshop
Altitude NY 2018: Programming the edge workshopAltitude NY 2018: Programming the edge workshop
Altitude NY 2018: Programming the edge workshop
 
We Are All Testers Now: The Testing Pyramid and Front-End Development
We Are All Testers Now: The Testing Pyramid and Front-End DevelopmentWe Are All Testers Now: The Testing Pyramid and Front-End Development
We Are All Testers Now: The Testing Pyramid and Front-End Development
 
Monitoring with Graylog - a modern approach to monitoring?
Monitoring with Graylog - a modern approach to monitoring?Monitoring with Graylog - a modern approach to monitoring?
Monitoring with Graylog - a modern approach to monitoring?
 
Retrofit
RetrofitRetrofit
Retrofit
 
Contract-driven development with OpenAPI 3 and Vert.x | DevNation Tech Talk
Contract-driven development with OpenAPI 3 and Vert.x | DevNation Tech TalkContract-driven development with OpenAPI 3 and Vert.x | DevNation Tech Talk
Contract-driven development with OpenAPI 3 and Vert.x | DevNation Tech Talk
 
A Modest Introduction To Swift
A Modest Introduction To SwiftA Modest Introduction To Swift
A Modest Introduction To Swift
 
Drools 6.0 (JudCon 2013)
Drools 6.0 (JudCon 2013)Drools 6.0 (JudCon 2013)
Drools 6.0 (JudCon 2013)
 
Distributed Eventing in OSGi - Carsten Ziegeler
Distributed Eventing in OSGi - Carsten ZiegelerDistributed Eventing in OSGi - Carsten Ziegeler
Distributed Eventing in OSGi - Carsten Ziegeler
 

Similar to Test Driven Documentation with Spring Rest Docs JEEConf2017

Python & Django TTT
Python & Django TTTPython & Django TTT
Python & Django TTT
kevinvw
 
Test-Driven Documentation for your REST(ful) service
Test-Driven Documentation for your REST(ful) serviceTest-Driven Documentation for your REST(ful) service
Test-Driven Documentation for your REST(ful) service
Jeroen Reijn
 
Software Supply Chains for DevOps @ InfoQ Live 2021
Software Supply Chains for DevOps @ InfoQ Live 2021Software Supply Chains for DevOps @ InfoQ Live 2021
Software Supply Chains for DevOps @ InfoQ Live 2021
Aysylu Greenberg
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code gen
koji lin
 
2018 (codeone) Graal VM and MicroProfile a polyglot microservices solution [d...
2018 (codeone) Graal VM and MicroProfile a polyglot microservices solution [d...2018 (codeone) Graal VM and MicroProfile a polyglot microservices solution [d...
2018 (codeone) Graal VM and MicroProfile a polyglot microservices solution [d...
César Hernández
 
Research software and Dataverse
Research software and DataverseResearch software and Dataverse
Research software and Dataverse
philipdurbin
 
GraalVM and MicroProfile - A Polyglot Microservices Solution
GraalVM and MicroProfile - A Polyglot Microservices SolutionGraalVM and MicroProfile - A Polyglot Microservices Solution
GraalVM and MicroProfile - A Polyglot Microservices Solution
Roberto Cortez
 
Jersey
JerseyJersey
Jersey
Yung-Lin Ho
 
Make BDD great again
Make BDD great againMake BDD great again
Make BDD great again
Yana Gusti
 
Phoenix + Reactで 社内システムを 密かに作ってる
Phoenix + Reactで 社内システムを 密かに作ってるPhoenix + Reactで 社内システムを 密かに作ってる
Phoenix + Reactで 社内システムを 密かに作ってる
Takahiro Kobaru
 
GraphQL - The new "Lingua Franca" for API-Development
GraphQL - The new "Lingua Franca" for API-DevelopmentGraphQL - The new "Lingua Franca" for API-Development
GraphQL - The new "Lingua Franca" for API-Development
jexp
 
DevQuiz 2011 の模範解答 Android編
DevQuiz 2011 の模範解答 Android編DevQuiz 2011 の模範解答 Android編
DevQuiz 2011 の模範解答 Android編
Makoto Yamazaki
 
React inter3
React inter3React inter3
React inter3
Oswald Campesato
 
Fast Data Intelligence in the IoT - real-time data analytics with Spark
Fast Data Intelligence in the IoT - real-time data analytics with SparkFast Data Intelligence in the IoT - real-time data analytics with Spark
Fast Data Intelligence in the IoT - real-time data analytics with Spark
Bas Geerdink
 
RDF Validation in a Linked Data World - A vision beyond structural and value ...
RDF Validation in a Linked Data World - A vision beyond structural and value ...RDF Validation in a Linked Data World - A vision beyond structural and value ...
RDF Validation in a Linked Data World - A vision beyond structural and value ...
Nandana Mihindukulasooriya
 
High-level Programming Languages: Apache Pig and Pig Latin
High-level Programming Languages: Apache Pig and Pig LatinHigh-level Programming Languages: Apache Pig and Pig Latin
High-level Programming Languages: Apache Pig and Pig Latin
Pietro Michiardi
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
Doris Chen
 
Improving code quality with Roslyn analyzers
Improving code quality with Roslyn analyzersImproving code quality with Roslyn analyzers
Improving code quality with Roslyn analyzers
Jim Wooley
 
Webinar: Simplifying Persistence for Java and MongoDB
Webinar: Simplifying Persistence for Java and MongoDBWebinar: Simplifying Persistence for Java and MongoDB
Webinar: Simplifying Persistence for Java and MongoDB
MongoDB
 
Everything-as-code – Polyglotte Entwicklung in der Praxis
Everything-as-code – Polyglotte Entwicklung in der PraxisEverything-as-code – Polyglotte Entwicklung in der Praxis
Everything-as-code – Polyglotte Entwicklung in der Praxis
QAware GmbH
 

Similar to Test Driven Documentation with Spring Rest Docs JEEConf2017 (20)

Python & Django TTT
Python & Django TTTPython & Django TTT
Python & Django TTT
 
Test-Driven Documentation for your REST(ful) service
Test-Driven Documentation for your REST(ful) serviceTest-Driven Documentation for your REST(ful) service
Test-Driven Documentation for your REST(ful) service
 
Software Supply Chains for DevOps @ InfoQ Live 2021
Software Supply Chains for DevOps @ InfoQ Live 2021Software Supply Chains for DevOps @ InfoQ Live 2021
Software Supply Chains for DevOps @ InfoQ Live 2021
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code gen
 
2018 (codeone) Graal VM and MicroProfile a polyglot microservices solution [d...
2018 (codeone) Graal VM and MicroProfile a polyglot microservices solution [d...2018 (codeone) Graal VM and MicroProfile a polyglot microservices solution [d...
2018 (codeone) Graal VM and MicroProfile a polyglot microservices solution [d...
 
Research software and Dataverse
Research software and DataverseResearch software and Dataverse
Research software and Dataverse
 
GraalVM and MicroProfile - A Polyglot Microservices Solution
GraalVM and MicroProfile - A Polyglot Microservices SolutionGraalVM and MicroProfile - A Polyglot Microservices Solution
GraalVM and MicroProfile - A Polyglot Microservices Solution
 
Jersey
JerseyJersey
Jersey
 
Make BDD great again
Make BDD great againMake BDD great again
Make BDD great again
 
Phoenix + Reactで 社内システムを 密かに作ってる
Phoenix + Reactで 社内システムを 密かに作ってるPhoenix + Reactで 社内システムを 密かに作ってる
Phoenix + Reactで 社内システムを 密かに作ってる
 
GraphQL - The new "Lingua Franca" for API-Development
GraphQL - The new "Lingua Franca" for API-DevelopmentGraphQL - The new "Lingua Franca" for API-Development
GraphQL - The new "Lingua Franca" for API-Development
 
DevQuiz 2011 の模範解答 Android編
DevQuiz 2011 の模範解答 Android編DevQuiz 2011 の模範解答 Android編
DevQuiz 2011 の模範解答 Android編
 
React inter3
React inter3React inter3
React inter3
 
Fast Data Intelligence in the IoT - real-time data analytics with Spark
Fast Data Intelligence in the IoT - real-time data analytics with SparkFast Data Intelligence in the IoT - real-time data analytics with Spark
Fast Data Intelligence in the IoT - real-time data analytics with Spark
 
RDF Validation in a Linked Data World - A vision beyond structural and value ...
RDF Validation in a Linked Data World - A vision beyond structural and value ...RDF Validation in a Linked Data World - A vision beyond structural and value ...
RDF Validation in a Linked Data World - A vision beyond structural and value ...
 
High-level Programming Languages: Apache Pig and Pig Latin
High-level Programming Languages: Apache Pig and Pig LatinHigh-level Programming Languages: Apache Pig and Pig Latin
High-level Programming Languages: Apache Pig and Pig Latin
 
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
jQuery Makes Writing JavaScript Fun Again (for HTML5 User Group)
 
Improving code quality with Roslyn analyzers
Improving code quality with Roslyn analyzersImproving code quality with Roslyn analyzers
Improving code quality with Roslyn analyzers
 
Webinar: Simplifying Persistence for Java and MongoDB
Webinar: Simplifying Persistence for Java and MongoDBWebinar: Simplifying Persistence for Java and MongoDB
Webinar: Simplifying Persistence for Java and MongoDB
 
Everything-as-code – Polyglotte Entwicklung in der Praxis
Everything-as-code – Polyglotte Entwicklung in der PraxisEverything-as-code – Polyglotte Entwicklung in der Praxis
Everything-as-code – Polyglotte Entwicklung in der Praxis
 

More from Roman Tsypuk

Amazon Alexa: How to talk with your Smart Home devices
Amazon Alexa:  How to talk with your Smart Home devicesAmazon Alexa:  How to talk with your Smart Home devices
Amazon Alexa: How to talk with your Smart Home devices
Roman Tsypuk
 
Voice control with Amazon Alexa(for pacemaker conf)
Voice control with Amazon Alexa(for pacemaker conf)Voice control with Amazon Alexa(for pacemaker conf)
Voice control with Amazon Alexa(for pacemaker conf)
Roman Tsypuk
 
Web Security training for Lohika.
Web Security training for Lohika.Web Security training for Lohika.
Web Security training for Lohika.
Roman Tsypuk
 
Effective Java. By materials of Josch Bloch's book
Effective Java. By materials of Josch Bloch's bookEffective Java. By materials of Josch Bloch's book
Effective Java. By materials of Josch Bloch's book
Roman Tsypuk
 
Java agents are watching your ByteCode
Java agents are watching your ByteCodeJava agents are watching your ByteCode
Java agents are watching your ByteCode
Roman Tsypuk
 
IoT. GPS in our cars.
IoT. GPS in our cars.IoT. GPS in our cars.
IoT. GPS in our cars.
Roman Tsypuk
 

More from Roman Tsypuk (6)

Amazon Alexa: How to talk with your Smart Home devices
Amazon Alexa:  How to talk with your Smart Home devicesAmazon Alexa:  How to talk with your Smart Home devices
Amazon Alexa: How to talk with your Smart Home devices
 
Voice control with Amazon Alexa(for pacemaker conf)
Voice control with Amazon Alexa(for pacemaker conf)Voice control with Amazon Alexa(for pacemaker conf)
Voice control with Amazon Alexa(for pacemaker conf)
 
Web Security training for Lohika.
Web Security training for Lohika.Web Security training for Lohika.
Web Security training for Lohika.
 
Effective Java. By materials of Josch Bloch's book
Effective Java. By materials of Josch Bloch's bookEffective Java. By materials of Josch Bloch's book
Effective Java. By materials of Josch Bloch's book
 
Java agents are watching your ByteCode
Java agents are watching your ByteCodeJava agents are watching your ByteCode
Java agents are watching your ByteCode
 
IoT. GPS in our cars.
IoT. GPS in our cars.IoT. GPS in our cars.
IoT. GPS in our cars.
 

Recently uploaded

Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
Octavian Nadolu
 
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
 
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
 
Empowering Growth with Best Software Development Company in Noida - Deuglo
Empowering Growth with Best Software  Development Company in Noida - DeugloEmpowering Growth with Best Software  Development Company in Noida - Deuglo
Empowering Growth with Best Software Development Company in Noida - Deuglo
Deuglo Infosystem Pvt Ltd
 
DDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systemsDDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systems
Gerardo Pardo-Castellote
 
Webinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for EmbeddedWebinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for Embedded
ICS
 
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
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
Google
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
Green Software Development
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
Alina Yurenko
 
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CDKuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
rodomar2
 
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise EditionWhy Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Envertis Software Solutions
 
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
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
Drona Infotech
 
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
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
Aftab Hussain
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
Green Software Development
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
mz5nrf0n
 

Recently uploaded (20)

Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
 
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
 
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
 
Empowering Growth with Best Software Development Company in Noida - Deuglo
Empowering Growth with Best Software  Development Company in Noida - DeugloEmpowering Growth with Best Software  Development Company in Noida - Deuglo
Empowering Growth with Best Software Development Company in Noida - Deuglo
 
DDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systemsDDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systems
 
Webinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for EmbeddedWebinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for Embedded
 
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
 
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppAI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
 
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CDKuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
 
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise EditionWhy Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
 
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
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
 
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
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
 

Test Driven Documentation with Spring Rest Docs JEEConf2017

Editor's Notes

  1. Screen X controller X methods