æè¡é¨ã® taiki45 ã§ãã
ç¾å¨ã®ã¯ãã¯ãããã§ã¯ãcookpad.com å ã®ãã¼ã¿ãå©ç¨ãããããªãããã¯ãã§ããcookpad.com ãæä¾ãã¦ããã¢ããªã±ã¼ã·ã§ã³(æ¬ä½ã¢ããªã±ã¼ã·ã§ã³)ã¨ã¯å¥ã«æ°è¦ã®ã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦è¨è¨ã»å®è£ ãã¦ãã¾ããã¾ãããã§ã«æ¬ä½ã¢ããªã±ã¼ã·ã§ã³ã®ä¸é¨ã¨ãã¦å®è£ ããã¦ãããããã¯ãã«ã¤ãã¦ãããã¬ã¼ããªããèæ ®ããªããå ´åã«ãã£ã¦ã¯ãæ¬ä½ã¢ããªã±ã¼ã·ã§ã³ããç¬ç«ããå¥ã®ã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦è¨è¨ã»å®è£ ãããã¨ãå¢ãã¦ãã¦ãã¾ãããããã®æ¬ä½ã¢ããªã±ã¼ã·ã§ã³ããæ°è¦ã«ãããã¯æ¬ä½ã¢ããªã±ã¼ã·ã§ã³ããç¬ç«ããã¦è¨è¨ã»å®è£ ããã¢ããªã±ã¼ã·ã§ã³ã®ãã¨ãããµã¼ãã¹ãã¨å¼ãã§ãã¾ããã¾ãããã®æ¬ä½ã¢ããªã±ã¼ã·ã§ã³ããç¬ç«ããããã¨ãããµã¼ãã¹åå²ãã¨å¼ãã§ãã¾ãã
å¶å¾¡ã§ããªãã»ã©ã®å·¨å¤§ãªè¤éãªã¾ã¨ã¾ããå¶å¾¡ããããã«ããã®å·¨å¤§ãªã¾ã¨ã¾ãã¨åç´ãªã¾ã¨ã¾ãã«ç¬ç«ã»åãåºãã¦åæ£ç³»ã¸ã¨åãåºãæ¹æ³ãããã¾ãããµã¼ãã¹åå²ããããã¨ã¯ãã®ããæ¹ã«æ²¿ã£ã¦ãã¦ãå°ããªã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦éçºã§ããã¡ãªããããç¬ç«ãããã¼ã ãç¬ç«ãããããã¯ãã®ã©ã¤ããµã¤ã¯ã«ãæã¦ãã¨ãã£ãã¡ãªããã享åã§ãã¾ãã䏿¹ã§ãåæ£ç³»ã§ã¯ããããæ§æããè¦ç´ éã®é¢ä¿ãããã«ãã¦æ ä¿ãããã¨ãã徿¥ã¨ã¯ç°ãªã£ãå´é¢ã®è¤éæ§ãåé¡ã«ãªã£ã¦ãã¾ãããã®é¢ä¿ãæ£ããåä½ããªãã¨ãç³»å ¨ä½ã¨ãã¦æ£ããåä½ããªããªãããã§ããä¾ãã°ããµã¼ãã¹ãã£ã¹ã«ããªã®åé¡ãçºçãããã¨ãããµã¼ãã¹éã®é£æºãä¸å®å®ã«ãªãè¤éã«ãªãã¨ãã£ããã¡ãªãããªã©ãããã¾ãããµã¼ãã¹åå²ã®ã¡ãªããã享åããéçºé度ãä¿ã¤ããã«ã¯ããã®ãã¡ãªãããè§£æ¶ãã¦ããå¿ è¦ãããã¾ãã
ä»åã¯ã忣ç°å¢åã§çããåé¡ã®1ã¤ã¨ãã¦ãµã¼ãã¹éã®ã¤ã³ãã°ã¬ã¼ã·ã§ã³ãã¹ãã«ãããåé¡ããã®è§£æ±ºã¸ã®ã¢ããã¼ãã¨ã㦠Consumer-Driven Contract testing ãã¿ã¼ã³ãããã¦ã¯ãã¯ãããã§ã®åãçµã¿ãç´¹ä»ãã¾ãã
åé¡
ã¯ãã¯ãããã§ã¯åãµã¼ãã¹éã®é£æºã«ã¯ãProtocol Buffers ã Thrift ãç¨ãã RPC ãå©ç¨ããã®ã§ã¯ãªããJSON over HTTP ãå©ç¨ããæ¹éã«ãã¦ãã¾ãããã®çç±ã¨ãã¦ã¯ãç¾ç¶ããã¾ã§ããã©ã¼ãã³ã¹ãããã«ããã¯ã«ãªã£ã¦ããªããã¨ããããã¾ãããããã®ã³ã°ã®å®¹ææ§ã Rails ã® RESTful ãªææ³ã¨ã®è¦ªåæ§ãæ¢åã®ããã«ã¦ã§ã¢ã®åå©ç¨ã¨ãã£ãéçºå¹çã®ã»ããåªå ãã¦ããããã§ãã
ã¯ãã¯ãããã§ã¯ããæ©è½ããã¼ã¿ãæä¾ããå´ã(Provider)ã¨ããã®ãã¼ã¿ãå©ç¨ããå´ã(Consumer)ã®çµåé¨åã«ãã㦠Provider ã«æ¡å¼µã®ä½å°ãæ®ãã¦ãã¾ãããããã£ã¦ãProvider ã¯ã¬ã¹ãã³ã¹ã夿´ãããã¨ãããã¾ããä¾ãã°ããã¬ã·ãåãããä½è ãããã¬ã·ãã®èª¬æãã®ãããªã¬ã·ããã¼ã¿ã1ä»¶è¿ããããªæ¶ç©ºã® API ã®ã¬ã¹ãã³ã¹ãèãã¦ã¿ã¾ãã
{ "name": "丸ãã¨éèã¨ã¹ãã¼ã ã¢ãã«ãã½ã¼ã¹æ·»ã", "author": { "id": 8510522, "name": "taiki45" }, "description": "ã¹ãã¼ãã¨ä¸¸ãã¨éèã ãã§ãããããã®ã§ãããå°ããã£ã±ãã¨ããã¢ãã«ããã¹ã¿ã¼ãã½ã¼ã¹ã絡ããã¨ã§ã¨ã¦ãããããã§ãã" }
ãã®æããããã¬ãã«ã«æ°ãã« id
ãã¼ã追å ãããã¨ããããã㯠author
ãªãã¸ã§ã¯ãã«æ°ãã« created_at
ãã¼ã追å ãããã¨ãã©ã¡ãã Consumer ã«ã¨ã£ã¦éç ´å£ç夿´ã«ãªãããã«ãConsumer ãå©ç¨ããã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªã¯æªç¥ã®ãã¼ãç¡è¦ããããã«å®è£
ããã¦ãã¾ãã
ä»ã¾ã§ã¯ãã®ãããªãµã¼ãã¹éã®çµåé¨åãã主㫠WebMock ããã㯠vcr ãæä¾ãããã¹ãããã«ãå©ç¨ãã¦ãã»ã¨ãã©åºå®ãããã¬ã¹ãã³ã¹ã使ç¨ãã¦ãã¹ããã¦ãã¾ãããããã§ã®åé¡ã¯ãProvider ãã¬ã¹ãã³ã¹ã夿´ããéã«èª¤ã£ã¦éäºæãªå¤æ´ãå«ãã¦ãã¾ããã¨ã«å¯¾ãã対å¦ã§ããéäºæãªå¤æ´ã®ä¾ã¨ãã¦ã¯ããConsumer ãå©ç¨ãã¦ãããã¼ãåé¤ãã¦ãã¾ããããå¤ã®åã夿´ããããªã©ã§ãã
åºå®ãããã¬ã¹ãã³ã¹ãä½¿ãæ¹æ³ã§ã¯ãProvider ãééã£ã¦ç ´å£ç夿´ã追å ããéã«ããã¹ããå®è¡ããæ®µéã§ã¯ç ´å£ç夿´ãæ¤ç¥ã§ãã¾ããããã®ãããProvider ããã®å¤æ´ããªãªã¼ã¹ãã¦åãã¦ãµã¼ãã¹é飿ºãå£ããäºã«æ°ãã¤ãäºæ ã«ãªã£ã¦ãã¾ãã¾ãããã®ãããªäºæ ãæ¸ããããã«ãä»ã¯å¤§ããªå¤æ´ã®åã«ã¯ Provider 㨠Consumer ã調æ´ãã¦ãã¾ãã
ããããçµç¹ã¨ãµã¼ãã¹ã®ç¬ç«æ§ãé«ãããäºãã«éåæãã¤é«ãå¹çã§ããµã¼ãã¹éçºããã«ã¯ããµã¼ãã¹é飿ºãå£ããªããã¨ããã¹ãå®è¡æã«æ¤è¨¼ããä»çµã¿ãå°å ¥ããProvider 㨠Consumer ã®èª¿æ´ã³ã¹ããæ¸ãããã¨ãå¿ è¦ã§ãã
ç ´å£ç夿´ãèªåçã«æ¤ç¥ãã容æãªæ¹æ³ã¨ãã¦ãConsumer å´ã§ã®ã¤ã³ãã°ã¬ã¼ã·ã§ã³ãã¹ãã«ããã¦å®éã® Provider ãµã¼ãã¼ãèµ·åãã¦ãã¹ãããæ¹æ³ãããã¾ããã¾ãããã®æ¹æ³ã§ã¯ãã¹ãå®è¡æéãå¢å ãã¾ããããã«ãProvider å´ã§å¤æ´ãå ããæãConsumer å´ã®æéããããã¤ã³ãã°ã¬ã¼ã·ã§ã³ãã¹ããå ¨ã¦éããªããã°ãªããªããªãã¾ãããã®ããããµã¼ãã¹éã®ä¾åãè¤éã«ãªãã«ã¤ãããã¹ãã®ã³ã¹ããä¸ãã£ã¦ãããã¯ãã¯ããããå®ç¾ãããç¶ç¶çããªããªã¼ã®å½¢ã«æ¯éããããã¦ãã¾ãã¾ãã
ã¯ãã¯ãããã§ã®åãçµã¿
ãã®ãããªåé¡ã«å¯¾ãã¦ãã¯ãã¯ãããã§ã¯ã¾ã VCR ãæ¡å¼µãã¦ãProvider ã CI ãåãæ¯ã«ã¬ã¹ãã³ã¹ãã¼ã¿ãçæã㦠Consumer ã«æ¸¡ããConsumer ã¯ãã®ã¬ã¹ãã³ã¹ãã¼ã¿ãå ã«ã¤ã³ãã°ã¬ã¼ã·ã§ã³ãã¹ããå®è¡ããæ¹æ³ãéçºãã¾ããã詳ããå 容ã¯ããã¤ã¯ããµã¼ãã¹æä»£ãä¹ãè¶ããããã«ãRack::VCRã§ããããã¢ããªã±ã¼ã·ã§ã³éãã¹ããããåç §ã§ãã¾ãããã®æ¹æ³ã§ã¯å¸¸ã«ææ°ã® Provider ã®ã¬ã¹ãã³ã¹ãã¼ã¿ã§ Consumer ã¯ãã¹ããå®è¡ã§ãã¾ãã
ãã®æ¹æ³ã¯ããç¨åº¦ãã¾ããã£ãã®ã§ãããããã¤ãåé¡ãããã¾ããã1ã¤ç®ã«ãProvider ã«å¤æ´ãããã¨ãã® Provider ã«ä¾åããå ¨ã¦ã® Consumer ã®æ¤è¨¼ããã¹ããªãã¨å®å ¨ã« Provider ã®å¤æ´ããªãªã¼ã¹ã§ããªããã¨ã§ããããã¯ãµã¼ãã¹éã®ä¾åã°ã©ããè¤éãªç¶æ³ã§ã¯ãã¹ãæéãåé¡ã«ãªã£ã¦ãã¾ãã¾ãã2ã¤ç®ã¯ãConsumer ãè¦æ±ãããªã¯ã¨ã¹ãã»ã¬ã¹ãã³ã¹ã®çµã Provider ã®å´ã§è¨è¿°ããå¿ è¦ãããç¹ã§ãããµã¼ãã¹éçºå¹çã¨ããé¢ã§ã¯ãProvider 㨠Consumer éã®èª¿æ´ã³ã¹ãã¯ãã£ã¨æ¸ããããã
ä¸è¨ã®ãããªåé¡ã解決ããããã«èª¿æ»ããã¦ã¿ãã¨ããã®å½¢ã¯å®ã¯ Integration Contract Testing æ¦ç¥ã¨å¼ã°ãã¦ãããã®ã«è¿ããã¨ãåããã¾ããããã®æ¦ç¥ã¯ Provider ãæä¾ããæ©è½ã Consumer ãå¿ è¦ã¨ããæ©è½ã Contract ã¨ãã¦ãããã ããã³ã³ãã¼ãã³ãåä½ã§ãããã® Contract ããã¹ãããææ³ã§ãã
Contract ã¯å ¥åã»åºåã®ã¹ãã¼ããå¼ã³åºããèµ·ããå¯ä½ç¨ãããã©ã¼ãã³ã¹ãªã©ã®ç¹å¾´ããæãç«ã¡ã¾ããContract ã¯å¤§å¥ããã¨3種é¡ã«ããããã¾ã:
- Provider Contract: Provider ãæä¾ããæ©è½å ¨ä½ãã«ãã¼ãã Contractã
- Consumer Contract: åã ã® Consumer ã Provider ã«è¦æ±ããæ©è½ãã«ãã¼ãã Contractã
- Consumer-Driven Contract: ãã Provider ã¸ã® Consumer Contract å ¨ã¦ã®éåã
ãã®ä¸ã§ã Consumer-Driven Contract ã«çç®ãã¾ãããã® Contract ãå©ç¨ãã¦ä»¥ä¸ã®ãããªããã»ã¹ã宿½ãããã¨ã§ãProvider-Consumer éã®çµåãç ´å£ããã¦ããªããã¨ãæ¤è¨¼ã§ãã¾ãã
- Consumer ãããç¹å®ã®ãªã¯ã¨ã¹ãã«å¯¾å¿ããæå¾ ããã¬ã¹ãã³ã¹ãå®ç¾©ããã
- Provider 㨠Consumer ã¯ãã® Contract ã«ã¤ãã¦åæããã
- Provider ã¯èªèº«ãç¶ç¶çã«ãã® Contract ãå®ãã¦ãããæ¤è¨¼ããã
ãã®ãããªãã¹ãææ³ã¯ Consumer-Driven Contract testing ãã¿ã¼ã³ã¨å¼ã°ãã¦ãã¾ãããã®ãã¿ã¼ã³ã¯ä»ã®ã¤ã³ãã°ã¬ã¼ã·ã§ã³ãã¹ãã®ææ³ã«æ¯è¼ãã¦ã次ã®ç¹ã§ã¡ãªãããããã¾ã:
- ã¤ã³ãã°ã¬ã¼ã·ã§ã³ãã¹ããã³ã³ãã¼ãã³ãåä½ã§å®çµã§ããã
- 2ã¤ä»¥ä¸ã®ãµã¼ãã¹éã®çµåã®ãã¹ãã®ããã®èª¿æ´ã³ã¹ããä½ããªãã
- Provider 㯠Consumer-Driven Contract ãå®ã£ã¦ããéããå®å¿ãã¦å¤æ´ãè¡ããã
- ã©ã® Consumer ãè¦æ±ããªããã㪠Provider Contract ã«å¯¾ã㦠Provider ã¯è²¬ä»»ãæã¤å¿ è¦ããªãã
- Consumer ã®éçºè
ãèªèº«ãä¾åãã Contract ã使ã»ã¡ã³ããã³ã¹ã§ããã
- Contract ãå®ãããªãã£ãå ´åã主ã«å½±é¿ãåããã®ã¯ Consumer å´ãªã®ã§ãProvider ããã Consumer ã®ã»ãã Contract ã«å¯¾ãã¦é¢å¿ãé«ãããããã£ã¦ Consumer ã Contract ã®ä½æã»ã¡ã³ããã³ã¹ã«è²¬ä»»ãæã¤ã»ããããé©åã§ããã
å®éã« Consumer-Driven Contract testing ãã¿ã¼ã³ãå®ç¾ããã«ã¯æ¬¡ã®ãããªä»çµã¿ãå¿ è¦ã§ã:
- Consumer ã Contract ãå®ç¾©ãã¦ãããã Provider ã«å±ããä»çµã¿ã
- Provider ã Contract ãåå¾ãã¦ããããæ¤è¨¼ããä»çµã¿ã
- (Provider ãç¶æ ãæã£ãããä»ã®ãµã¼ãã¹ã«ä¾åãã¦ããå ´å) Consumer ãç¹å®ã® Contract ã§ã® Provider ã®ç¶æ ãè¨è¿°ããProvider ããããåç¾ã§ããä»çµã¿ã
ãã®ãããªä»çµã¿ãå®è£ ãã¦ããã¼ã«ã¨ãã¦ä»£è¡¨çãªãã®ã« Pact ãããã¾ãã
ã¯ãã¯ãããã§ã¯ãç¾å¨ã¯ãã® Pact ãæ¤è¨¼ããã¨åæã«ãConsumer ã Contract ãæ¸ãæéãèªåçæãã¼ã«ã§ä»£æ¿ã§ããªããçãæ¤è¨ãã¦ãã¾ãã
ã¨ã³ã¸ãã¢åéä¸ï¼ï¼
ã¯ãã¯ãããã§ã¯ãã®ãããªææ¦çãªåé¡è§£æ±ºã«åãçµããç°å¢ããããåé¡è§£æ±ºã«åãçµã仲éãåéãã¦ãã¾ããèå³ã®ããæ¹ã¯ãã²ä¸åº¦éã³ã«æ¥ã¦ã¿ã¦ãã ããï¼ï¼
ãã¹ãã¨ã³ã¸ã㢠| ã¯ãã¯ãããæ ªå¼ä¼ç¤¾ æ¡ç¨æ å ±