SlideShare a Scribd company logo

JSON Schema と API テスト YAPC::Asia Tokyo 2014

YAPC::Asia Tokyo 2014 Talk https://www.youtube.com/watch?v=bxNMk6XP2JA

1 of 39
Download to read offline
JSON Schema と 
API テスト 
2014/08/29 (Sat) 
YAPC::Asia Tokyo 2014 
清水 直樹
自己紹介 
• 清水 直樹 (@deme0607) 
• SWET @ DeNA 
• SWET: Software Engineer in Test 
• 2013年 4月 新卒入社
自己紹介② 
• テスト用のライブラリ 
• randexp-multibyte 
• https://rubygems.org/gems/randexp-multibyte 
• Rubyist Magazine 「Ruby 初心者の新卒エンジニアが 
gem パッケージ公開に至るまで」 
• http://magazine.rubyist.net/?0046- 
RandexMultibyteGem
今日の話 
• API 結合テストとは? 
• JSON Schema とは? 
• JSON Schema を API 結合テストに活用
API結合テスト
API (単体) テスト 
API 
Server 
Test 
1. テストデータをリクエスト 
として送信 
[request] 
GET api/user 
id: 1 
[response] 
id: 1 
name: deme0607 
email: deme0607@example.com 
2. レスポンスデータを期待結果 
と比較

Recommended

Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話KEISUKE KONISHI
 
⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5⑲jQueryをおぼえよう!その5
⑲jQueryをおぼえよう!その5Nishida Kansuke
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話Daichi Koike
 
⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1⑮jQueryをおぼえよう!その1
⑮jQueryをおぼえよう!その1Nishida Kansuke
 
⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1Nishida Kansuke
 
WebデザイナのためのjQuery入門。
WebデザイナのためのjQuery入門。WebデザイナのためのjQuery入門。
WebデザイナのためのjQuery入門。Yossy Taka
 
JavaScript Basic 01
JavaScript Basic 01JavaScript Basic 01
JavaScript Basic 01Yossy Taka
 

More Related Content

What's hot

JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめYuki Ishikawa
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2Nishida Kansuke
 
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことJavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことMayu Kimura
 
JavaScript basic, jQuery animation
JavaScript basic, jQuery animationJavaScript basic, jQuery animation
JavaScript basic, jQuery animationYossy Taka
 
WordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうWordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうHishikawa Takuro
 
JavaScript Basic 02 jQuery
JavaScript Basic 02 jQueryJavaScript Basic 02 jQuery
JavaScript Basic 02 jQueryYossy Taka
 
backbone.jsの使用例 その1
backbone.jsの使用例 その1backbone.jsの使用例 その1
backbone.jsの使用例 その1Makoto Haruyama
 
コーディングが上達するコツ
コーディングが上達するコツコーディングが上達するコツ
コーディングが上達するコツevol-ni
 
HTML5マークアップの心得と作法
HTML5マークアップの心得と作法HTML5マークアップの心得と作法
HTML5マークアップの心得と作法Futomi Hatano
 
マークアップ講座 01b HTML
マークアップ講座 01b HTMLマークアップ講座 01b HTML
マークアップ講座 01b HTMLeiji sekiya
 
thymeleafさいしょの一歩
thymeleafさいしょの一歩thymeleafさいしょの一歩
thymeleafさいしょの一歩Yuichi Hasegawa
 
ウェブから情報をあつめる
ウェブから情報をあつめるウェブから情報をあつめる
ウェブから情報をあつめるShuhei Iitsuka
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメKazuaki Takase
 
Active ldap の事例紹介
Active ldap の事例紹介Active ldap の事例紹介
Active ldap の事例紹介Kazuaki Takase
 
HTML5 ビギナーのための AngularJS
HTML5 ビギナーのための AngularJSHTML5 ビギナーのための AngularJS
HTML5 ビギナーのための AngularJSKenichi Kanai
 
RESTとRailsスタイル
RESTとRailsスタイルRESTとRailsスタイル
RESTとRailsスタイルToru Kawamura
 
HTML仕様書を読んでみよう
HTML仕様書を読んでみようHTML仕様書を読んでみよう
HTML仕様書を読んでみようSaeki Tominaga
 
[JANOG38]Peeringの見える化を自力でやってみた。
[JANOG38]Peeringの見える化を自力でやってみた。[JANOG38]Peeringの見える化を自力でやってみた。
[JANOG38]Peeringの見える化を自力でやってみた。Yutaka Kumamoto
 
JavaScript04 jquery プラグインを使おう
JavaScript04 jquery プラグインを使おうJavaScript04 jquery プラグインを使おう
JavaScript04 jquery プラグインを使おうYossy Taka
 

What's hot (20)

JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめ
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 
JavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなことJavaScriptで出来る、あんなことこんなこと
JavaScriptで出来る、あんなことこんなこと
 
JavaScript basic, jQuery animation
JavaScript basic, jQuery animationJavaScript basic, jQuery animation
JavaScript basic, jQuery animation
 
WordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうWordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょう
 
JavaScript Basic 02 jQuery
JavaScript Basic 02 jQueryJavaScript Basic 02 jQuery
JavaScript Basic 02 jQuery
 
backbone.jsの使用例 その1
backbone.jsの使用例 その1backbone.jsの使用例 その1
backbone.jsの使用例 その1
 
コーディングが上達するコツ
コーディングが上達するコツコーディングが上達するコツ
コーディングが上達するコツ
 
HTML5マークアップの心得と作法
HTML5マークアップの心得と作法HTML5マークアップの心得と作法
HTML5マークアップの心得と作法
 
マークアップ講座 01b HTML
マークアップ講座 01b HTMLマークアップ講座 01b HTML
マークアップ講座 01b HTML
 
thymeleafさいしょの一歩
thymeleafさいしょの一歩thymeleafさいしょの一歩
thymeleafさいしょの一歩
 
ウェブから情報をあつめる
ウェブから情報をあつめるウェブから情報をあつめる
ウェブから情報をあつめる
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメ
 
Active ldap の事例紹介
Active ldap の事例紹介Active ldap の事例紹介
Active ldap の事例紹介
 
AWS小ネタ集
AWS小ネタ集AWS小ネタ集
AWS小ネタ集
 
HTML5 ビギナーのための AngularJS
HTML5 ビギナーのための AngularJSHTML5 ビギナーのための AngularJS
HTML5 ビギナーのための AngularJS
 
RESTとRailsスタイル
RESTとRailsスタイルRESTとRailsスタイル
RESTとRailsスタイル
 
HTML仕様書を読んでみよう
HTML仕様書を読んでみようHTML仕様書を読んでみよう
HTML仕様書を読んでみよう
 
[JANOG38]Peeringの見える化を自力でやってみた。
[JANOG38]Peeringの見える化を自力でやってみた。[JANOG38]Peeringの見える化を自力でやってみた。
[JANOG38]Peeringの見える化を自力でやってみた。
 
JavaScript04 jquery プラグインを使おう
JavaScript04 jquery プラグインを使おうJavaScript04 jquery プラグインを使おう
JavaScript04 jquery プラグインを使おう
 

Similar to JSON Schema と API テスト YAPC::Asia Tokyo 2014

AWS SDK for Smalltalk
AWS SDK for SmalltalkAWS SDK for Smalltalk
AWS SDK for SmalltalkSho Yoshida
 
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaScala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaKazuhiro Sera
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...Naoya Ito
 
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)Koichi Sakata
 
AWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic BeanstalkAWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic BeanstalkAmazon Web Services Japan
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractTakeshi Ogawa
 
Introduction of aws-cli
Introduction of aws-cliIntroduction of aws-cli
Introduction of aws-cliMasaaki HIROSE
 
bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話洋史 東平
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiTomohiro Kumagai
 
負荷テストことはじめ
負荷テストことはじめ負荷テストことはじめ
負荷テストことはじめKazumune Katagiri
 
WordPressで制御するこれからのIoT
WordPressで制御するこれからのIoTWordPressで制御するこれからのIoT
WordPressで制御するこれからのIoTYuriko IKEDA
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017Shigeru Hanada
 
named_scope more detail - WebCareer
named_scope more detail - WebCareernamed_scope more detail - WebCareer
named_scope more detail - WebCareerKyosuke MOROHASHI
 
Azure サービスを活用して作るフルマネージドな全文検索アプリケーション
Azure サービスを活用して作るフルマネージドな全文検索アプリケーションAzure サービスを活用して作るフルマネージドな全文検索アプリケーション
Azure サービスを活用して作るフルマネージドな全文検索アプリケーションYoichi Kawasaki
 
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめElasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ朋哉 池田
 
AWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroAWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroVOYAGE GROUP
 
AWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroAWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroKenta Suzuki
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
Ember.js Tokyo event 2014/09/22 (Japanese)
Ember.js Tokyo event  2014/09/22 (Japanese)Ember.js Tokyo event  2014/09/22 (Japanese)
Ember.js Tokyo event 2014/09/22 (Japanese)Yuki Shimada
 

Similar to JSON Schema と API テスト YAPC::Asia Tokyo 2014 (20)

AWS SDK for Smalltalk
AWS SDK for SmalltalkAWS SDK for Smalltalk
AWS SDK for Smalltalk
 
Scala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscalaScala が支える医療系ウェブサービス #jissenscala
Scala が支える医療系ウェブサービス #jissenscala
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
クリスマスを支える俺たちとJava(JJUG CCC 2015 Spring AB4)
 
AWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic BeanstalkAWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
 
Introduction of aws-cli
Introduction of aws-cliIntroduction of aws-cli
Introduction of aws-cli
 
bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話
 
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
負荷テストことはじめ
負荷テストことはじめ負荷テストことはじめ
負荷テストことはじめ
 
WordPressで制御するこれからのIoT
WordPressで制御するこれからのIoTWordPressで制御するこれからのIoT
WordPressで制御するこれからのIoT
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
 
named_scope more detail - WebCareer
named_scope more detail - WebCareernamed_scope more detail - WebCareer
named_scope more detail - WebCareer
 
Azure サービスを活用して作るフルマネージドな全文検索アプリケーション
Azure サービスを活用して作るフルマネージドな全文検索アプリケーションAzure サービスを活用して作るフルマネージドな全文検索アプリケーション
Azure サービスを活用して作るフルマネージドな全文検索アプリケーション
 
Apache Solr 入門
Apache Solr 入門Apache Solr 入門
Apache Solr 入門
 
Elasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめElasticsearchの基本動作まとめ
Elasticsearchの基本動作まとめ
 
AWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroAWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguro
 
AWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguroAWS SDK for Go in #jawsmeguro
AWS SDK for Go in #jawsmeguro
 
CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
Ember.js Tokyo event 2014/09/22 (Japanese)
Ember.js Tokyo event  2014/09/22 (Japanese)Ember.js Tokyo event  2014/09/22 (Japanese)
Ember.js Tokyo event 2014/09/22 (Japanese)
 

Recently uploaded

解説: Token Extensions - Solana Developer Hub Online #SolDevHub
解説: Token Extensions - Solana Developer Hub Online #SolDevHub解説: Token Extensions - Solana Developer Hub Online #SolDevHub
解説: Token Extensions - Solana Developer Hub Online #SolDevHubK Kinzal
 
20240222_Neko_IoTLT_vol9_kitazaki_v1.pdf
20240222_Neko_IoTLT_vol9_kitazaki_v1.pdf20240222_Neko_IoTLT_vol9_kitazaki_v1.pdf
20240222_Neko_IoTLT_vol9_kitazaki_v1.pdfAyachika Kitazaki
 
オリジナルNFTを発行するブロックチェーン開発ハンズオン(NFTの発行に必要なツールから実装まで)
オリジナルNFTを発行するブロックチェーン開発ハンズオン(NFTの発行に必要なツールから実装まで)オリジナルNFTを発行するブロックチェーン開発ハンズオン(NFTの発行に必要なツールから実装まで)
オリジナルNFTを発行するブロックチェーン開発ハンズオン(NFTの発行に必要なツールから実装まで)Kanta Sasaki
 
HarukiShinkawa_果樹農家が期待する行動への変容を促す仕掛け設計のための収穫作業体験者の行動観察とモデル化_仕掛学2024.pdf
HarukiShinkawa_果樹農家が期待する行動への変容を促す仕掛け設計のための収穫作業体験者の行動観察とモデル化_仕掛学2024.pdfHarukiShinkawa_果樹農家が期待する行動への変容を促す仕掛け設計のための収穫作業体験者の行動観察とモデル化_仕掛学2024.pdf
HarukiShinkawa_果樹農家が期待する行動への変容を促す仕掛け設計のための収穫作業体験者の行動観察とモデル化_仕掛学2024.pdfMatsushita Laboratory
 
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。iPride Co., Ltd.
 
scikit-learn以外の分類器でpipelineを作ってみた! いずみん
scikit-learn以外の分類器でpipelineを作ってみた! いずみんscikit-learn以外の分類器でpipelineを作ってみた! いずみん
scikit-learn以外の分類器でpipelineを作ってみた! いずみんtoshinori622
 

Recently uploaded (6)

解説: Token Extensions - Solana Developer Hub Online #SolDevHub
解説: Token Extensions - Solana Developer Hub Online #SolDevHub解説: Token Extensions - Solana Developer Hub Online #SolDevHub
解説: Token Extensions - Solana Developer Hub Online #SolDevHub
 
20240222_Neko_IoTLT_vol9_kitazaki_v1.pdf
20240222_Neko_IoTLT_vol9_kitazaki_v1.pdf20240222_Neko_IoTLT_vol9_kitazaki_v1.pdf
20240222_Neko_IoTLT_vol9_kitazaki_v1.pdf
 
オリジナルNFTを発行するブロックチェーン開発ハンズオン(NFTの発行に必要なツールから実装まで)
オリジナルNFTを発行するブロックチェーン開発ハンズオン(NFTの発行に必要なツールから実装まで)オリジナルNFTを発行するブロックチェーン開発ハンズオン(NFTの発行に必要なツールから実装まで)
オリジナルNFTを発行するブロックチェーン開発ハンズオン(NFTの発行に必要なツールから実装まで)
 
HarukiShinkawa_果樹農家が期待する行動への変容を促す仕掛け設計のための収穫作業体験者の行動観察とモデル化_仕掛学2024.pdf
HarukiShinkawa_果樹農家が期待する行動への変容を促す仕掛け設計のための収穫作業体験者の行動観察とモデル化_仕掛学2024.pdfHarukiShinkawa_果樹農家が期待する行動への変容を促す仕掛け設計のための収穫作業体験者の行動観察とモデル化_仕掛学2024.pdf
HarukiShinkawa_果樹農家が期待する行動への変容を促す仕掛け設計のための収穫作業体験者の行動観察とモデル化_仕掛学2024.pdf
 
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
AWS (Amazon Web Services) を勉強してみる おさらい 2024/02/16の勉強会で発表されたものです。
 
scikit-learn以外の分類器でpipelineを作ってみた! いずみん
scikit-learn以外の分類器でpipelineを作ってみた! いずみんscikit-learn以外の分類器でpipelineを作ってみた! いずみん
scikit-learn以外の分類器でpipelineを作ってみた! いずみん
 

JSON Schema と API テスト YAPC::Asia Tokyo 2014

  • 1. JSON Schema と API テスト 2014/08/29 (Sat) YAPC::Asia Tokyo 2014 清水 直樹
  • 2. 自己紹介 • 清水 直樹 (@deme0607) • SWET @ DeNA • SWET: Software Engineer in Test • 2013年 4月 新卒入社
  • 3. 自己紹介② • テスト用のライブラリ • randexp-multibyte • https://rubygems.org/gems/randexp-multibyte • Rubyist Magazine 「Ruby 初心者の新卒エンジニアが gem パッケージ公開に至るまで」 • http://magazine.rubyist.net/?0046- RandexMultibyteGem
  • 4. 今日の話 • API 結合テストとは? • JSON Schema とは? • JSON Schema を API 結合テストに活用
  • 6. API (単体) テスト API Server Test 1. テストデータをリクエスト として送信 [request] GET api/user id: 1 [response] id: 1 name: deme0607 email: deme0607@example.com 2. レスポンスデータを期待結果 と比較
  • 7. それだけで十分? • API は様々なコンポーネントと結合して動作 API Server User API Server DB Load Balancer / Reverse Proxy [request] [response]
  • 8. API結合テスト • 実環境で動作しているAPIを実際のクライアン トと同じ経路からテスト API Server 結合 テスト API Server DB Load Balancer / Reverse Proxy [request] [response]
  • 9. API結合テスト 実施フロー • 仕様ドキュメントから、正常系・異常系テストリク エストデータを作成 • リクエストデータ ≒ テストケース • 仕様とリクエストデータから、期待するレスポンス を定義 • テスト用クライアントからリクエストを送り、レス ポンスを検証
  • 10. 今日の話 • API 結合テストとは? • JSON Schema とは? • JSON Schema を API 結合テストに活用
  • 11. JSON Schema とは? • JSONで表現されるデータに対してデータ定義 するSchemaを記述する枠組み • json-schema.org で公開されている • 現在、draft4
  • 12. 例 • JSON データ ! • 日本語の仕様 ! ! • JSON Schema { "id": 12345678, "name": "Naoki Shimizu", "email": "deme0607@example.com" } ! { "type": "object", "properties": { "id": { "type": "integer", "minimum": 10000000 }, "name": { "type": "string" }, "email": { "type": "string", "format": "email" } } } フィールド型詳細 id integer ユーザのidを表す。 10000000以上の値。 name string ユーザの名前を表す文字列。 email string ユーザのメールアドレス。 RFC5322形式の文字列。
  • 13. JSON Schema, 何が嬉しい? • データの検証にも使える • Machine Readable なデータの定義ができるので、Validatorの 入力にできる • 仕様と実装の乖離が減る • 上記のようなValidatorを活用し、APIのリクエスト・レスポン スを検証 • グローバル対応 • JSONは機械にも人間にも読みやすい
  • 14. • Validator を使ってAPIサーバのリクエスト・レスポンスのSchemaとの整合性を検証 • perl-JSV: Perlのデータに対する JSON Schema Validator • https://github.com/zigorou/perl-JSV use JSON; use JSV::Validator; my $request = { id => 12345678, name => "Naoki Shimizu", email => "deme0607@example.com", }; my $schema = decode_json($json_file); my $validator = JSV::Validator-­‐>new; my $result = $validator-­‐>validate($schema, $request); if ($result) { ...
  • 15. JSON Schema について詳しくは WEB+DB Press vol.82 特集1 「Web API デザインの鉄則」をご覧ください
  • 16. 今日の話 • API 結合テストとは? • JSON Schema とは? • JSON Schema を API 結合テストに活用
  • 17. (再) API結合テスト 実施フロー • 仕様ドキュメントから、正常系・異常系テストリク エストデータを作成 • リクエストデータ ≒ テストケース • 仕様とリクエストデータから、期待するレスポンス を定義 • テスト用クライアントからリクエストを送り、レス ポンスを検証
  • 18. API 仕様が JSON Schema で書かれていたら?
  • 19. • 正常系・異常系のリクエストデータを自動生 成できるかも? • 仕様とリクエストデータから、期待するレス ポンスも自動で定義できるかも? • 仕様から、クライアントも自動生成できるか も?
  • 23. やりたいこと • JSON Schema で記述された API の仕様から • 正常系・異常系のリクエストデータ生成 • 期待するレスポンスの定義 • APIクライアントの生成
  • 24. json-fuzz-generator • JSON Schema から、そのSchemaに対して正常 系・異常系のデータを生成 • Ruby のライブラリ • 異常系のデータはFuzzingに基いている • 誤りの含まれたデータを次々に入力するテスト 手法
  • 26. 正常系データの生成 # require "json-­‐fuzz-­‐generator" # JSON::Fuzz::Generator.default_param(schema_file) { "id" => 0, "name" => "hoge", "birthday” => "1992-­‐06-­‐27" } JSON Schema の入力 ! { "title": "Basic Schema", "type": "object", "properties": { "id" : { "type": "integer", "minimum": 0 }, "name": { "type": "string" }, "birthday": { "type": "string", "format": "date" } } } 正常系データの出力
  • 27. 異常系データの生成 [ ["sample", "array"], true, 73, nil, 0.34259093948835795, "hoge", {"id"=>"a", "name"=>"hoge", "birthday"=>"1992-­‐06-­‐27"}, {"id"=>"1", "name"=>"hoge", "birthday"=>"1992-­‐06-­‐27"}, {"id"=>0.1, "name"=>"hoge", "birthday"=>"1992-­‐06-­‐27"}, {"id"=>["sample", "array"], "name"=>"hoge", "birthday"=>"1992-­‐06-­‐27"}, {"id"=>false, "name"=>"hoge", "birthday"=>"1992-­‐06-­‐27"}, {"id"=>nil, "name"=>"hoge", "birthday"=>"1992-­‐06-­‐27"}, {"id"=>0.0, "name"=>"hoge", "birthday"=>"1992-­‐06-­‐27"}, {"id"=>{}, "name"=>"hoge", "birthday"=>"1992-­‐06-­‐27"}, {"id"=>"hoge", "name"=>"hoge", "birthday"=>"1992-­‐06-­‐27"}, {"id"=>-­‐1, "name"=>"hoge", "birthday"=>"1992-­‐06-­‐27"}, {"id"=>0, "name"=>["sample", "array"], “birthday"=>"1992-­‐06-­‐27"}, ! {"id"=>0, "name"=>true, "birthday"=>"1992-­‐06-­‐27"}, {"id"=>0, "name"=>97, "birthday"=>"1992-­‐06-­‐27"}, {"id"=>0, "name"=>nil, "birthday"=>"1992-­‐06-­‐27"}, {"id"=>0, "name"=>0.7547537108664406, "birthday"=>"1992-­‐06-­‐27"}, {"id"=>0, "name"=>{}, "birthday"=>"1992-­‐06-­‐27"}, {"id"=>0, "name"=>"hoge", "birthday"=>["sample", "array"]}, {"id"=>0, "name"=>"hoge", "birthday"=>false}, {"id"=>0, "name"=>"hoge", "birthday"=>11}, {"id"=>0, "name"=>"hoge", "birthday"=>nil}, {"id"=>0, "name"=>"hoge", "birthday"=>0.5380909041403419}, {"id"=>0, "name"=>"hoge", "birthday"=>{}}, {"id"=>0, "name"=>"hoge", "birthday"=>"2010-­‐01-­‐32"}, {"id"=>0, "name"=>"hoge", "birthday"=>"n2010-­‐01-­‐01"}, {"id"=>0, "name"=>"hoge", "birthday"=>"2010-­‐1-­‐01"}, {"id"=>0, "name"=>"hoge", "birthday"=>"2010-­‐01-­‐1"}, {"id"=>0, "name"=>"hoge", "birthday"=>"2010-­‐01-­‐01n"}, ]
  • 28. JSON Schema から自動生成 したリクエストデータは、 テストケースとして十分か?
  • 30. • ドメイン知識に基づくケースは生成できない • JSON Schemaではデータのフォーマット以上のこ とは定義できない • (例) 友達にメッセージを送るAPIで、「友達でない ユーザへのメッセージ送信」という異常系リクエス ト • ドメイン知識が必要なケースの設計に集中できる
  • 31. API結合テスト 自動化への道 • リクエストデータの生成 • レスポンスの検証 • APIクライアントの生成
  • 32. リクエストデータの生成 • フォーマットによるもの • json-fuzz-generator によって生成できる • ドメインの特性によるもの • JSON Schema からの生成は不可能
  • 33. レスポンスの検証 • フォーマット • JSON Schema による Validator で可能 • perl-JSV (Perl), json-schema (Ruby) • APIのロジックに基づくもの • 例: リクエストで指定したユーザidのデータが返ってくる • JSON Schema からは不可能
  • 34. APIクライアントの自動生成 • jsonism で生成可能 (Ruby ライブラリ) client = Jsonism::Client.new(schema: schema) client.methods(false) #=> [:create_app, :delete_app, :info_app, :list_app, :update_app] # GET /apps client.list_app # GET /apps/1 client.info_app(id: 1) # POST /apps client.create_app(name: "alpha") # PATCH /apps/1 client.update_app(id: 1, name: "bravo") # DELETE /apps/1 client.delete_app(id: 1)
  • 35. API結合テスト 自動化への道 リクエスト生成レスポンス検証 クライアント 生成 フォーマットドメイン特性フォーマットロジック fuzz-json-generator ★ perl-JSV json-schema ★ jsonism ドメイン知識やロジック部分に集中したテスト設計が可能
  • 36. まとめ • JSON Schema で仕様を記述すると開発でも テストでも利点がある • JSON Schema を使って、API結合テストの自 動化に取り組んでいる • 自動化が進むと、より高品質な開発・テスト に集中できる
  • 37. ありがとうございました • json-fuzz-generator • https://rubygems.org/gems/json-fuzz-generator • Twitter • https://twitter.com/deme0607
  • 38. json-fuzz-generator要改善点 • 正常系データの複数生成 • 例: 各種境界値 • 現状、最大値・最小値が定義されているような数値は範囲内のラン ダム値を返すような実装 • 未対応のschema • pattern (正規表現) • patternにマッチする/しない文字列を自動生成 • $ref (参照) 系
  • 39. • 異常系パラメータの精度向上 • Fuzzingでは桁あふれを起こしうる数値や文字化けを起こしやすい文 字列を入力することが効果的 • 現状は単純な異常値しか生成してない • stringを期待するデータにintegerを出力 • 最大値・最小値の範囲から外れる値を出力 • プロダクトに基づくパラメータの生成 • 過去にバリデーション漏れ・問題を起こしたパラメータなど • ライブラリに同梱するのではなく、ユーザが動的に追加できる仕組 み