±à¼ÍƼö: |
±¾ÎÄ̽ÌÖÁËÈ«ÃæµÄ²âÊÔ×éºÏÓ¦¸ÃÊÇʲôÑùµÄÏìÓ¦£¬¿É¿¿ºÍ¿Éά»¤µÄ-ÎÞÂÛÄãÊÇÔÚ¹¹½¨Î¢·þÎñ¼Ü¹¹£¬Òƶ¯Ó¦Óû¹ÊÇÎïÁªÍøÉú̬ϵͳ¡£ÎÒÃÇ»¹½«Ïêϸ½éÉܹ¹½¨ÓÐЧºÍ¿É¶ÁµÄ×Ô¶¯»¯²âÊÔ¡£
±¾ÎÄÀ´×ÔÓÚÌÚÑ¶ÔÆ £¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
¡°²âÊÔ½ð×ÖËþ¡±ÊÇÒ»¸öÒþÓ÷£¬Ëü¸æËßÎÒÃǽ«Èí¼þ²âÊԷֳɲ»Í¬¿ÅÁ£¶ÈµÄͰ£¬Ò²¸ø³öÁËÎÒÃÇÓ¦¸ÃÔÚÕâЩ×éÖнøÐжàÉٴβâÊÔµÄÏë·¨¡£¾¡¹Ü²âÊÔ½ð×ÖËþµÄ¸ÅÄîÒѾ´æÔÚÁËÒ»¶Îʱ¼ä£¬µ«ÍŶÓÈÔÈ»ºÜÄÑÕýÈ·µØÊµÊ©¡£±¾ÎÄÖØÐÂ̽ÌÖÁ˲âÊÔ½ð×ÖËþµÄÔʼ¸ÅÄ²¢Õ¹Ê¾ÁËÈçºÎ½«Æä¸¶Öîʵ¼ù¡£ÌÖÂÛÄãÓ¦¸ÃÔÚ½ð×ÖËþµÄ²»Í¬²ã´ÎÉÏѰÕÒÄÄÖÖÀàÐ͵IJâÊÔ£¬²¢¸ø³öÁËÈçºÎʵÏÖÕâЩ²âÊÔµÄʵÀý¡£
Ham Vocke
Éú²ú¾ÍÐ÷Èí¼þÔÚͶÈëÉú²ú֮ǰÐèÒª½øÐвâÊÔ¡£
Ëæ×ÅÈí¼þ¿ª·¢¹æÂɵijÉÊ죬Èí¼þ²âÊÔ·½·¨Ò²ÈÕÇ÷³ÉÊì¡£¿ª·¢ÍŶӲ»ÔÙÐèÒª´óÁ¿µÄÊÖ¶¯Èí¼þ²âÊÔÈËÔ±£¬¶øÊǽ«²âÊÔ¹¤×÷×î´ó²¿·Ö×Ô¶¯»¯¡£×Ô¶¯»¯²âÊÔ¿ÉÒÔÈÃÍŶÓÔÚ¶Ìʱ¼äÄÚÖªµÀËûÃǵÄÈí¼þÓÐʲôÎÊÌ⣬¶ø²»ÊǼ¸Ìì»ò¼¸ÖÜ¡£
ÓÉ×Ô¶¯»¯²âÊÔÖúÁ¦µÄËõ¶Ì·´À¡»·Â·ÓëÃô½Ý¿ª·¢Êµ¼ù£¬³ÖÐø½»¸¶ºÍDevOpsÎÄ»¯Ð¯ÊÖ²¢½ø¡£
²ÉÓÃÓÐЧµÄÈí¼þ²âÊÔ·½·¨£¬ÍŶӿÉÒÔ¿ìËÙ¶ø×ÔÐŵØÐж¯¡£
£¨²âÊÔ£©×Ô¶¯»¯µÄÖØÒªÐÔ
Èí¼þÒѳÉΪÎÒÃÇÉú»îµÄÊÀ½çµÄÖØÒª×é³É²¿·Ö¡£ËüÔçÒѳ¬³öÁËÌá¸ßÆóҵЧÂÊÕâÒ»¸öÄ¿µÄ¡£½ñÌ죬¹«Ë¾¶¼ÊÔͼÏë·½Éè·¨³ÉΪһÁ÷µÄÊý×Ö¹«Ë¾¡£Ëæ×ÅÎÒÃÇÿ¸öÈ˶¼»áÓëÔ½À´Ô½¶àµÄÈí¼þ½øÐн»»¥¡£´´ÐµijµÂÖ»áתµÃ¸ü¿ì¡£
Èç¹ûÄãÏë¸úÉϲ½·¥£¬±ØÐëÑо¿ÈçºÎÔÚ²»ÎþÉüÖÊÁ¿µÄÇé¿öϸü¿ìµØ½»¸¶ÄãµÄÈí¼þ¡£³ÖÐø½»¸¶ÊÇÒ»ÖÖ×Ô¶¯È·±£ÄãµÄÈí¼þ¿ÉÒÔËæÊ±·¢²¼µ½Éú²ú»·¾³Öеķ½Ê½£¬¿ÉÒÔΪÄãÌṩ°ïÖú¡£Í¨¹ý³ÖÐø½»¸¶£¬¿ÉÒÔʹÓù¹½¨¹ÜµÀ×Ô¶¯²âÊÔÈí¼þ²¢½«Æä²¿Êðµ½²âÊÔºÍÉú²ú»·¾³ÖС£
ÊÖ¶¯¹¹½¨£¬²âÊԺͲ¿Êð²»¶ÏÔö¼ÓµÄÈí¼þÊýÁ¿ºÜ¿ì¾Í±äµÃ²»¿ÉÄÜÁË-³ý·ÇÄãÏ£Íû½«ËùÓÐʱ¼ä»¨·ÑÔÚÊÖ¶¯£¬Öظ´ÐԵŤ×÷¶ø²»ÊÇÌá¸ß½»¸¶Ð§ÂʵŤ×÷ÉÏ¡£

Figure 1: Use build pipelines to automatically and
reliably get your software into production
´«Í³ÉÏ£¬Èí¼þ²âÊÔ¹ýÓÚÊÖ¶¯»¯£¬Í¨¹ý½«Ó¦ÓóÌÐò²¿Êðµ½²âÊÔ»·¾³£¬È»ºóÖ´ÐÐһЩºÚºÐ²âÊÔ£¬ÀýÈ磬ͨ¹ýµã»÷ÄãµÄÓû§½çÃæÀ´²é¿´ÊÇ·ñÓÐÈκÎÎÊÌâ¡£ÕâЩ²âÊÔͨ³£ÓɲâÊԽű¾Ö¸¶¨£¬ÒÔÈ·±£²âÊÔÈËÔ±Äܹ»½øÐÐÒ»ÖÂÐÔ¼ì²é¡£
ºÜÃ÷ÏÔ£¬ÊÖ¶¯²âÊÔËùÓиü¸Ä·Ç³£ºÄʱ£¬Öظ´ÇÒ·¦Î¶¡£Öظ´ÊÇÎÞÁĵģ¬ÎÞÁĻᵼÖ´íÎ󣬲¢Ê¹ÄãÔÚ±¾ÖÜĩ֮ǰѰÕÒ²»Í¬µÄ¹¤×÷¡££¨ÒëÕß×¢£ºÒâ˼¾ÍÊÇû×öÍê¾ÍÕÒ²»Í¬µÄÊÂ×ö£©
ÐÒÔ˵ÄÊÇ£¬¶ÔÓÚÖØ¸´ÐÔÈÎÎñÓÐÒ»ÖÖ²¹¾È´ëÊ©£º×Ô¶¯»¯¡£
×Ô¶¯»¯Öظ´ÐÔ²âÊÔ¿ÉÒÔ³ÉΪÈí¼þ¿ª·¢ÈËÔ±Éú»îÖеÄÖØ´ó¸Ä±ä¡£Ê¹×Ô¶¯»¯²âÊÔ£¬Äã²»ÔÙÐèҪäĿµØ×ñѵã»÷ÐÒéÀ´¼ì²éÄãµÄÈí¼þÊÇ·ñÈÔÄÜÕý³£¹¤×÷¡£×Ô¶¯»¯ÄãµÄ²âÊÔ£¬Äã¿ÉÒԸıä´úÂë¿â¶ø²»ÓôòÑÛÇò¡£Èç¹ûÄãÔø¾³¢ÊÔ¹ýÔÚûÓÐÊʵ±µÄ²âÊÔÌ×¼þµÄÇé¿öϽøÐдó¹æÄ£µÄÖØ¹¹£¬ÎÒ¸Ò´ò¶ÄÕâ»áÊÇÒ»¸ö¶àô¿ÉŵÄÌåÑé¡£
ÄãÔõô֪µÀÄãÊÇ·ñÒâÍâµØÆÆ»µÁËijЩ¶«Î÷£¿ÄÇô£¬¾ÍÊÇÄãµã»÷ËùÓеÄÊÖ¶¯²âÊÔÓÃÀý¡£µ«ËµÊµ»°£ºÄãÕæµÄϲ»¶ÕâÑùÂð£¿
ÈçºÎ×ö´ó¹æÄ£µÄ±ä»¯µÄʱºò£¬²¢ÖªµÀÄãÊÇ·ñÔÚ¼¸ÃëÖÓÄÚÆÆ»µÁ˶«Î÷£¬Í¬Ê±ºÈÒ»¿Ú¿§·È£¿Èç¹ûÄãÎÊÎÒ£¬ÕâÑù»á¸üÓä¿ì¡£
²âÊÔ½ð×ÖËþ
Èç¹ûÄãÏëÈÏÕæ¶Ô´ýÈí¼þµÄ×Ô¶¯»¯²âÊÔ£¬Ó¦¸ÃÁ˽âÒ»¸ö¹Ø¼ü¸ÅÄ²âÊÔ½ð×ÖËþ¡£ Âõ¿Ë¡¤¿Æ¶÷ÔÚËûµÄ×Å×÷¡°ÓëÃô½Ý³É¹¦¡±Ò»ÊéÖÐÌá³öÁËÕâ¸ö¸ÅÄî¡£ÕâÊÇÒ»¸öΰ´óµÄÊÓ¾õÒþÓ÷£¬¸æËßÄã˼¿¼²»Í¬²ã´ÎµÄ²âÊÔ¡£Ëü»¹»á¸æËßÄãÔÚÿ¸öͼ²ãÉÏÒª×ö¶àÉÙ²âÊÔ¡£

Figure 2: The Test Pyramid
Mike CohnµÄÔʼ²âÊÔ½ð×ÖËþÓÉÄãµÄ²âÊÔÌ×¼þÓ¦°üº¬µÄÈý¸ö²ã×é³É£¨´Óϵ½ÉÏ£©£º
1¡¢Unit Tests
2¡¢Service Tests
3¡¢User Interface Tests
²»ÐÒµÄÊÇ£¬Èç¹û×Ðϸ¹Û²ì£¬²âÊÔ½ð×ÖËþµÄ¸ÅÄî»áÓеã¶Ì¡£ÓÐÈËÈÏΪ£¬Âó¿Ë¿Æ¶÷µÄ²âÊÔ½ð×ÖËþµÄÃüÃû»òijЩ¸ÅÄî·½Ãæ²¢²»ÀíÏ룬ÎÒ±ØÐëͬÒâ¡£´ÓÏÖ´úµÄ½Ç¶ÈÀ´¿´£¬²âÊÔ½ð×ÖËþËÆºõ¹ýÓÚ¼òµ¥»¯£¬Òò´Ë¿ÉÄÜ»á²úÉúÎ󵼡£
¾¡¹ÜÈç´Ë£¬ÓÉÓÚËüµÄ¼òµ¥ÐÔ£¬µ±½¨Á¢×Ô¼ºµÄ²âÊÔÌ×¼þʱ£¬²âÊÔ½ð×ÖËþµÄ±¾ÖÊÊÇÒ»¸öºÜºÃµÄ¾Ñé·¨Ôò¡£Äã×îºÃµÄÑ¡ÔñÊǼÇסCohn×î³õµÄ²âÊÔ½ð×ÖËþÖеÄÁ½¼þÊ£º
1¡¢Óò»Í¬µÄÁ£¶È±àд²âÊÔ
2¡¢¸ü¸ßµÄ²ã´Î£¬¸üÉٵIJâÊÔ
¼á³Ö½ð×ÖËþÐÎ×´£¬ÒÔÌá³öÒ»¸ö½¡¿µ£¬¿ìËٺͿÉά»¤µÄ²âÊÔÌ×¼þ£ºÐ´Ðí¶àС¶ø¿ìµÄµ¥Ôª²âÊÔ¡£ дһЩ¸ü´ÖÁ£¶ÈµÄ²âÊԺͼõÉٸ߼¶²âÊÔ£¬´ÓÍ·µ½Î²²âÊÔÄãµÄÓ¦ÓóÌÐò¡£
×¢Ò⣬Äã×îÖÕ²»»áµÃµ½Ò»¸ö²âÊÔ±ùä¿ÁÜ×¶£¬Õ⽫ÊÇÒ»¸öجÃÎÀ´Î¬³Ö£¬²¢ÇÒÔËÐÐʱ¼äÌ«³¤¡£
(ÒëÕß×¢£º²âÊÔ±ù¼¤Áè×¶µÄʾÒâͼ)
²»ÒªÌ«¾ÐÄàÓڿƶ÷²âÊÔ½ð×ÖËþÖе¥¸öͼ²ãµÄÃû³Æ¡£
ÊÂʵÉÏ£¬ËüÃÇ¿ÉÄÜ»áÒýÆðÎó½â£º·þÎñ²âÊÔÊÇÒ»¸öÄÑÒÔÀí½âµÄÊõÓ¿Æ¶÷±¾ÈË̸Â۵Ĺ۲ì½á¹ûÊÇÐí¶à¿ª·¢ÈËÔ±ÍêÈ«ºöÂÔÁËÕâÒ»²ã£©¡£ÔÚÖîÈçreact£¬angular£¬ember.jsµÈµ¥Ò³ÃæÓ¦ÓóÌÐò¿ò¼ÜµÄÈÕ×ÓÀUI²âÊÔÏÔÈ»²»±ØÎ»ÓÚ½ð×ÖËþµÄ×î¸ß²ã
- ÔÚÕâЩ¿ò¼ÜÖÐÄãÍêÈ«¿ÉÒÔʹÓõ¥Ôª²âÊÔ²âÊÔÄãµÄUI¡£
¿¼Âǵ½ÔʼÃû³ÆµÄȱµã£¬Ö»ÒªÔÚ´úÂë¿âºÍÍŶӵÄÌÖÂÛÖб£³ÖÒ»Ö£¬¾Í¿ÉÒÔΪ²âÊÔͼ²ãÌṩÆäËûÃû³Æ¡£
ÎÒÃÇ»áʹÓõŤ¾ßºÍ¿â
JUnit: test runner
Mockito£ºmocking dependencies
Wiremock£ºÓÃÓÚÌÞ³ýÍⲿ·þÎñ
Pact£ºÓÃÓÚ±àдCDC²âÊÔ
Selenium£ºÓÃÓÚ±àдUIÇý¶¯µÄ¶Ëµ½¶Ë²âÊÔ
REST-assured£ºÓÃÓÚ±àдREST APIÇý¶¯µÄ¶Ëµ½¶Ë²âÊÔ
Ó¦ÓÃÀý×Ó
ÎÒÒѾдÁËÒ»¸ö¼òµ¥µÄ΢·þÎñ£¬°üÀ¨Ò»¸ö²âÊÔÌ×¼þ£¬ÆäÖаüº¬²âÊÔ½ð×ÖËþÖв»Í¬²ã´ÎµÄ²âÊÔ¡£
ʾÀýÓ¦ÓóÌÐòÏÔʾÁ˵äÐ͵Ä΢·þÎñµÄÌØÕ÷¡£
ËüÌṩÁËÒ»¸öREST½Ó¿Ú£¬ÓëÊý¾Ý¿â½»»¥²¢´ÓµÚÈý·½REST·þÎñ»ñÈ¡ÐÅÏ¢¡£
ËüÔÚSpring BootÖÐʵÏÖ£¬¼´Ê¹ÄãÒÔǰ´ÓδʹÓùýSpring Boot£¬Ò²Ó¦¸Ã¿ÉÒÔÀí½â¡£
ÇëÎñ±Ø²é¿´GithubÉϵĴúÂë¡£
×ÔÊöÎļþ°üº¬ÄúÔÚ¼ÆËã»úÉÏÔËÐÐÓ¦ÓóÌÐò¼°Æä×Ô¶¯»¯²âÊÔËùÐèµÄ˵Ã÷¡£
¹¦ÄÜ
¸ÃÓ¦ÓóÌÐòµÄ¹¦Äܼܺòµ¥¡£ ËüÌṩÁËÒ»¸ö¾ßÓÐÈý¸ö¶ËµãµÄREST½Ó¿Ú£º
GET / hello ·µ»Ø¡°Hello Word¡±. ×ÜÊÇ
GET / hello{lastname} ÓÃÌṩµÄÐÕÊϲéÕÒ¸ÃÈË¡£
Èç¹ûÓÐÕâ¸öÈË£¬Ôò·µ»Ø¡±Hello{Firstname}{Lastname}¡±.
GET /weather ·µ»Øµ±Ç°µÄÌìÆø×´¿ö Hambur, Germany.
¸ß²ã¼¶½á¹¹
Ôڸ߲ã´ÎÉÏ£¬ÏµÍ³¾ßÓÐÒÔϽṹ£º

Figure 3: the high level structure of our microservice
system
ÎÒÃǵÄ΢·þÎñÌṩÁËÒ»¸ö¿ÉÒÔͨ¹ýHTTPµ÷ÓõÄREST½Ó¿Ú¡£¶ÔÓÚijЩ¶Ëµã£¬·þÎñ½«´ÓÊý¾Ý¿â»ñÈ¡ÐÅÏ¢¡£ÔÚÆäËûÇé¿öÏ£¬¸Ã·þÎñ½«Í¨¹ýHTTPµ÷ÓÃÍⲿÌìÆøAPIÀ´»ñÈ¡²¢ÏÔʾµ±Ç°ÌìÆø×´¿ö¡£
ÄÚ²¿½á¹¹
ÔÚÄÚ²¿£¬Spring·þÎñÓÐÒ»¸öµäÐ͵ÄSpringÌåϵ½á¹¹£º

Figure 4: the internal structure of our microservice
¿ØÖÆÆ÷ÀàÌṩREST¶Ëµã²¢´¦ÀíHTTPÇëÇóºÍÏìÓ¦
´æ´¢¿âÀàÓëÊý¾Ý¿â½Ó¿Ú²¢¸ºÔðÏò³Ö¾Ã´æ´¢Æ÷дÈëÊý¾ÝºÍ´Ó³Ö¾Ã´æ´¢Æ÷¶ÁÈ¡Êý¾Ý
¿Í»§¶ËÀàÓëÆäËûAPI½»»¥£¬ÔÚÎÒÃǵÄÀý×ÓÖУ¬Ëüͨ¹ýdarksky.net weather APIµÄHTTPS»ñÈ¡JSON
Domain Àಶ׽ÎÒÃǵÄdomain Ä£ÐÍ£¬°üÀ¨ÁìÓòÂß¼£¨¹«Æ½µØËµ£¬ÔÚÎÒÃǵÄÀý×ÓÖУ¬ÕâÊÇÏ൱΢²»×ãµÀµÄ£©¡£
ÓоÑéµÄSpring¿ª·¢ÈËÔ±¿ÉÄÜ×¢Òâµ½ÕâÀï¾³£Ê¹ÓõÄͼ²ãȱʧ£ºÊÜDomain-Driven DesignµÄÆô·¢£¬ºÜ¶à¿ª·¢ÈËÔ±¹¹½¨ÁËÒ»¸öÓÉ·þÎñÀà×é³ÉµÄ·þÎñ²ã¡£ÎÒ¾ö¶¨²»ÔÚ´ËÓ¦ÓóÌÐòÖаüº¬·þÎñ²ã¡£
ÆäÖÐÒ»¸öÔÒòÊÇÎÒÃǵÄÓ¦ÓóÌÐòºÜ¼òµ¥£¬·þÎñ²ã±¾À´¾ÍÊDz»±ØÒªµÄ¼ä½Ó²ã¡£ ÁíÍâÒ»¸öÊÇÎÒÈÏΪÈËÃǹý¶ÈʹÓ÷þÎñ²ã¡£ÎÒ¾³£Óöµ½ÔÚ·þÎñÀàÖв¶»ñÕû¸öÒµÎñÂß¼µÄ´úÂë¿â¡£
Domain Ä£Ðͽö½ö³ÉΪÊý¾Ý²ã£¬¶ø²»ÊÇÐÐΪ£¨Anemic Domain Model£©¡£
¶ÔÓÚÿһ¸ö²»Æ½·²µÄÓ¦ÓóÌÐòÀ´Ëµ£¬Õâ»áÀ˷ѺܶàDZÄÜÀ´±£³Ö´úÂëµÄ½á¹¹Á¼ºÃºÍ¿É²âÊÔÐÔ£¬²¢ÇÒ²»Äܳä·ÖÀûÓÃÃæÏò¶ÔÏóµÄ¹¦ÄÜ¡£
ÎÒÃǵĴ洢¿â·Ç³£¼òµ¥£¬²¢Ìṩ¼òµ¥µÄCRUD¹¦ÄÜ¡£
ΪÁ˼ò»¯´úÂ룬ÎÒʹÓÃÁËSpring Data¡£Spring DataΪÎÒÃÇÌṩÁËÒ»¸ö¼òµ¥¶øÍ¨ÓõÄCRUD´æ´¢¿âʵÏÖ£¬ÎÒÃÇ¿ÉÒÔʹÓÃËüÀ´´úÌæÎÒÃÇ×Ô¼ºµÄʵÏÖ¡£Ëü»¹¸ºÔðΪ²âÊÔÆô¶¯ÄÚ´æÊý¾Ý¿â£¬¶ø²»ÊÇÏñÉú²úÖÐÄÇÑùʹÓÃÕæÕýµÄPostgreSQLÊý¾Ý¿â¡£¿´¿´´úÂë¿â£¬ÈÃ×Ô¼ºÊìϤÄÚ²¿½á¹¹¡£Õâ¶ÔÎÒÃǵÄÏÂÒ»²½½«ÊÇÓÐÓõģº²âÊÔÓ¦ÓóÌÐò£¡
µ¥Ôª²âÊÔ
²âÊÔÌ×¼þµÄ»ù´¡½«Óɵ¥Ôª²âÊÔ×é³É¡£ÄãµÄµ¥Ôª²âÊÔÈ·±£ÄãµÄ´úÂë¿âµÄij¸öµ¥Ôª£¨ÄãµÄÊܲâÖ÷Ì⣩°´Ô¤ÆÚ¹¤×÷¡£µ¥Ôª²âÊÔ¾ßÓвâÊÔÌ×¼þÖÐËùÓвâÊÔµÄ×îС·¶Î§¡£²âÊÔÌ×¼þÖеĵ¥Ôª²âÊÔÊýÁ¿½«Ô¶Ô¶³¬¹ýÈÎºÎÆäËûÀàÐ͵IJâÊÔ¡£

Figure 5: A unit test typically replaces external
collaborators with test doubles
ʲôÊǵ¥Î»?
Èç¹ûÄãÎÊÈý¸ö²»Í¬µÄÈËÔÚµ¥Ôª²âÊÔÖеġ°µ¥Î»¡±ÊÇʲôÒâ˼£¬Äã¿ÉÄÜ»áÊÕµ½Ëĸö²»Í¬µÄ£¬Î¢ÃîµÄ´ð°¸¡£ÔÚÒ»¶¨³Ì¶ÈÉÏ£¬ÕâÊÇÒ»¸öÄã×Ô¼º¶¨ÒåµÄÎÊÌ⣬ûÓбê×¼´ð°¸¡£
Èç¹ûÄãʹÓõÄÊǹ¦ÄÜÓïÑÔ£¬Ò»¸öµ¥Î»ºÜ¿ÉÄÜÊÇÒ»¸öµ¥Ò»µÄ¹¦ÄÜ¡£ÄãµÄµ¥Ôª²âÊÔ½«µ÷ÓþßÓв»Í¬²ÎÊýµÄº¯Êý£¬²¢È·±£Ëü·µ»ØÆÚÍûÖµ¡£ÔÚÃæÏò¶ÔÏóµÄÓïÑÔÖУ¬µ¥Ôª¿ÉÒÔ´Óµ¥Ò»·½·¨µ½Õû¸öÀà¡£
ÉÆÓÚ½»¼ÊºÍ¹Â¶À
ÓÐЩÈËÈÏΪ£¬±»²âÖ÷ÌâµÄËùÓкÏ×÷Õߣ¨ÀýÈç±»²âÊԵĿγ̵÷ÓÃµÄÆäËûÀࣩ¶¼Ó¦¸ÃÓÃÄ£Äâ»ò´æ¸ù´úÌæ£¬ÒÔ»ñµÃÍêÃÀµÄ¸ôÀ룬±ÜÃ⸱×÷Óú͸´ÔӵIJâÊÔÉèÖá£
ÆäËûÈËÔòÈÏΪֻÓлºÂý»ò¸±×÷ÓýϴóµÄºÏ×÷Õߣ¨ÀýÈ磬·ÃÎÊÊý¾Ý¿â»ò½øÐÐÍøÂçµ÷ÓõÄÀࣩӦ¸Ã±»´æ¸ù»òÄ£Äâ¡£
ż¶û£¬ÈËÃǻὫÕâÁ½ÖÖ²âÊÔ±ê¼ÇΪ¹Â¶ÀµÄµ¥Ôª²âÊÔ£¬²âÊÔ½«ËùÓкÏ×÷ÕߺÍÉç½»µ¥Ôª²âÊÔ´æ´¢ÔÚÔÊÐíÓëÕæÕýºÏ×÷Õß½»Ì¸µÄ²âÊÔÖУ¨Jay
FieldsµÄ¡°ÓÐЧµØÊ¹Óõ¥Ôª²âÊÔ¹¤×÷¡±´´ÔìÁËÕâЩÊõÓ¡£Èç¹ûÄãÓпÕÏÐʱ¼ä£¬Äã¿ÉÒÔ´ò¿ª¿´Ò»Ï£¬ÔĶÁ¸ü¶à¹ØÓÚ²»Í¬Ë¼ÏëÁ÷ÅɵÄÓŵãºÍȱµã¡£
ÔÚÒ»Ìì½áÊøÊ±£¬¾ö¶¨ÊÇ·ñ½øÐе¥¶ÀµÄ»òÉç½»µ¥Ôª²âÊÔ²¢²»ÖØÒª¡£ÖØÒªµÄÊDZàд×Ô¶¯»¯²âÊÔ¡£¾ÍÎÒ¸öÈ˶øÑÔ£¬ÎÒ·¢ÏÖ×Ô¼ºÒ»Ö±¶¼ÔÚʹÓÃÕâÁ½ÖÖ·½·¨¡£Èç¹ûʹÓÃÕæÕýµÄ·½·¨£¬ºÏ×÷Õß±äµÃÞÏÞΣ¬Îһῶ¿®µØÊ¹ÓÃÄ£ÄâºÍ´æ¸ù¡£
Èç¹ûÎÒ¾õµÃ²ÎÓëµÄºÏ×÷ÕßÈÃÎÒ¶Ô²âÊÔ¸üÓÐÐÅÐÄ£¬ÄÇôÎÒÖ»»á½«ÎҵķþÎñµÄ×îÍâÃæµÄ²¿·Ö´æ¸ù¡£
Mocking and Stubbing
MocksºÍStubs ÊÇÁ½ÖÖ²»Í¬ÀàÐ͵ÄTest Doubles£¨²»Ö¹ÕâÁ½ÖÖ£©¡£Ðí¶àÈË¿ÉÒÔ»¥»»µØÊ¹ÓÃÊõÓïMockºÍStub¡£ÎÒÈÏΪÔÚÄÔº£Öо«È·±£³ÖÆäÌØ¶¨ÊôÐÔÊǼþºÃÊ¡£
Äã¿ÉÒÔʹÓÃtest doubles À´Ìæ»»ÄãÔÚÉú²úÖÐʹÓõĶÔÏ󣬲¢Ê¹ÓÃÀ´°ïÖúÄã½øÐвâÊÔµÄʵÏÖ¡£¼ò¶øÑÔÖ®£¬ËüÒâζ×ÅÓÃÒ»¸ö¼ÙµÄ°æ±¾Ìæ»»ÁËÒ»¼þÕæÊµµÄ¶«Î÷£¨ÀýÈçÒ»¸öÀ࣬ģ¿é»òº¯Êý£©¡£¼ÙµÄ°æ±¾¿´ÆðÀ´ºÍÐÐΪÏñÕæÊµµÄ¶«Î÷£¨»Ø´ðÏàͬµÄ·½·¨µ÷Óã©£¬µ«ÄãÔÚµ¥Ôª²âÊÔ¿ªÊ¼Ê±×Ô¼º¶¨ÒåµÄÔ¤Éè»ØÓ¦¡£Ê¹ÓÃtest
doubles²¢²»Ìض¨ÓÚµ¥Ôª²âÊÔ¡£¸ü¾«Ï¸µÄtest doubles¿ÉÓÃÓÚÒÔÊܿط½Ê½Ä£ÄâϵͳµÄÕû¸ö²¿·Ö¡£È»¶ø£¬ÔÚµ¥Ôª²âÊÔÖУ¬ÄãºÜ¿ÉÄÜ»áÓöµ½ºÜ¶àmockºÍstubs£¨È¡¾öÓÚÄãÊǺÏ×÷»ò¶ÀÁ¢µÄ¿ª·¢ÈËÔ±£©£¬Ö»ÊÇÒòΪºÜ¶àÏÖ´úÓïÑԺͿâÈÃÉèÖñäµÃ¼òµ¥ºÍÊæÊÊ¡£
ÎÞÂÛÄãÑ¡ÔñºÎÖÖ¼¼Êõ£¬ºÜ¿ÉÄÜÓïÑÔ±ê×¼¿â»òһЩÁ÷ÐеĵÚÈý·½¿â½«ÌṩÓÅ»¯µÄ°²×°Ä£Äâ·½·¨¡£ ÉõÖÁ´ÓÍ·¿ªÊ¼±àдÄã×Ô¼ºµÄÄ£ÄâÖ»ÊÇдһ¸ö¼ÙµÄÀà/Ä£¿é/¹¦ÄÜÓëÕæÊµµÄÏàͬµÄÇ©Ãû£¬²¢ÔÚ²âÊÔÖÐÉèÖüٵÄÀà¡£
µ¥Ôª²âÊÔÔËÐÐËٶȷdz£¿ì¡£ÔÚһ̨״¿öÁ¼ºÃµÄ»úÆ÷ÉÏ£¬Äã¿ÉÒÔÔÚ¼¸·ÖÖÓÄÚÍê³ÉÊýǧ¸öµ¥Ôª²âÊÔ¡£µ¥¶À²âÊÔС²¿·Ö´úÂë¿â£¬±ÜÃâÁ´½ÓÊý¾Ý¿â£¬Îļþϵͳ»ò´¥·¢HTTP²éѯ£¨Í¨¹ýʹÓÃÕâЩ²¿·ÖµÄmockºÍstub£©À´±£³Ö²âÊԵĿìËÙ¡£
Ò»µ©ÕÆÎÕÁ˱àдµ¥Ôª²âÊÔµÄÇÏÃÅ£¬Ä㽫»áÔ½À´Ô½Á÷ÀûµØ±àд¡£
ÌÞ³ýÍⲿÐ×÷Õߣ¬ÉèÖÃһЩÊäÈëÊý¾Ý£¬µ÷ÓòâÊÔÖ÷Ìâ²¢¼ì²é·µ»ØµÄÖµÊÇ·ñÓëÔ¤ÆÚÏà·û¡£ ¿´¿´²âÊÔÇý¶¯¿ª·¢£¬Èõ¥Ôª²âÊÔÖ¸µ¼ÄãµÄ¿ª·¢;
Èç¹ûÕýÈ·Ó¦Óã¬Ëü¿ÉÒÔ°ïÖúÄã½øÈëÒ»¸öÁ¼ºÃµÄÁ÷³Ì£¬²¢Ìá³öÁ¼ºÃµÄ¿Éά»¤Éè¼Æ£¬Í¬Ê±×Ô¶¯Éú³ÉÈ«ÃæµÄÈ«×Ô¶¯²âÊÔÌ×¼þ¡£¾¡¹ÜÈç´Ë£¬Õâ²»ÊÇÒøµ¯¡£»¹Òª¼ÌÐø£¬³¢ÊÔһϣ¬¿´¿´ËüÊÇ·ñÊʺÏÄã¡£
ÎÒÕæµÄÐèÒª²âÊÔÕâÖÖ˽Óз½·¨Âð£¿
Èç¹ûÄã·¢ÏÖ×Ô¼ºÕæµÄÐèÒª²âÊÔ˽Óз½·¨£¬ÄÇôÄãÓ¦¸ÃÍ˺óÒ»²½£¬ÎÊ×Ô¼ºÎªÊ²Ã´¡£
ÎÒºÜÈ·¶¨ÕâÊÇÒ»¸öÉè¼ÆÎÊÌ⣬¶ø²»ÊÇÒ»¸ö·¶Î§ÎÊÌâ¡£ºÜ¿ÉÄÜÄã¾õµÃÐèÒª²âÊÔÒ»¸ö˽Óз½·¨£¬ÒòΪËüºÜ¸´ÔÓ£¬²¢ÇÒͨ¹ý¸ÃÀàµÄ¹«¹²½Ó¿ÚÀ´²âÊÔÕâ¸ö·½·¨ÐèÒªºÜ¶àÞÏÞεÄÉèÖá£
ÿµ±ÎÒ·¢ÏÖ×Ô¼º´¦ÓÚÕâÖÖ×´¿öʱ£¬ÎÒͨ³£»áµÃ³ö½áÂÛ£¬ÎÒÕýÔÚ²âÊÔµÄÕâ¸öÀàÒѾ̫¸´ÔÓÁË¡£ Ëü×öµÃÌ«¶à£¬Î¥·´Á˵¥Ò»ÔðÈÎÔÔò¡ªSOLIDÔÔòÖеÄS¡£
¶ÔÎÒ¶øÑÔ£¬½â¾ö·½°¸Í¨³£Êǽ«ÔʼÀà·Ö³ÉÁ½¸öÀà¡£ ͨ³£Ö»ÐèÒªÒ»Á½·ÖÖÓµÄ˼¿¼£¬¾Í¿ÉÒÔÕÒµ½Ò»ÖÖ°ÑÒ»¸ö´ó°à¼¶·Ö³ÉÁ½¸öС°à²¢ÓиöÈËÔðÈεĺð취¡£
ÎÒ½«Ë½Óз½·¨£¨ÎÒÆÈÇÐÏëÒª²âÊÔ£©Òƶ¯µ½ÐÂÀàÖУ¬²¢ÈþÉÀàµ÷ÓÃз½·¨¡£ Voil¨¤£¬ÎÒÄÑÒÔ²âÊÔµÄ˽Óз½·¨ÏÖÔÚÊǹ«¿ªµÄ£¬¿ÉÒÔºÜÈÝÒ׵زâÊÔ¡£×îÖØÒªµÄÊÇ£¬ÎÒ¼á³Öµ¥Ò»ÔðÈÎÔÔò¸Ä½øÁËÎҵĴúÂë½á¹¹¡£
²âÊÔʲô£¿
µ¥Ôª²âÊԵĺô¦ÔÚÓÚ£¬Äã¿ÉÒÔΪËùÓÐÉú²ú´úÂëÀà±àдµ¥Ôª²âÊÔ£¬¶ø²»¹ÜËüÃǵŦÄÜ»òÄÚ²¿½á¹¹ÊôÓÚÄĸö²ã¡£Äã¿ÉÒÔÏñ²âÊÔ´æ´¢¿â£¬ÓòÀà»òÎļþ¶ÁÈ¡Æ÷Ò»Ñùµ¥Ôª²âÊÔ¿ØÖÆÆ÷¡£
Ö»Ðè¼á³Öone test class per production class£¬Äã¾ÍÓÐÁËÒ»¸öÁ¼ºÃµÄ¿ª¶Ë¡£
µ¥Ôª²âÊÔÀàÓ¦¸Ã²âÊÔ¸ÃÀàµÄ¹«¹²½Ó¿Ú¡£
˽Óз½·¨ÎÞ·¨½øÐвâÊÔ£¬ÒòΪÄãÎÞ·¨´Ó²»Í¬µÄ²âÊÔÀàÖе÷ÓÃËüÃÇ¡£ Êܱ£»¤µÄ»ò˽Óеİü¿ÉÒÔ´Ó²âÊÔÀà·ÃÎÊ£¨¿¼Âǵ½²âÊÔÀàµÄ°ü½á¹¹ÓëÉú²úÀàÏàͬ£©£¬µ«²âÊÔÕâЩ·½·¨¿ÉÄÜÒѾ̫¹ýÁË¡£
±àдµ¥Ôª²âÊÔʱÓÐÒ»ÌõϸÏߣºËüÃÇÓ¦¸ÃÈ·±£²âÊÔËùÓв»ÖØÒªµÄ´úÂë·¾¶£¨°üÀ¨¿ªÐÄ·¾¶ºÍ±ßÔµÇé¿ö£©¡£Í¬Ê±ËüÃDz»Ó¦¸ÃÓëÄãµÄʵÏÖ¹ýÓÚ½ôÃÜÏà¹Ø¡£
Ϊʲô»áÕâÑù£¿
Ì«½Ó½üÉú²ú´úÂëµÄ²âÊԺܿì±äµÃÁîÈËÌÖÑá¡£
Ö»ÒªÖØ¹¹Éú²ú´úÂ루¿ìËٻعˣºÖع¹Òâζןü¸Ä´úÂëµÄÄÚ²¿½á¹¹¶ø²»¸ü¸ÄÍⲿ¿É¼ûÐÐΪ£©£¬ÄãµÄµ¥Ôª²âÊÔ½«»áÖжϡ£
ÕâÑùÄã¾ÍʧȥÁ˵¥Ôª²âÊÔµÄÒ»´óºÃ´¦£º³äµ±´úÂë±ä¸üµÄ°²È«Íø¡£ÄãÄþÔ¸Ñá¾ëÄÇЩÿ´ÎÖØ¹¹¶¼»áʧ°ÜµÄÓÞ´À²âÊÔ£¬Õâ»áµ¼Ö¸ü¶àµÄ¹¤×÷¶ø²»ÊǰïÖú;¶øÇÒÆäËûÈË»áÏëËдÕâ¸öÓÞ´ÀµÄ²âÊÔ£¿
Äã¸Ã×öÊ²Ã´ÄØ£¿²»ÒªÔÚÄãµÄµ¥Ôª²âÊÔÖз´Ó³ÄãµÄÄÚ²¿´úÂë½á¹¹£¬·´¶ø²âÊÔ¹Û²ìÐÐΪ¡£½«
Èç¹ûÎÒÈçÊýÖµ x ºÍ y, ½á¹û»áÊÇ z Âð£¿
´úÌæÎª
Èç¹ûÎÒÊäÈëxºÍy£¬¸Ã·½·¨»áÏȵ÷ÓÃÀàA£¬È»ºóµ÷ÓÃÀàB£¬È»ºó·µ»ØÀàAµÄ½á¹û¼ÓÉÏÀàBµÄ½á¹û£¿
˽Óз½·¨Í¨³£Ó¦±»ÊÓΪʵʩϸ½Ú¡£
Õâ¾ÍÊÇΪʲôÄãÉõÖÁ²»Ó¦¸ÃÓÐÊÔ̽ËûÃǵij嶯¡£
ÎÒ¾³£Ìýµ½µ¥Ôª²âÊÔ£¨»òTDD£©µÄ·´¶ÔÕßÈÏΪ±àдµ¥Ôª²âÊÔÊǺÁÎÞÒâÒåµÄ¹¤×÷£¬ÒòΪÄã±ØÐë²âÊÔËùÓеķ½·¨²ÅÄÜÌá¸ß²âÊÔ¸²¸ÇÂÊ¡£
ËûÃǾ³£ÒýÓÃÒ»¸öÇé¾°£º¹ýÓÚÈÈÐĵÄÍŶÓÁìµ¼ÆÈʹËûÃÇΪgetterºÍsetterÒÔ¼°ËùÓÐÆäËûÖÖÀà·±ËöµÄ´úÂë±àдµ¥Ôª²âÊÔ£¬ÒÔ±ãÌṩ100£¥µÄ²âÊÔ¸²¸ÇÂÊ¡£
ÕâÓÐÌ«¶àµÄ´íÎó¡£
Êǵģ¬ÄãÓ¦¸Ã²âÊÔ¹«¹²½Ó¿Ú¡£µ«¸üÖØÒªµÄÊÇ£¬Äã²»Òª²âÊÔ²»ÖØÒªµÄ´úÂë¡£ ±ðµ£ÐÄ£¬Kent Beck˵û¹ØÏµ¡£Äã²»»á´Ó²âÊÔ¼òµ¥µÄgetter»òsetter»òÆäËû²»ÖØÒªµÄʵÏÖ£¨ÀýÈçûÓÐÈκÎÌõ¼þÂß¼£©ÖлñµÃÈκζ«Î÷¡£
½Úʡʱ¼ä£¬ÕâÊÇÄã¿ÉÒԲμӵÄÓÖÒ»´Î»áÒ飬ÍòË꣡
²âÊԽṹ
ËùÓвâÊÔµÄÁ¼ºÃ½á¹¹£¨Õâ²»½öÏÞÓÚµ¥Ôª²âÊÔ£©ÊÇÕâÑùµÄ£º
1¡¢ÉèÖòâÊÔÊý¾Ý
2¡¢ÔÚ²âÊÔÖе÷ÓÃÄãµÄ·½·¨
3¡¢¶ÏÑÔÔ¤ÆÚµÄ½á¹û±»·µ»Ø
¼ÇסÕâÖֽṹÓÐÒ»¸öºÜºÃµÄÖú¼Ç·û£º¡°ÅÅÁУ¬Ðж¯£¬¶ÏÑÔ¡±£¨Arrange, Act, Assert£©¡£
ÁíÒ»¸öÄã¿ÉÒÔʹÓõÄÁé¸ÐÀ´×ÔBDD¡£
ËüÊÇ¡°¸ø¶¨¡±(given)£¬¡°µ±¡±(when)£¬¡°È»ºó¡±(then)ÈýºÏÒ»£¬¸ø³ö·´Ó³ÁËÉèÖ㬵±·½·¨µ÷Óã¬È»ºó¶ÏÑÔ²¿·Ö¡£
ÕâÖÖģʽҲ¿ÉÒÔÓ¦ÓÃÓÚÆäËû¸ü¸ß¼¶±ðµÄ²âÊÔ¡£
ÔÚÈκÎÇé¿öÏ£¬ËûÃǶ¼ÄÜÈ·±£ÄãµÄ²âÊÔ±£³Ö¼òµ¥ºÍÒ»ÖµÄÔĶÁ¡£³ý´ËÖ®Í⣬¿¼Âǵ½ÕâÖֽṹµÄ²âÊÔÍùÍù¸ü¶Ì£¬¸ü¾ß±íÏÖÁ¦¡£
רҵµÄ²âÊÔÖúÊÖ
ÎÞÂÛÔÚÓ¦ÓóÌÐòÌåϵ½á¹¹µÄÄÄÒ»²ã£¬Äã¶¼¿ÉÒÔΪÕû¸ö´úÂë¿â±àдµ¥Ôª²âÊÔ£¬ÕâÊÇÒ»¼þÃÀÃîµÄÊÂÇé¡£¸ÃʾÀýÏÔʾÁ˶ԿØÖÆÆ÷µÄ¼òµ¥µ¥Ôª²âÊÔ¡£²»ÐÒµÄÊÇ£¬µ±Ì¸µ½SpringµÄ¿ØÖÆÆ÷ʱ£¬ÕâÖÖ·½·¨ÓÐÒ»¸öȱµã£ºSpring
MVCµÄ¿ØÖÆÆ÷´óÁ¿Ê¹ÓÃ×¢ÊÍÀ´ÉùÃ÷ËûÃÇÕýÔÚ¼àÌýÄÄЩ·¾¶£¬Ê¹ÓÃÄÄЩHTTP¶¯´Ê£¬ËûÃÇ´ÓURL·¾¶½âÎöÄÄЩ²ÎÊý»òÕß²éѯ²ÎÊýµÈµÈ¡£ÔÚµ¥Ôª²âÊÔÖмòµ¥µØµ÷ÓÃÒ»¸ö¿ØÖÆÆ÷µÄ·½·¨½«²»»á²âÊÔËùÓÐÕâЩ¹Ø¼üµÄÊÂÇé¡£ÐÒÔ˵ÄÊÇ£¬SpringµÄ¹±Ï×ÕßÌá³öÁËÒ»¸öºÜºÃµÄ²âÊÔÖúÊÖ£¬¿ÉÒÔÓÃËüÀ´±àд¸üºÃµÄ¿ØÖÆÆ÷²âÊÔ¡£È·±£¼ì²é³öMockMVC¡£Ëü¸øÄãÒ»¸öºÜºÃµÄDSL£¬Äã¿ÉÒÔʹÓÃËüÀ´¶ÔÄãµÄ¿ØÖÆÆ÷·¢³ö¼ÙµÄÇëÇ󣬲¢¼ì²éÒ»Çж¼Ã»ÎÊÌâ¡£ÎÒÔÚʾÀý´úÂë¿âÖаüº¬ÁËÒ»¸öʾÀý¡£ºÜ¶à¿ò¼Ü¶¼ÌṩÁ˲âÊÔÖúÊÖÀ´Ê¹²âÊÔ´úÂë¿âµÄijЩ·½Ãæ¸ü¼ÓÓä¿ì¡£²é¿´ÄãÑ¡ÔñµÄ¿ò¼ÜµÄÎĵµ£¬¿´¿´ËüÊÇ·ñΪÄãµÄ×Ô¶¯»¯²âÊÔÌṩÁËÓÐÓõİïÖú¡£
ʵʩµ¥Ôª²âÊÔ
ÏÖÔÚÎÒÃÇÖªµÀÒª²âÊÔʲôÒÔ¼°ÈçºÎ¹¹½¨µ¥Ôª²âÊÔ£¬ÖÕÓÚ¿ÉÒÔ¿´µ½Ò»¸öÕæÊµµÄÀý×Ó¡£
ÎÒÃÇÀ´¿´Ò»¸öExampleControllerÀàµÄ¼ò»¯°æ±¾£º

hello£¨lastname£©·½·¨µÄµ¥Ôª²âÊÔÈçÏÂËùʾ£º

ÎÒÃÇÕýÔÚʹÓÃJUnit±àдµ¥Ôª²âÊÔ£¬ÕâÊÇJavaÊÂʵÉϵıê×¼²âÊÔ¿ò¼Ü¡£ ÎÒÃÇʹÓÃMockitoÀ´Ìæ»»ÕæÕýµÄPersonRepositoryÀàºÍstubÒÔ¹©ÎÒÃDzâÊÔ¡£
Õâ¸östubÔÊÐíÎÒÃǶ¨ÒåÔÚÕâ¸ö²âÊÔÖдæ¸ù·½·¨Ó¦¸Ã·µ»ØµÄ¹ÞÍ·ÏìÓ¦¡£
StubʹÎÒÃǵIJâÊÔ¸ü¼Ó¼òµ¥£¬¿ÉÔ¤²â£¬²¢ÇÒʹÎÒÃÇÄܹ»ÇáËÉÉèÖòâÊÔÊý¾Ý¡£
ÔÚ°²ÅÅ(arrange)£¬Ðж¯(act)£¬¶ÏÑÔ(assert)½á¹¹Ö®ºó£¬ÎÒÃDZàдÁËÁ½¸öµ¥Ôª²âÊÔ -
Ò»¸öÕýÃæµÄ°¸ÀýºÍÒ»¸ö±»ËѲéµÄÈËÎÞ·¨ÕÒµ½µÄ°¸Àý¡£
µÚÒ»¸öÕýÃæµÄ²âÊÔÓÃÀý´´½¨Ò»¸öеÄÈËÎï¶ÔÏ󣬲¢¸æËßÄ£Äâ´æ´¢¿âÔÚÓá°Pan¡±×÷ΪlastName²ÎÊýµÄÖµµ÷ÓÃʱ·µ»Ø¸Ã¶ÔÏó¡£
²âÊÔÈ»ºó¼ÌÐøµ÷ÓÃÓ¦¸Ã²âÊԵķ½·¨¡£ ×îºóËü¶ÏÑÔ·µ»ØÖµµÈÓÚÔ¤ÆÚµÄ·µ»ØÖµ¡£
µÚ¶þ¸ö²âÊԵŤ×÷ÔÀíÀàËÆ£¬µ«ÔÚ³¡¾°ÖУ¬²âÊÔ·½·¨Î´ÕÒµ½¸ø¶¨²ÎÊýµÄÈË¡£
¼¯³É²âÊÔ
ËùÓÐ·ÇÆ½·²µÄÓ¦ÓóÌÐò¶¼½«ÓëÆäËû²¿·Ö£¨Êý¾Ý¿â£¬Îļþϵͳ£¬¶ÔÆäËûÓ¦ÓóÌÐòµÄÍøÂçµ÷Ó㩼¯³ÉÔÚÒ»Æð¡£
ÔÚ±àдµ¥Ôª²âÊÔʱ£¬ÕâЩͨ³£ÊÇÄãΪÁËÌṩ¸üºÃµÄ¸ôÀëºÍ¸ü¿ìµÄ²âÊÔ¶øÒÅ©µÄ²¿·Ö¡£ ¾¡¹ÜÈç´Ë£¬Ó¦ÓóÌÐòÈÔ»áÓëÆäËû²¿·Ö½øÐн»»¥£¬²¢ÐèÒª½øÐвâÊÔ¡£¼¯³É²âÊÔ¿ÉÒÔ°ïÖúÄã¡£ËûÃÇ»á²âÊÔÓ¦ÓóÌÐòÓëÓ¦ÓóÌÐòÖ®ÍâµÄËùÓв¿·ÖµÄ¼¯³É¡£
¶ÔÓÚ×Ô¶¯»¯²âÊÔ£¬ÕâÒâζ×Ų»½öÐèÒªÔËÐÐÓ¦ÓóÌÐò£¬»¹ÐèÒªÔËÐÐÕýÔÚÓëÖ®¼¯³ÉµÄ×é¼þ¡£ Èç¹ûÄãÕýÔÚ²âÊÔÓëÊý¾Ý¿âµÄ¼¯³É£¬ÔòÐèÒªÔÚÔËÐвâÊÔʱÔËÐÐÊý¾Ý¿â¡£
ΪÁ˲âÊÔÄã¿ÉÒÔ´Ó´ÅÅ̶ÁÈ¡Îļþ£¬ÐèÒª½«Îļþ±£´æµ½´ÅÅ̲¢½«Æä¼ÓÔØµ½¼¯³É²âÊÔÖС£
ÎÒ֮ǰÌáµ½¡°µ¥Ôª²âÊÔ¡±ÊÇÒ»¸öÄ£ºýµÄÊõÓ¶ÔÓÚ¡°¼¯³É²âÊÔ¡±À´Ëµ¸üÊÇÈç´Ë¡£¶ÔÓÚijЩÈËÀ´Ëµ£¬¼¯³É²âÊÔÒâζ×ÅÒª²âÊÔÕû¸öÓ¦ÓóÌÐò¶ÑÕ»ÓëϵͳÖÐµÄÆäËûÓ¦ÓóÌÐòÁ¬½Ó¡£ÎÒϲ»¶¸üÏÁյضԴý¼¯³É²âÊÔ£¬²¢ÇÒÒ»´Î²âÊÔÒ»¸ö¼¯³Éµã£¬Í¨¹ý½«test
doublesÌæ»»Îªµ¥¶ÀµÄ·þÎñºÍÊý¾Ý¿â¡£ ½áºÏºÏͬ²âÊԺͶÔtest doublesÔËÐкÏͬ²âÊÔÒÔ¼°ÕæÊµÊµÊ©£¬Äã¿ÉÒÔÌá³ö¸ü¿ì£¬¸ü¶ÀÁ¢²¢ÇÒͨ³£¸üÈÝÒ×ÍÆÀíµÄ¼¯³É²âÊÔ¡£
ÏÁյɲâÊÔ»îÔÚÄã·þÎñµÄ±ß½ç¡£
´Ó¸ÅÄîÉϽ²£¬ËüÃÇʼÖÕÊÇ´¥·¢Ò»ÖÖµ¼ÖÂÓëÍⲿ²¿·Ö£¨Îļþϵͳ£¬Êý¾Ý¿â£¬µ¥¶À·þÎñ£©¼¯³ÉµÄ²Ù×÷¡£ Êý¾Ý¿â¼¯³É²âÊÔ¿´ÆðÀ´ÏñÕâÑù£º

Figure 6: A database integration test integrates your
code with a real database
1¡¢Æô¶¯Ò»¸öÊý¾Ý¿â
2¡¢½«ÄãµÄÓ¦ÓóÌÐòÁ¬½Óµ½Êý¾Ý¿â
3¡¢ÔÚ´úÂëÖд¥·¢Ò»¸ö½«Êý¾ÝдÈëÊý¾Ý¿âµÄº¯Êý
4¡¢Í¨¹ý¶ÁÈ¡Êý¾Ý¿âÖеÄÊý¾ÝÀ´¼ì²éÔ¤ÆÚÊý¾ÝÊÇ·ñдÈëÁËÊý¾Ý¿â
ÁíÒ»¸öÀý×Ó£¬²âÊÔÄãµÄ·þÎñͨ¹ýREST APIÓëµ¥¶ÀµÄ·þÎñ¼¯³É¿ÉÄÜÊÇÕâÑùµÄ£º

Figure 7: This kind of integration test checks that
your application can communicate with a separate service
correctly
1¡¢¿ªÊ¼ÄãµÄÉêÇë
2¡¢Æô¶¯µ¥¶À·þÎñµÄÒ»¸öʵÀý£¨»òÕß¾ßÓÐÏàͬ½Ó¿ÚµÄtest double£©
3¡¢ÔÚÄãµÄ´úÂëÖд¥·¢Ò»¸ö´Ó¶ÀÁ¢·þÎñµÄAPIÖжÁÈ¡µÄº¯Êý
4¡¢¼ì²éÄãµÄÓ¦ÓóÌÐòÊÇ·ñ¿ÉÒÔÕýÈ·½âÎöÏìÓ¦
ÄãµÄ¼¯³É²âÊÔ - ±ÈÈçµ¥Ôª²âÊÔ - ¿ÉÒÔÊÇÏ൱Óڰ׺С£
ÓÐЩ¿ò¼ÜÔÊÐíÄãÆô¶¯Ó¦ÓóÌÐò£¬Í¬Ê±ÈÔÈ»¿ÉÒÔÄ£ÄâÓ¦ÓóÌÐòµÄÆäËû²¿·Ö£¬ÒÔ±ã¼ì²éÊÇ·ñ·¢ÉúÁËÕýÈ·µÄ½»»¥¡£±àд¼¯³É²âÊÔ£¬ÓÃÓÚÐòÁл¯»ò·´ÐòÁл¯Êý¾ÝµÄËùÓдúÂë¶Î¡£ÕâÖÖÇé¿ö·¢ÉúµÄƵÂʱÈÄãÏëÏóµÄÒª¶à¡£
ÏëÒ»Ï룺
µ÷ÓÃÄãµÄ·þÎñµÄREST API
¶ÁÈ¡ºÍдÈëÊý¾Ý¿â
µ÷ÓÃÆäËûÓ¦ÓóÌÐòµÄAPI
¶ÁÈ¡ºÍдÈë¶ÓÁÐ
дÈëÎļþϵͳ
Î§ÈÆÕâЩ±ß½ç±àд¼¯³É²âÊÔ¿ÉÈ·±£½«Êý¾ÝдÈëÕâЩÍⲿÐ×÷Õß²¢´ÓÖжÁÈ¡Êý¾Ý¿ÉÒÔÕý³£¹¤×÷¡£
ÔÚ±àдÏÁÕ¼¯³É²âÊÔʱ£¬Ó¦¸Ã×ÅÑÛÓÚÔÚ±¾µØÔËÐÐÍⲿÒÀÀµ¹ØÏµ£ºÆô¶¯±¾µØMySQLÊý¾Ý¿â£¬¶Ô±¾µØext4Îļþϵͳ½øÐвâÊÔ¡£Èç¹ûÄãÒªÓëµ¥¶ÀµÄ·þÎñ¼¯³É£¬ÇëÔÚ±¾µØÔËÐи÷þÎñµÄʵÀý£¬»òÕß¹¹½¨²¢ÔËÐÐÄ£·ÂÕæÊµ·þÎñÐÐΪµÄ¼Ù°æ±¾¡£Èç¹ûÎÞ·¨ÔÚ±¾µØÔËÐеÚÈý·½·þÎñ£¬ÔòӦѡÔñÔËÐÐרÓòâÊÔʵÀý£¬²¢ÔÚÔËÐм¯³É²âÊÔʱָÏò´Ë²âÊÔʵÀý¡£
±ÜÃâÔÚ×Ô¶¯»¯²âÊÔÖÐÓëʵ¼ÊÉú²úϵͳ¼¯³É¡£
½«ÊýÒÔǧ¼ÆµÄ²âÊÔÇëÇó·¢²¼µ½Éú²úϵͳÊÇÒ»ÖÖ¾ø¶ÔÈÃÈËÃÇÉúÆøµÄ·½Ê½£¬ÒòΪÄãµÄÈÕÖ¾»ìÂÒ£¨×îºÃµÄÇé¿öÏ£©£¬ÉõÖÁDoSµÄ·þÎñ£¨×µÄÇé¿ö£©¡£Í¨¹ýÍøÂ缯³É·þÎñÊǹ㷺¼¯³É²âÊԵĵäÐÍÌØÕ÷£¬²¢ÇÒʹ²âÊÔ±äµÃ¸üÂý£¬Í¨³£¸üÄÑÒÔ±àд¡£
¹ØÓÚ²âÊÔ½ð×ÖËþ£¬¼¯³É²âÊԵļ¶±ð¸ßÓÚµ¥Ôª²âÊÔ¡£
¼¯³ÉÎļþϵͳºÍÊý¾Ý¿âµÈÂýËÙ²¿¼þÍùÍù±ÈÔËÐе¥Ôª²âÊÔÒªÂýµÃ¶à£¬¶øÕâЩ²¿¼þ¶¼±»ÌÞ³ýÁË¡£±Ï¾¹£¬×÷Ϊ²âÊÔµÄÒ»²¿·Ö£¬Äã±ØÐ뿼ÂÇÍⲿÁã¼þµÄÐýת£¬ËüÃÇÒ²¿ÉÄܱÈС¶ø¹ÂÁ¢µÄµ¥Ôª²âÊÔ¸üÄѱàд¡£
²»¹ý£¬ËüÃǵÄÓÅÊÆÔÚÓÚÈÃÄúÈ·ÐÅÄúµÄÓ¦ÓóÌÐò¿ÉÒÔÕýÈ·´¦ÀíËùÐèµÄËùÓÐÍⲿ²¿¼þ¡£ µ¥Ôª²âÊÔÎÞ·¨°ïÖúÄã¡£
Êý¾Ý¿â¼¯³É
PersonRepositoryÊÇ´úÂë¿âÖÐΨһµÄ´æ´¢¿âÀà¡£ ËüÒÀÀµÓÚSpring Data£¬²¢Ã»ÓÐʵ¼ÊµÄʵÏÖ¡£
ËüÖ»ÊÇÀ©Õ¹ÁËCrudRepository½Ó¿Ú²¢ÌṩÁËÒ»¸öµ¥Ò»µÄ·½·¨Í·¡£
ÆäÓàµÄÊÇSpringħÊõ¡£

ͨ¹ýCrudRepository½Ó¿Ú£¬Spring Bootͨ¹ýfindOne£¬findAll£¬save£¬updateºÍdelete·½·¨ÌṩÁËÒ»¸ö¹¦ÄÜÍ걸µÄCRUD´æ´¢¿â¡£
ÎÒÃǵÄ×Ô¶¨Òå·½·¨¶¨Òå(findByLastName())À©Õ¹ÁËÕâ¸ö»ù±¾¹¦ÄÜ£¬²¢ÎªÎÒÃÇÌṩÁËÒ»ÖÖ°´ÐÕÊÏÌáÈ¡PersonSµÄ·½·¨¡£
Spring Data·ÖÎöÁË·½·¨µÄ·µ»ØÀàÐͼ°Æä·½·¨Ãû³Æ£¬²¢¸ù¾ÝÃüÃûÔ¼¶¨¼ì²é·½·¨Ãû³ÆÒÔÕÒ³öËüÓ¦¸Ã×öʲô¡£
ËäÈ»Spring Data¸ºÔðʵÏÖÊý¾Ý¿â´æ´¢¿â£¬µ«ÎÒÈÔÈ»±àдÁËÒ»¸öÊý¾Ý¿â¼¯³É²âÊÔ¡£ Äã¿ÉÄÜ»áÕù±ç˵£¬ÕâÊDzâÊÔ¿ò¼ÜºÍÎÒÓ¦¸Ã±ÜÃâµÄ£¬ÒòΪËü²»ÊÇÎÒÃÇÕýÔÚ²âÊԵĴúÂë¡£
²»¹ý£¬ÎÒÏàÐÅÖÁÉÙÓÐÒ»¸ö¼¯³É²âÊÔÊÇÖÁ¹ØÖØÒªµÄ¡£Ê×ÏÈËü²âÊÔÎÒÃǵÄ×Ô¶¨ÒåfindByLastName·½·¨µÄÐÐΪÈçÔ¤ÆÚ¡£
Æä´Î£¬ËüÖ¤Ã÷ÎÒÃǵĴ洢¿âÕýȷʹÓÃÁËSpringµÄ½ÓÏß²¢¿ÉÒÔÁ¬½Óµ½Êý¾Ý¿â¡£
ΪÁËÈÃÄãÔÚ»úÆ÷ÉÏÔËÐвâÊÔ±äµÃÈÝÒ×£¨ÎÞÐè°²×°PostgreSQLÊý¾Ý¿â£©£¬ÎÒÃǵIJâÊÔÁ¬½Óµ½ÄÚ´æÖеÄH2Êý¾Ý¿â¡£
ÎÒÒѾÔÚbuild.gradleÎļþÖн«H2¶¨ÒåΪ²âÊÔÒÀÀµÏî¡£testĿ¼ÖеÄapplication.propertiesûÓж¨ÒåÈκÎspring.datasourceÊôÐÔ¡£
Õâ¸æËßSpring DataʹÓÃÄÚ´æÊý¾Ý¿â¡£ÒòΪËüÔÚÀà·¾¶ÉÏ·¢ÏÖH2£¬ËùÒÔËüÔÚÔËÐÐÎÒÃǵIJâÊÔʱ½öʹÓÃH2¡£
µ±Ê¹ÓÃintÅäÖÃÎļþÔËÐÐʵ¼ÊÓ¦ÓóÌÐòʱ£¨ÀýÈ磬ͨ¹ý½«SPRING_PROFILES_ACTIVE
= intÉèÖÃΪ»·¾³±äÁ¿£©£¬Ëü½«Á¬½Óµ½application-int.propertiesÖж¨ÒåµÄPostgreSQLÊý¾Ý¿â¡£
ÎÒÖªµÀ£¬ÒªÁ˽âºÍÀí½âÕâЩSpringϸ½ÚÊǷdz£¶àµÄ¡£ÎªÁ˴ﵽĿµÄ£¬Äã±ØÐëɸѡ´óÁ¿µÄÎĵµ¡£Óɴ˲úÉúµÄ´úÂëºÜÈÝÒ×Àí½â£¬µ«Èç¹ûÄã²»Á˽âSpringµÄϸ½Ú£¬¾ÍºÜÄÑÀí½â¡£
³ý´ËÖ®Í⣬ʹÓÃÄÚ´æÊý¾Ý¿âÊÇΣÏÕµÄÒµÎñ¡£
±Ï¾¹£¬ÎÒÃǵɲâÊÔÕë¶ÔµÄÊDz»Í¬ÓÚÉú²ú»·¾³µÄ²»Í¬ÀàÐ͵ÄÊý¾Ý¿â¡£ ¼ÌÐø²¢×ÔÐоö¶¨ÊÇ·ñ¸üϲ»¶Ê¹ÓÃSpringħÊõ·½·¨ºÍ¼òµ¥µÄ´úÂ룬¶ø²»ÊǸüÃ÷È·¶ø¸üÏêϸµÄʵÏÖ¡£
ÒѾÓÐ×ã¹»µÄ½âÊÍÁË£¬ÏÂÃæÊÇÒ»¸ö¼òµ¥µÄ¼¯³É²âÊÔ£¬Ëü½«Ò»¸öPerson±£´æµ½Êý¾Ý¿âÖУ¬²¢Í¨¹ýÐÕÊÏÕÒµ½Ëü£º

Äã¿ÉÒÔ¿´µ½£¬ÎÒÃǵɲâÊÔ×ñÑÓëµ¥Ôª²âÊÔÏàͬµÄarrange(ÅÅÁÐ)£¬act(ÐÐΪ)ºÍassert(¶ÏÑÔ)½á¹¹¡£¸æËßÄ㣬ÕâÊÇÒ»¸öÆÕ±éµÄ¸ÅÄ
Óë¶ÀÁ¢·þÎñ¼¯³É
ÎÒÃǵÄ΢·þÎñÓëdarksky.net£¬Ò»¸öÌìÆøREST API½»»¥¡£µ±È»£¬ÎÒÃÇÏ£ÍûÈ·±£ÎÒÃǵķþÎñÄܹ»ÕýÈ·µØ·¢ËÍÇëÇó²¢½âÎöÏìÓ¦¡£
ÎÒÃÇÏ£ÍûÔÚÔËÐÐ×Ô¶¯»¯²âÊÔʱ±ÜÃâÅöµ½ÕæÕýµÄdarksky·þÎñÆ÷¡£
ÎÒÃÇÃâ·Ñ¼Æ»®µÄÅä¶îÏÞÖÆÖ»ÊÇÔÒòµÄÒ»²¿·Ö¡£ ÕæÕýµÄÔÒòÊǽâñî¡£ ÎÒÃÇÔÚdarksky.netµÄ²âÊÔÓ¦¸Ã¶ÀÁ¢ÓÚÆäËûÈË¡£
¼´Ê¹ÄãµÄ»úÆ÷ÎÞ·¨·ÃÎÊdarksky·þÎñÆ÷»òdarksky·þÎñÆ÷Òòά»¤¶øÍ£»ú¡£
ÔÚÔËÐÐÎÒÃǵɲâÊÔʱ£¬¿ÉÒÔͨ¹ýÔËÐÐÎÒÃÇ×Ô¼ºµÄÐé¼Ùdarksky·þÎñÆ÷À´±ÜÃâÅöµ½ÕæÕýµÄdarksky·þÎñÆ÷¡£
ÕâÌýÆðÀ´ÏñÊÇÒ»Ïî¼è¾ÞµÄÈÎÎñ¡£
ÓÉÓÚÏñWiremockÕâÑùµÄ¹¤¾ß£¬ÕâºÜÈÝÒס£ ¿´Õâ¸ö£º

ҪʹÓÃWiremock£¬ÎÒÃÇÔڹ̶¨¶Ë¿Ú£¨8089£©ÉÏʵÀý»¯Ò»¸öWireMockRule¡£ ʹÓÃDSL¿ÉÒÔÉèÖÃWiremock·þÎñÆ÷£¬¶¨ÒåËüÓ¦¸Ã¼àÌýµÄ¶Ëµã£¬²¢ÉèÖÃËüÓ¦¸ÃÏìÓ¦µÄ¹à×°ÏìÓ¦(canned
responses)¡£
½ÓÏÂÀ´ÎÒÃǵ÷ÓÃÏëÒª²âÊԵķ½·¨£¬¼´µ÷ÓõÚÈý·½·þÎñµÄ·½·¨£¬²¢¼ì²é½á¹ûÊÇ·ñÕýÈ·½âÎö¡£
Á˽â²âÊÔÈçºÎÖªµÀÓ¦¸Ãµ÷ÓÃÐéÄâµÄWiremock·þÎñÆ÷¶ø²»ÊÇÕæÕýµÄdarksky
API·Ç³£ÖØÒª¡£ ÃØÃÜÔÚÎÒÃǰüº¬ÔÚsrc / test / resourcesÖеÄapplication.propertiesÎļþÖС£ÕâÊÇÔËÐвâÊÔʱSpring¼ÓÔØµÄÊôÐÔÎļþ¡£ÔÚÕâ¸öÎļþÖУ¬ÎÒÃǸ²¸ÇÁËÏñAPI¼üºÍURLsÕâÑùµÄÅäÖã¬ÆäÖµÊʺÏÎÒÃǵIJâÊÔÄ¿µÄ£¬ÀýÈçµ÷ÓÃÐéÄâµÄWiremock·þÎñÆ÷¶ø²»ÊÇÕæÕýµÄ·þÎñÆ÷£º

Çë×¢Ò⣬ÕâÀﶨÒåµÄ¶Ë¿Ú±ØÐëÓëÎÒÃÇÔÚ²âÊÔÖÐʵÀý»¯WireMockRuleʱËù¶¨ÒåµÄ¶Ë¿ÚÏàͬ¡£
ͨ¹ýÔÚÎÒÃǵÄWeatherClientÀàµÄ¹¹Ô캯ÊýÖÐ×¢ÈëURL£¬¿ÉÒÔ½«²âÊÔÖеÄÕæÊµÌìÆøAPIµÄURLÌæ»»Îª¼ÙÌìÆø£º

ÕâÑù£¬ÎÒÃǵÄWeatherClient´ÓÓ¦ÓóÌÐòÊôÐÔÖж¨ÒåµÄweather.urlÊôÐÔÖжÁÈ¡weatherUrl²ÎÊýµÄÖµ¡£
ʹÓÃWiremockµÈ¹¤¾ßΪµ¥¶À·þÎñ±àдnarrow integration tests·Ç³£¼òµ¥¡£
²»ÐÒµÄÊÇ£¬ÕâÖÖ·½·¨ÓÐÒ»¸öȱµã£ºÎÒÃÇÈçºÎÈ·±£ÎÒÃÇÉèÖõļٷþÎñÆ÷µÄÐÐΪÏñÕæÕýµÄ·þÎñÆ÷£¿
ÔÚĿǰµÄʵʩÖУ¬µ¥¶ÀµÄ·þÎñ¿ÉÄÜ»á¸Ä±äÆäAPI£¬ÎÒÃǵIJâÊÔÈÔÈ»»áͨ¹ý¡£ ÏÖÔÚÎÒÃÇÖ»ÊDzâÊÔÎÒÃǵÄWeatherClient¿ÉÒÔ½âÎö¼Ù·þÎñÆ÷·¢Ë͵ÄÏìÓ¦¡£
ÕâÊÇÒ»¸ö¿ªÊ¼£¬µ«·Ç³£´àÈõ¡£
ʹÓö˵½¶Ë²âÊÔ²¢Õë¶ÔÕæÊµ·þÎñµÄ²âÊÔʵÀýÔËÐвâÊÔ¶ø²»ÊÇʹÓüٷþÎñ¿ÉÒÔ½â¾ö´ËÎÊÌ⣬µ«»áʹÎÒÃÇÒÀÀµÓÚ²âÊÔ·þÎñµÄ¿ÉÓÃÐÔ¡£
ÐÒÔ˵ÄÊÇ£¬ÓÐÒ»¸ö¸üºÃµÄ½â¾ö·½°¸À´½â¾öÕâ¸öÀ§¾³£º¶ÔÐé¼Ù·þÎñÆ÷ºÍÕæÊµ·þÎñÆ÷ÔËÐкÏͬ²âÊÔ¿ÉÈ·±£ÎÒÃÇÔÚ¼¯³É²âÊÔÖÐʹÓõÄÐé¼Ù²âÊÔÊÇÖÒʵµÄ²âÊÔ¡£
ÈÃÎÒÃÇ¿´¿´½ÓÏÂÀ´µÄ¹¤×÷¡£
ºÏͬ²âÊÔ
¸ü¶àµÄÏÖ´úÈí¼þ¿ª·¢×éÖ¯ÒѾÕÒµ½ÁËͨ¹ý¿ç²»Í¬ÍŶӿª·¢ÏµÍ³À´À©Õ¹Æä¿ª·¢¹¤×÷µÄ·½·¨¡£ ¸ö±ðÍŶӽ¨Á¢¸ö±ðµÄ£¬ËÉÉ¢ñîºÏµÄ·þÎñ£¬¶ø²»Óñ˴˲ȽÅÖº£¬²¢½«ÕâЩ·þÎñÕûºÏµ½Ò»¸ö´óµÄ£¬ÓÐÄý¾ÛÁ¦µÄϵͳÖС£
×î½üÎ§ÈÆÎ¢·þÎñµÄÌÖÂÛÕýÊǹØ×¢ÕâÒ»µã¡£
½«ÏµÍ³·Ö¸î³ÉÐí¶àСÐÍ·þÎñ³£³£Òâζ×ÅÕâЩ·þÎñÐèҪͨ¹ýijЩ£¨Ï£Íû¶¨ÒåÃ÷È·µÄ£¬ÓÐʱÒâÍâÔö³¤µÄ£©½Ó¿ÚÏ໥ͨÐÅ¡£
²»Í¬Ó¦ÓóÌÐòÖ®¼äµÄ½Ó¿Ú¿ÉÒÔÓв»Í¬µÄÐÎ×´ºÍ¼¼Êõ¡£ ³£¼ûµÄÊÇ
RESTºÍJSONͨ¹ýHTTPS
ʹÓÃÀàËÆgRPCµÄRPC
ʹÓöÓÁй¹½¨Ê¼þÇý¶¯µÄÌåϵ½á¹¹
¶ÔÓÚÿ¸ö½Ó¿Ú£¬Éæ¼°Á½·½£ºÌṩÕߺÍÏû·ÑÕß¡£ ¸ÃÌṩÉÌÏòÏû·ÑÕßÌṩÊý¾Ý¡£ Ïû·ÑÕß´¦Àí´ÓÌṩÕß´¦»ñµÃµÄÊý¾Ý¡£
ÔÚRESTÊÀ½çÖУ¬ÌṩÕßʹÓÃËùÓбØÐèµÄ¶Ëµã¹¹½¨REST API;
Ïû·ÑÕßµ÷ÓôËREST APIÀ´»ñÈ¡Êý¾Ý»ò´¥·¢ÆäËû·þÎñÖеĸü¸Ä¡£
ÔÚÒì²½µÄ£¬Ê¼þÇý¶¯µÄÊÀ½çÖУ¬ÌṩÕߣ¨Í¨³£³ÆÎª·¢²¼Õߣ©½«Êý¾Ý·¢²¼µ½¶ÓÁÐÖÐ; Ïû·ÑÕߣ¨Í¨³£³ÆÎª¶©»§£©¶©ÔÄÕâЩ¶ÓÁв¢¶ÁÈ¡ºÍ´¦ÀíÊý¾Ý¡£

Figure 8: Each interface has a providing(or publishing)
and a consuming(or subscribing) party. The specification
of an interface can be considered a contract.
ÓÉÓÚÄã¾³£ÔÚ²»Í¬ÍŶÓÖ®¼ä´«²¥Ïû·ÑºÍÌṩ·þÎñ£¬Äã»á·¢ÏÖ×Ô¼º´¦ÓÚ±ØÐëÃ÷È·Ö¸¶¨ÕâЩ·þÎñÖ®¼äµÄ½Ó¿Ú£¨ËùνµÄºÏͬ£©µÄÇé¿ö¡£
´«Í³ÉÏ£¬¹«Ë¾Í¨¹ýÒÔÏ·½Ê½À´½â¾öÕâ¸öÎÊÌ⣺
±àдһ·ÝÏêϸµÄ³¤ÆÚ½çÃæ¹æ·¶£¨ºÏͬ£©
°´ÕÕ¶¨ÒåµÄºÏͬʵʩÌṩ·þÎñ
½«½çÃæ¹æ·¶ÈÓµ½Î§À¸ÉϵÄÏû·ÑÍŶÓ
µÈµ½ËûÃÇʵÏÖËûÃÇÏû·Ñ½Ó¿ÚµÄ²¿·Ö
ÔËÐÐһЩ´ó¹æÄ£µÄÊÖ¶¯ÏµÍ³²âÊÔ£¬¿´¿´ÊÇ·ñÒ»ÇÐÕý³£
Ï£ÍûÁ½¸öÍŶÓÓÀÔ¶¼á³Ö½çÃæ¶¨Ò壬²»Òª¸ãÔÒÁË
¸üÏÖ´ú»¯µÄÈí¼þ¿ª·¢ÍŶÓÓøü×Ô¶¯»¯µÄ¶«Î÷È¡´úÁ˵Ú5²½ºÍµÚ6²½£º×Ô¶¯ÆõÔ¼²âÊÔÈ·±£Ïû·ÑÕߺÍÌṩÕß·½ÃæµÄʵÏÖÈÔÈ»¼á³ÖÒѶ¨ÒåµÄºÏͬ¡£ËûÃÇ×÷Ϊһ¸öºÜºÃµÄ»Ø¹é²âÊÔÌ×¼þ£¬²¢È·±£ÔçÆÚ·¢ÏÖÓëºÏͬµÄÆ«²î¡£
ÔÚÒ»¸ö¸üÃô½ÝµÄ×éÖ¯ÖУ¬ÄãÓ¦¸Ã²ÉÈ¡¸üÓÐЧºÍÀ˷ѸüÉٵķÏß¡£ÄãÔÚͬһ¸ö×éÖ¯ÄÚ¹¹½¨ÄúµÄÓ¦ÓóÌÐò¡£Ö±½ÓÓëÆäËû·þÎñµÄ¿ª·¢ÈËÔ±Ö±½Ó½»Ì¸£¬¶ø²»ÊÇÞðÆú¹ýÓÚÏêϸµÄÎĵµ£¬Õâ²»Ó¦¸ÃÌ«ÄÑ¡£±Ï¾¹ËûÃÇÊÇÄãµÄͬÊ£¬¶ø²»ÊǵÚÈý·½¹©Ó¦ÉÌ£¬ÄãÖ»ÄÜͨ¹ý¿Í»§Ö§³Ö»ò·¨ÂÉÉϵķÀµ¯ºÏͬ½øÐн»Ì¸¡£
Ïû·ÑÕßÇý¶¯ºÏͬ²âÊÔ£¨CDC²âÊÔ£©ÈÃÏû·ÑÕßÍÆ¶¯ºÏͬµÄʵʩ¡£Ê¹ÓÃCDC£¬½Ó¿ÚµÄʹÓÃÕß±àд²âÊÔ£¬´Ó½Ó¿Ú¼ì²é½Ó¿ÚËùÐèµÄËùÓÐÊý¾Ý¡£È»ºóÏû·ÑÍŶӷ¢²¼ÕâЩ²âÊÔ£¬ÒԱ㷢²¼ÍŶӿÉÒÔÇáËÉ»ñÈ¡²¢Ö´ÐÐÕâЩ²âÊÔ¡£Ö§Ô®ÍŶÓÏÖÔÚ¿ÉÒÔͨ¹ýÔËÐÐCDC²âÊÔÀ´¿ª·¢ËûÃǵÄAPI¡£Ò»µ©ËùÓвâÊÔͨ¹ý£¬ËûÃÇÖªµÀÒѾʵʩÁËÏû·ÑÍŶÓËùÐèµÄÒ»ÇС£

Figure 9: ºÏͬ²âÊÔÈ·±£½Ó¿ÚµÄÌṩÕߺÍËùÓÐÏû·ÑÕß¶¼¼á³ÖÒѶ¨ÒåµÄ½Ó¿ÚÆõÔ¼¡£ ͨ¹ýCDC²âÊÔ£¬½Ó¿ÚµÄÏû·ÑÕßÒÔ×Ô¶¯»¯²âÊÔµÄÐÎʽ·¢²¼ËûÃǵÄÐèÇó;ÌṩÕß²»¶ÏµØ»ñÈ¡²¢Ö´ÐÐÕâЩ²âÊÔ
ÕâÖÖ·½·¨ÔÊÐíÌṩÍŶÓÖ»ÊµÊ©ÕæÕý±ØÒªµÄÊÂÇ飨±£³Ö¼òµ¥£¬YAGNI(You ain¡¯t gonna need
it)µÈµÈ£©¡£
Ìṩ½çÃæµÄÍŶÓÓ¦³ÖÐø£¨ÔÚËûÃǵĹ¹½¨Á÷Ë®ÏßÖУ©»ñÈ¡²¢ÔËÐÐÕâЩCDC²âÊÔ£¬ÒÔÁ¢¼´·¢ÏÖÈκÎÖØ´ó¸ü¸Ä¡£
Èç¹ûËûÃǸü¸Ä½çÃæ£¬ËûÃǵÄCDC²âÊÔ½«»áʧ°Ü£¬´Ó¶ø×èֹͻ·¢±ä»¯µÄ·¢Éú¡£ Ö»Òª²âÊÔ±£³ÖÂÌÉ«£¬ÍŶӿÉÒÔ½øÐÐËûÃÇϲ»¶µÄÈκθü¸Ä£¬¶ø²»±Øµ£ÐÄÆäËûÍŶӡ£
Ïû·ÑÕßÇý¶¯µÄºÏͬ·½·¨»á¸øÄã´øÀ´Ò»¸ö¿´ÆðÀ´ÏñÕâÑùµÄ¹ý³Ì£º
Ïû·ÑÍŶӱàд·ûºÏËùÓÐÏû·ÑÕ߯ÚÍûµÄ×Ô¶¯»¯²âÊÔ
ËûÃÇΪÌṩÍŶӷ¢²¼²âÊÔ
ÌṩÍŶӳÖÐøÔËÐÐCDC²âÊÔ²¢±£³ÖÂÌÉ«
Ò»µ©CDC²âÊÔÖжϣ¬Á½¸öÍŶӶ¼»á»¥ÏཻÁ÷
Èç¹ûÄãµÄ×éÖ¯²ÉÓÃ΢·þÎñ·½·¨£¬½øÐÐCDC²âÊÔÊǽ¨Á¢×ÔÖÎÍŶӵÄÖØÒªÒ»²½¡£ CDC²âÊÔÊÇ´Ù½øÍŶӹµÍ¨µÄ×Ô¶¯»¯·½Ê½¡£
ËûÃÇÈ·±£ÍŶÓÖ®¼äµÄ½çÃæËæÊ±¶¼ÔÚ¹¤×÷¡£
CDC²âÊÔʧ°ÜÊÇÒ»¸öºÜºÃµÄÖ¸±ê£¬ÄãÓ¦¸Ã×ßµ½ÊÜÓ°ÏìµÄÍŶӣ¬ÁÄÁÄÈκμ´½«µ½À´µÄAPI±ä»¯£¬²¢Á˽âÄãÏëÈçºÎǰ½ø¡£
Ò»¸öÔʼµÄCDC²âÊÔʵÏÖ¿ÉÒÔÏñ¶ÔAPI·¢ÆðÇëÇóÒ»Ñù¼òµ¥£¬²¢ÉùÃ÷ÏìÓ¦°üº¬ÄãÐèÒªµÄËùÓж«Î÷¡£È»ºó½«ÕâЩ²âÊÔ´ò°üΪ¿ÉÖ´ÐÐÎļþ£¨.gem£¬.jar£¬.sh£©£¬²¢½«ÆäÉÏ´«µ½ÆäËûÍŶӿÉÒÔ»ñÈ¡µÄµØ·½£¨ÀýÈçArtifactoryµÈ¹¤¼þ´æ´¢¿â£©¡£
ÔÚ¹ýÈ¥µÄ¼¸ÄêÖУ¬CDC·½·¨±äµÃÔ½À´Ô½Á÷ÐУ¬²¢ÇÒÒѾ¹¹½¨Á˼¸ÖÖ¹¤¾ßÀ´Ê¹ËüÃǸüÈÝÒ×±àдºÍ½»»»¡£
Pact¿ÉÄÜÊÇ×î½ü×îÍ»³öµÄÒ»¸ö¡£
Ëü¾ßÓÐΪÏû·ÑÕߺÍÌṩÉ̱àд²âÊԵĸ´ÔÓ·½·¨£¬¿ÉΪÄãÌṩ¿ªÏä¼´ÓõĶÀÁ¢·þÎñ´æ¸ù£¬²¢ÔÊÐíÄúÓëÆäËûÍŶӽ»»»CDC²âÊÔ¡£
PactÒѾ±»ÒÆÖ²µ½ºÜ¶àƽ̨ÉÏ£¬²¢ÇÒ¿ÉÒÔÓëJVMÓïÑÔ£¬Ruby£¬.NET£¬JavaScriptµÈÒ»ÆðʹÓá£
Èç¹ûÄúÏ뿪ʼʹÓÃCDC²¢ÇÒ²»ÖªµÀÈçºÎ£¬Pact¿ÉÒÔÊÇÒ»¸öÀíÖǵÄÑ¡Ôñ¡£
ÕâЩÎĵµ¿ÉÄÜ»áÔÚµÚһʱ¼äѹµ¹Ò»ÇС£
±£³ÖÄÍÐÄ£¬²¢Å¬Á¦Í¨¹ýËü¡£ËüÓÐÖúÓÚÉîÈëÁ˽⼲²¡Ô¤·À¿ØÖÆÖÐÐÄ£¬´Ó¶øÊ¹ÄúÔÚÓëÆäËûÍŶӺÏ×÷ʱ¸üÈÝÒ׳«µ¼Ê¹Óü²²¡Ô¤·À¿ØÖÆÖÐÐÄ¡£
Ïû·ÑÕßÇý¶¯µÄºÏͬ²âÊÔ(CDC)¿ÉÒÔ³ÉΪһ¸öÕæÕýµÄÓÎÏ·¹æÔò¸Ä±äÕߣ¬ÒÔ½¨Á¢×ÔÐŵÄÍŶӣ¬¿ÉÒÔ¿ìËÙ¶ø×ÔÐŵØÐж¯¡£
°ïÄã×Ô¼ºÒ»¸ö棬ÔĶÁÕâ¸ö¸ÅÄî²¢ÊÔÒ»ÊÔ¡£
Ò»Ì׿ɿ¿µÄCDC²âÊÔ¶ÔÓÚÄܹ»¿ìËÙÒÆ¶¯¶ø²»»áÆÆ»µÆäËû·þÎñ²¢¶ÔÆäËûÍŶÓÔì³ÉºÜ´óµÄ´ìÕÛ,Õâ¸ö²âÊÔÊÇÎ޼۵ġ£
Ïû·ÑÕß²âÊÔ£¨ÎÒÃǵÄÍŶӣ©
ÎÒÃǵÄ΢·þÎñʹÓÃÌìÆøAPI¡£
Òò´Ë£¬ÎÒÃÇÓÐÔðÈαàдһ·ÝÏû·ÑÕß²âÊÔ£¬ÒÔÈ·¶¨ÎÒÃǶÔ΢·þÎñÓëÌìÆø·þÎñÖ®¼äµÄºÏͬ£¨API£©µÄÆÚÍû¡£
Ê×ÏÈ£¬ÎÒÃÇÔÚbuild.gradleÖаüº¬Ò»¸öÓÃÓÚ±àдÆõÔ¼Ïû·ÑÕß²âÊԵĿ⣺
testCompile('au.com.dius:pact-jvm-consumer-junit_2.11:3.5.5')
¸ÐлÕâ¸ö¿â£¬ÎÒÃÇ¿ÉÒÔʵÏÖÒ»¸öÏû·ÑÕß²âÊÔ²¢Ê¹ÓÃpactµÄÄ£Äâ·þÎñ£º

Èç¹û×Ðϸ¹Û²ì£¬Äã»á¿´µ½WeatherClientConsumerTestÓëWeatherClientIntegrationTest·Ç³£ÏàËÆ¡£Õâ´ÎÎÒÃDz»Ê¹ÓÃWiremock×÷Ϊ·þÎñÆ÷stub£¬¶øÊÇʹÓÃPact¡£ÊÂʵÉÏ£¬Ïû·ÑÕß²âÊÔÓ뼯³É²âÊÔÍêȫһÑù£¬ÎÒÃÇÓÃÒ»¸östubÌæ»»ÕæÕýµÄµÚÈý·½·þÎñÆ÷£¬¶¨ÒåÆÚÍûµÄÏìÓ¦²¢¼ì²éÎÒÃǵĿͻ§¶ËÊÇ·ñ¿ÉÒÔÕýÈ·½âÎöÏìÓ¦¡£ÔÚÕâ¸öÒâÒåÉÏ£¬WeatherClientConsumerTest±¾Éí¾ÍÊÇÒ»¸öС·¶Î§µÄ¼¯³É²âÊÔ¡£Óë»ùÓÚÏßÁ¬½ÓµÄ²âÊÔÏà±È£¬ÕâÖÖ²âÊÔµÄÓŵãÊÇÿ´ÎÔËÐÐʱ¶¼»áÉú³ÉÒ»¸öpactÎļþ£¨ÔÚtarget
/ pacts /£¦pact-name>.jsonÖÐÕÒµ½£©¡£¸ÃÐÒéÎļþÒÔÌØÊâµÄJSON¸ñʽÃèÊöÁËÎÒÃǶԺÏͬµÄÆÚÍû¡£È»ºó¿ÉÒÔʹÓôËÐÒéÎļþÀ´ÑéÖ¤ÎÒÃǵĴæ¸ù·þÎñÆ÷µÄÐÐΪÓëÕæÊµ·þÎñÆ÷µÄÐÐΪÏàͬ¡£ÎÒÃÇ¿ÉÒÔ½«ÐÒéÎļþ½»¸øÌṩ½çÃæµÄÍŶӡ£ËûÃÇÄÃÕâ¸öÐÒéÎļþ£¬²¢Ê¹ÓÃÔÚÄÇÀﶨÒåµÄÆÚÍûдһ¸öÌṩÕß²âÊÔ¡£ÕâÑùËûÃDzâÊÔËûÃǵÄAPIÊÇ·ñÂú×ãÎÒÃÇËùÓÐµÄÆÚÍû¡£
Äã»á·¢ÏÖÕâÊÇCDCÏû·ÑÕßÇý¶¯²¿·ÖµÄÀ´Ô´¡£
Ïû·ÑÕßͨ¹ýÃèÊöËûÃÇµÄÆÚÍûÀ´Íƶ¯½Ó¿ÚµÄʵÏÖ¡£ÌṩÕß±ØÐëÈ·±£ËûÃÇÄܹ»Âú×ãËùÓÐµÄÆÚÍû£¬²¢ÇÒËûÃÇÍê³ÉÁË¡£
ûÓжƽð£¬Ã»ÓÐYAGNIºÍ¶«Î÷¡£
½«ÐÒéÎļþÌṩ¸øÌṩÍŶӿÉÒÔͨ¹ý¶àÖÖ·½Ê½½øÐС£Ò»¸ö¼òµ¥µÄ·½·¨Êǽ«ËüÃÇ·ÅÈë°æ±¾¿ØÖƲ¢¸æËßÌṩÕßÍŶÓ×ÜÊÇ»ñÈ¡×îа汾µÄÐÒéÎļþ¡£¸ü¶àµÄ½ø²½ÊÇʹÓù¤¼þ´æ´¢¿â£¬ÏñÑÇÂíÑ·S3»òÐÒé´úÀíµÄ·þÎñ¡£
¿ªÊ¼¼òµ¥²¢¸ù¾ÝÐèÒªÔö³¤¡£
ÔÚÄãµÄÕæÊµÊÀ½çµÄÓ¦ÓóÌÐòÖУ¬Äã²»ÐèÒªÁ½Õߣ¬Ò»¸ö¼¯³É²âÊÔºÍÒ»¸ö¿Í»§¶ËÀàµÄÏû·ÑÕß²âÊÔ¡£Ê¾Àý´úÂë¿â°üº¬Á½¸öÏòÄãչʾÈçºÎʹÓÃÈκÎÒ»¸ö¡£Èç¹ûÄãÏëʹÓÃpact±àдCDC²âÊÔ£¬ÎÒ½¨Òé¼á³ÖʹÓúóÕß¡£±àд²âÊÔµÄЧ¹ûÊÇÒ»ÑùµÄ¡£Ê¹ÓÃpactµÄºÃ´¦ÊÇ£¬Äú¿ÉÒÔ×Ô¶¯»ñµÃÒ»·ÝpactÎļþ£¬ÆäÖаüº¬¶ÔÆäËûÍŶӿÉÒÔÇáËÉʵʩÆä¹©Ó¦É̲âÊԵĺÏͬÆÚÍû¡£µ±È»£¬Èç¹ûÄãÄÜ˵·þÆäËûÍŶÓҲʹÓÃpact£¬ÕâÊÇΨһÓÐÒâÒåµÄ¡£Èç¹ûÕâ²»Æð×÷Óã¬Ê¹Óü¯³É²âÊÔºÍWiremock×éºÏÊÇÒ»¸öÌåÃæµÄ¼Æ»®b¡£
ÌṩÕß²âÊÔ£¨ÁíÒ»¸öÍŶӣ©
ÌṩÕß²âÊÔ±ØÐëÓÉÌṩÌìÆøAPIµÄÈËÔ±Ö´ÐС£ÎÒÃÇÕýÔÚʹÓÃdark sky.netÌṩµÄ¹«¹²API¡£ÀíÂÛÉÏ£¬darksky
team ½«ÔÚËûÃǵÄ×îºóʵʩÌṩÉ̲âÊÔ£¬ÒÔ¼ì²éËûÃÇÊÇ·ñÎ¥·´ÁËËûÃǵÄÓ¦ÓóÌÐòºÍÎÒÃǵķþÎñÖ®¼äµÄºÏͬ¡£
ÏÔÈ»£¬ËûÃDz»¹ØÐÄÎÒÃÇ΢²»×ãµÀµÄʾÀýÓ¦ÓóÌÐò£¬Ò²²»»áΪÎÒÃÇʵʩCDC²âÊÔ¡£ÕâÊÇÃæÏò¹«ÖÚµÄAPIºÍ²ÉÓÃ΢·þÎñµÄ×éÖ¯Ö®¼äµÄ¾Þ´ó²îÒì¡£ÃæÏò¹«ÖÚµÄAPI²»¿ÉÄÜ¿¼ÂÇÿ¸öÓû§£¬·ñÔòËûÃǽ«ÎÞ·¨Ç°½ø¡£ÔÚÄã×Ô¼ºµÄ×éÖ¯ÖУ¬¿ÉÒÔ¶øÇÒÓ¦¸Ã¡£ÄãµÄÓ¦ÓúܿÉÄÜ»áΪÉÙÊý¼¸¸öÓû§Ìṩ·þÎñ£¬×î¶à¿ÉÄÜÓм¸Ê®¸öÓû§¡£ÎªÁ˱£³ÖÎȶ¨µÄϵͳ£¬»áºÜºÃµØ±àдÕâЩ½Ó¿ÚµÄÌṩÕß²âÊÔ¡£
ÌṩÍŶӻñÈ¡pactÎļþ²¢Õë¶ÔÆäÌṩµÄ·þÎñÔËÐиÃÎļþ¡£Îª´Ë£¬ËûÃÇʵÏÖÁËÒ»¸öÌṩ³ÌÐò²âÊÔ£¬¶ÁÈ¡¸ÃÎļþ£¬´æ´¢Ò»Ð©²âÊÔÊý¾Ý£¬²¢¸ù¾ÝËûÃǵķþÎñÔËÐÐÔÚpactÎļþÖж¨ÒåÆÚÍûÖµ¡£
Pact»ï°éÒѾ±àдÁ˼¸¸ö¿âÀ´Ö´ÐÐÌṩÕß²âÊÔ¡£ËûÃǵÄÖ÷ÒªGitHub repoΪÄãÌṩÁËÒ»¸öºÜºÃµÄ¸ÅÀÀ£¬ÄĸöÏû·ÑÕߺÍÄÄЩÌṩ³ÌÐò¿â¿ÉÓá£
Ñ¡Ôñ×îÊʺÏÄãµÄ¼¼Êõ¶ÑÕ»µÄÄǸö¡£
ΪÁ˼òµ¥Æð¼û£¬ÎÒÃǼÙÉèdarksky APIÒ²ÊÇÔÚSpring BootÖÐʵÏֵġ£
ÔÚÕâÖÖÇé¿öÏ£¬ËûÃÇ¿ÉÒÔʹÓÃSpringµÄpact ÌṩÕߣ¬ËüºÜºÃµØ¹³ÈëSpringµÄMockMVC»úÖÆ¡£
darksky.netÍŶӽ«Ö´ÐеļÙÉèÌṩÕß²âÊÔ¿ÉÄÜÈçÏÂËùʾ£º

Äã»á¿´µ½ËùÓÐÌṩ³ÌÐò²âÊÔ±ØÐëÖ´ÐеIJÙ×÷ÊǼÓÔØÒ»¸öpactÎļþ£¨ÀýÈ磬ͨ¹ýʹÓÃ@PactFolder×¢ÊÍÀ´¼ÓÔØÒÔǰÏÂÔØµÄÐÒéÎļþ£©£¬È»ºó¶¨ÒåÓ¦ÈçºÎÌṩԤ¶¨Òå״̬µÄ²âÊÔÊý¾Ý£¨ÀýÈ磬ʹÓÃMockito
mocks£©¡£Ã»Óж¨ÖƲâÊÔ¿ÉÒÔ±»ÊµÊ©¡£ÕâЩ¶¼À´×ÔpactÎļþ¡£Provider test ÓëÏû·ÑÕß²âÊÔÖÐÉùÃ÷µÄprovider
nameºÍ״̬ƥÅäµÄ¶ÔÓ¦¶ÔÏóÊǷdz£ÖØÒªµÄ¡£
Provider Test(our team)
ÎÒÃÇÒѾ¿´µ½ÈçºÎ²âÊÔÎÒÃǵķþÎñºÍÌìÆøÌṩÉÌÖ®¼äµÄºÏͬ¡£ÓÐÁËÕâ¸ö½Ó¿ÚÎÒÃǵķþÎñ×÷ΪÏû·ÑÕߣ¬ÌìÆø·þÎñ¾ÍÏñÌṩÕßÒ»Ñù¡£½øÒ»²½Ë¼¿¼»á¿´µ½£¬ÎÒÃǵķþÎñ»¹³äµ±ÆäËûÈ˵ÄÌṩÕߣºÌṩÁËÒ»¸öREST
API£¬Ëü×¼±¸ºÃ¹©ÆäËûÈËʹÓõĶ˵㡣
ÕýÈç¸Õ¸ÕÁ˽âµÄÄÇÑù£¬ºÏͬ²âÊԷdz£¼¤ÁÒ£¬ÎÒÃǵ±È»Ò²»áΪÕâ·ÝºÏͬдһ·ÝºÏͬ²âÊÔ¡£ ÐÒÔ˵ÄÊÇ£¬ÕýÔÚʹÓÃÏû·ÑÕßÇý¶¯ÆõÔ¼(consumer-driven
contracts)£¬Òò´ËËùÓÐÏû·ÑÍŶӶ¼ÏòÎÒÃÇ·¢ËÍËûÃǵÄPacts£¬ÎÒÃÇ¿ÉÒÔʹÓÃËüÃÇÀ´ÎªÎÒÃǵÄREST
APIʵÏÖÌṩÕß²âÊÔ¡£
Ê×ÏÈ£¬½«SpringµÄPactÌṩ³ÌÐò¿âÌí¼Óµ½ÏîÄ¿ÖУº
testCompile('au.com.dius:pact-jvm-provider-spring_2.12:3.5.5')
ʵÏÖÌṩÕß²âÊԵķ½Ê½Óë֮ǰÃèÊöµÄÏàͬ¡£ÎªÁ˼òµ¥Æð¼û£¬ÎÒ½«ÎÒÃǵļòµ¥Ïû·ÑÕßµÄpactÎļþÊäÈëµ½ÎÒÃÇ·þÎñµÄ´æ´¢¿âÖС£ÕâʹµÃÄ¿µÄ¸üÈÝÒ×£¬ÔÚÕæÊµ³¡¾°ÖУ¬Äã¿ÉÄÜ»áʹÓøü¸´ÔӵĻúÖÆÀ´·Ö·¢ÄãµÄpactÎļþ¡£

ËùʾµÄExampleProviderTestÐèÒª¸ù¾ÝÎÒÃÇÌṩµÄpactÎļþÌṩ״̬£¬¾ÍÊÇÕâÑù¡£Ò»µ©ÔËÐÐÌṩ³ÌÐò²âÊÔ£¬Pact¾Í»áÄÃÆðpactÎļþ²¢Õë¶ÔÎÒÃǵķþÎñ·¢ÆðHTTPÇëÇó£¬È»ºó¸ù¾ÝÉèÖõÄ״̬×ö³öÏìÓ¦¡£
UI Tests
´ó¶àÊýÓ¦ÓóÌÐò¶¼ÓÐijÖÖÓû§½çÃæ¡£
ͨ³££¬ÎÒÃÇÕýÔÚÌÖÂÛWebÓ¦ÓóÌÐò»·¾³ÖеÄWeb½çÃæ¡£ÈËÃǾ³£Íü¼ÇREST API»òÃüÁîÐнçÃæÓ뻨ÉÚµÄWebÓû§½çÃæÒ»Ñù¶àµÄÓû§½çÃæ¡£
UI tests²âÊÔÓ¦ÓóÌÐòµÄÓû§½çÃæÊÇ·ñÕý³£¹¤×÷¡£Óû§ÊäÈëÓ¦¸Ã´¥·¢ÕýÈ·µÄ²Ù×÷£¬Êý¾ÝÓ¦¸Ã³ÊÏÖ¸øÓû§£¬UI״̬Ӧ¸Ã°´Ô¤ÆÚ¸Ä±ä¡£

UI²âÊԺͶ˵½¶Ë²âÊÔÓÐʱ£¨ÈçMike CohnµÄ°¸Àý£©±»ÈÏΪÊÇÒ»»ØÊ¡£
¶ÔÎÒÀ´Ëµ£¬ÕâÊÇÁ½¸öÏ໥Õý½»µÄ¸ÅÄî¡£
Êǵģ¬¶Ëµ½¶Ë²âÊÔÄãµÄÓ¦ÓóÌÐòͨ³£Òâζ×Åͨ¹ýÓû§½çÃæÀ´Çý¶¯ÄúµÄ²âÊÔ¡£
È»¶ø£¬·´¹ýÀ´È´ÊDz»ÕýÈ·µÄ¡£
²âÊÔÄãµÄÓû§½çÃæ²»Ò»¶¨ÒªÒԶ˵½¶ËµÄ·½Ê½½øÐС£
¸ù¾ÝÄãʹÓõļ¼Êõ£¬²âÊÔÓû§½çÃæ¿ÉÄܷdz£¼òµ¥£¬Ö»ÐèΪºó¶ËJavaScript´úÂë±àдһЩµ¥Ôª²âÊÔ²¢½«Æäºó¶Ë´úÂëɾ³ý¼´¿É¡£
ʹÓô«Í³µÄWebÓ¦ÓóÌÐò²âÊÔÓû§½çÃæ¿ÉÒÔʹÓÃÏñSeleniumÕâÑùµÄ¹¤¾ßÀ´ÊµÏÖ¡£Èç¹ûÄãÈÏΪREST
APIÊÇÄãµÄÓû§½çÃæ£¬Ó¦¸Ãͨ¹ýÎ§ÈÆAPI±àдÊʵ±µÄ¼¯³É²âÊÔÀ´»ñµÃËùÐèµÄÒ»ÇС£
ÓÐÁËWeb½çÃæ£¬¿ÉÄÜÐèÒªÔÚUIÖвâÊÔ¶à¸ö·½Ã棺ÐÐΪ£¬²¼¾Ö£¬¿ÉÓÃÐÔ£¬ºÜÉÙ¶Ô¹«Ë¾Éè¼ÆµÄ²âÊÔ¡£
ÐÒÔ˵ÄÊÇ£¬²âÊÔÓû§½çÃæµÄÐÐΪ·Ç³£¼òµ¥¡£Äãµã»÷ÕâÀÔÚÄÇÀïÊäÈëÊý¾Ý£¬²¢Ï£ÍûÓû§½çÃæµÄ״̬ÏàÓ¦µØ¸Ä±ä¡£ÏÖ´úµÄµ¥Ò³ÃæÓ¦ÓóÌÐò¿ò¼Ü£¨react£¬vue.js£¬AngularµÈ£©Í¨³£´øÓÐ×Ô¼ºµÄ¹¤¾ßºÍhelpers£¬ËüÃÇÔÊÐíÄúÒÔÏ൱µÍ¼¶µÄ£¨µ¥Ôª²âÊÔ£©·½Ê½³¹µ×²âÊÔÕâЩ½»»¥¡£¼´Ê¹ÄãʹÓÃvanilla
javascriptÀ´ÊµÏÖ×Ô¼ºµÄǰ¶ËʵÏÖ£¬ÄãÒ²¿ÉÒÔʹÓ󣹿µÄ²âÊÔ¹¤¾ß£¬ÈçJasmine»òMocha¡£Ê¹Óøü´«Í³µÄ·þÎñÆ÷¶ËäÖȾӦÓóÌÐò£¬»ùÓÚSeleniumµÄ²âÊÔ½«ÊÇÄãµÄ×î¼ÑÑ¡Ôñ¡£
²âÊÔÄãµÄwebÓ¦ÓóÌÐòµÄ²¼¾ÖÊÇ·ñ±£³ÖÍêºÃ£¬ÓеãÀ§ÄÑ¡£¸ù¾ÝÄãµÄÓ¦ÓóÌÐòºÍÄãµÄÓû§ÐèÇ󣬿ÉÄÜÐèҪȷ±£´úÂë¸ü¸Ä²»»áÒâÍâµØÆÆ»µÍøÕ¾µÄ²¼¾Ö¡£
ÎÊÌâÔÚÓÚ£¬¼ÆËã»úÔÚ¼ì²éijЩ¡°¿´ÆðÀ´²»´í¡±£¨¿ÉÄÜÊÇһЩ´ÏÃ÷µÄ»úÆ÷ѧϰËã·¨¿ÉÄÜÔÚ½«À´¸Ä±ä£©·½ÃæÊǷdz£Ôã¸âµÄ¡£
Èç¹ûÄãÏëÒªÔÚ¹¹½¨¹ÜµÀÖÐ×Ô¶¯¼ì²éWebÓ¦ÓóÌÐòµÄÉè¼Æ£¬ÓÐһЩ¹¤¾ß¿É¹©³¢ÊÔ¡£ÕâЩ¹¤¾ßÖеĴó¶àÊý¶¼ÀûÓÃSeleniumÒÔ²»Í¬µÄä¯ÀÀÆ÷ºÍ¸ñʽ´ò¿ªÄúµÄWebÓ¦ÓóÌÐò£¬½ØÈ¡ÆÁÄ»½ØÍ¼²¢½«ËüÃÇÓëÒÔǰÅÄÉãµÄ½ØÍ¼½øÐбȽϡ£Èç¹ûоɽØÍ¼ÒÔÒâÏë²»µ½µÄ·½Ê½³öÏÖ²îÒ죬¸Ã¹¤¾ß»á֪ͨÄú¡£
GalenÊÇÕâЩ¹¤¾ßÖ®Ò»¡£
µ«ÊÇ£¬Èç¹ûÄúÓÐÌØÊâÒªÇ󣬼´Ê¹ÍƳö×Ô¼ºµÄ½â¾ö·½°¸Ò²²»ÄÑ¡£ºÍÎÒÓкÏ×÷µÄһЩÍŶÓÒѾ½¨Á¢ÁËÕóÈݺͻùÓÚJavaµÄ±í¸çjimupupÀ´ÊµÏÖÀàËÆµÄ¹¦ÄÜ¡£Á½ÖÖ¹¤¾ß¶¼²ÉÓÃÁËÎÒ֮ǰÃèÊöµÄ»ùÓÚSeleniumµÄ·½·¨¡£
Ò»µ©ÄãÏë²âÊÔ¿ÉÓÃÐԺ͡°¿´ÆðÀ´²»´í¡±µÄÒòËØ£¬Äã¾ÍÀ뿪ÁË×Ô¶¯»¯²âÊÔÁìÓò¡£ÕâÊÇÄãÓ¦¸ÃÒÀÀµÌ½Ë÷ÐÔ²âÊÔ£¬¿ÉÓÃÐÔ²âÊÔ£¨ÕâÉõÖÁ¿ÉÒÔÏñ×ßÀȲâÊÔÒ»Ñù¼òµ¥£©µÄÁìÓò£¬²¢ÏòÓû§Õ¹Ê¾ËûÃÇÊÇ·ñϲ»¶Ê¹ÓÃÄãµÄ²úÆ·£¬²¢ÇÒ¿ÉÒÔʹÓÃËùÓй¦Äܶø²»»á¸Ðµ½¾ÚÉ¥»ò·³ÄÕ¡£
¶Ëµ½¶Ë²âÊÔ
ͨ¹ýÓû§½çÃæ²âÊÔÒѲ¿ÊðµÄÓ¦ÓóÌÐòÊÇÄã¿ÉÒÔ²âÊÔÓ¦ÓóÌÐòµÄ×îΪ¶Ëµ½¶ËµÄ·½Ê½¡£ Ç°ÃæÃèÊöµÄwebdriverÇý¶¯µÄUI²âÊÔÊǶ˵½¶Ë²âÊÔµÄÒ»¸öºÜºÃµÄÀý×Ó¡£

µ±ÄãÐèҪȷ¶¨Èí¼þÊÇ·ñÕý³£¹¤×÷ʱ£¬¶Ëµ½¶Ë²âÊÔ£¨Ò²³ÆÎª¹ã·º¶ÑÕ»²âÊÔ£©ÎªÄãÌṩ×î´óµÄÐÅÐÄ¡£Í¨¹ýSeleniumºÍWebDriverÐÒ飬Äã¿ÉÒÔͨ¹ý×Ô¶¯Çý¶¯£¨ÎÞÍ·£©ä¯ÀÀÆ÷Õë¶Ô²¿ÊðµÄ·þÎñ£¬Ö´Ðеã»÷²Ù×÷£¬ÊäÈëÊý¾Ý²¢¼ì²éÓû§½çÃæµÄ״̬À´×Ô¶¯Ö´ÐвâÊÔ¡£Äú¿ÉÒÔÖ±½ÓʹÓÃSelenium»òʹÓûùÓÚËüµÄ¹¤¾ß£¬Nightwatch¾ÍÊÇÆäÖÐÖ®Ò»¡£
¶Ëµ½¶Ë²âÊÔ´øÀ´Á˸÷×ÔµÄÎÊÌâ¡£
ËüÃÇÊdzöÁËÃûµÄË鯬£¬ÍùÍùÒòÒâÍâºÍ²»¿ÉÔ¤¼ûµÄÔÒò¶øÊ§°Ü¡£ËûÃǵÄʧ°ÜÍùÍùÊÇÒ»ÖÖÎó½â¡£ÄãµÄÓû§½çÃæÔ½¸´ÔÓ£¬²âÊÔÔ½Ë鯬¡£ä¯ÀÀÆ÷µÄ¹Öñ±£¬¼ÆÊ±ÎÊÌ⣬¶¯»ºÍÒâÍâµÄµ¯³ö¶Ô»°¿òÖ»ÊÇÈÃÎÒ»¨¸ü¶àʱ¼ä½øÐе÷ÊÔµÄһЩÔÒò£¬¶ø²»ÊÇÎÒÏë³ÐÈϵġ£
ÔÚ΢·þÎñÊÀ½çÖУ¬Ë¸ºÔð±àдÕâЩ²âÊÔÒ²ÊÇÒ»¸ö´óÎÊÌâ¡£ÓÉÓÚËüÃÇ¿çÔ½¶à¸ö·þÎñ£¨Õû¸öϵͳ£©£¬Òò´ËûÓÐÒ»¸öÍŶӸºÔð±àд¶Ëµ½¶Ë²âÊÔ¡£
Èç¹ûÄãÓÐÒ»¸ö¼¯ÖеÄÖÊÁ¿±£Ö¤ÍŶӣ¬ËûÃÇ¿´ÆðÀ´ºÜºÏÊÊ¡£
È»¶ø£¬ÓµÓÐÒ»¸ö¼¯ÖеÄÖÊÁ¿±£Ö¤ÍŶÓÊÇÒ»¸öºÜ´óµÄ·´Ä£Ê½£¬ÔÚDevOpsÊÀ½çÀï²»Ó¦¸ÃÓÐһϯ֮µØ£¬ÄãµÄÍŶÓÊÇÕæÕýÒâÒåÉϵĿçÖ°ÄÜÍŶӡ£ËÓ¦¸ÃÓµÓж˵½¶ËµÄ²âÊÔ²¢²»ÈÝÒס£Ò²ÐíÄãµÄ×éÖ¯ÓÐÒ»¸öʵ¼ùÉçÇø»òÒ»¸ö¿ÉÒÔÕÕ¹ËÕâЩµÄ¸ßÖÊÁ¿¹«»á¡£ÕÒµ½ÕýÈ·µÄ´ð°¸Ôںܴó³Ì¶ÈÉÏÈ¡¾öÓÚÄãµÄ×éÖ¯¡£
´ËÍ⣬¶Ëµ½¶Ë²âÊÔÐèÒª´óÁ¿Î¬»¤£¬ÔËÐÐËٶȷdz£»ºÂý¡£
¿¼Âǵ½²»Ö¹Ò»Á½¸ö΢·þÎñµÄ¸ñ¾Ö£¬ÄãÉõÖÁÎÞ·¨ÔÚ±¾µØÔËÐж˵½¶Ë²âÊÔ-ÒòΪÕâÐèÒªÔÚ±¾µØÆô¶¯ËùÓÐ΢·þÎñ¡£ÔÚÄãµÄ¿ª·¢»úÆ÷ÉÏÆô¶¯ÁËÊý°Ù¸öÓ¦ÓóÌÐò£¬¶ø²»»áÕ¨»ÙÄãµÄRAM¡£
ÓÉÓÚά»¤³É±¾¸ß°º£¬Ó¦¸Ã¾¡Á¿¼õÉٶ˵½¶Ë²âÊÔµÄÊýÁ¿¡£
¿¼ÂÇÓû§ÔÚÓ¦ÓóÌÐòÖÐʹÓõĸ߼ÛÖµ½»»¥¡£
³¢ÊÔÌá³ö¶¨Òå²úÆ·ºËÐļÛÖµµÄÓû§Âọ́¬²¢½«ÕâЩÓû§ÂóÌÖÐ×îÖØÒªµÄ²½Öèת»¯Îª×Ô¶¯»¯µÄ¶Ëµ½¶Ë²âÊÔ¡£
Èç¹ûÄãÕýÔÚ½¨Á¢Ò»¸öµç×ÓÉÌÎñÍøÕ¾£¬Äã×îÓмÛÖµµÄ¿Í»§Âó̿ÉÄÜÊÇÒ»¸öÓû§ËÑË÷²úÆ·£¬½«Æä·ÅÈ빺ÎïÀº²¢½áÕÊ¡£½ö´Ë¶øÒÑ¡£
Ö»ÒªÕâ¸öÂóÌÈÔÈ»ÓÐЧ£¬²»Ó¦¸ÃÌ«Âé·³¡£
Ò²ÐíÄã»á·¢ÏÖÒ»Á½¸ö¸üÖØÒªµÄÓû§Âọ́¬¿ÉÒÔ½«Æäת»¯Îª¶Ëµ½¶Ë²âÊÔ¡£
³ý´ËÖ®Í⣬¸ü¶àµÄÊÂÇé¶¼¿ÉÄܸüÍ´¿à¡£
Çë¼Çס£ºÄãµÄ²âÊÔ½ð×ÖËþÖÐÓкܶà½ÏµÍµÄ¼¶±ð£¬ÒѾ²âÊÔÁ˸÷Öֱ߽簸Àý²¢ÓëϵͳµÄÆäËû²¿·Ö½øÐÐÁ˼¯³É¡£ ûÓбØÒªÔÚ¸ü¸ß²ã´ÎÉÏÖØ¸´ÕâЩ²âÊÔ¡£
¸ß°ºµÄά»¤¹¤×÷Á¿ºÍ´óÁ¿µÄÎ󱨻á¼õÂýÄãµÄËÙ¶È£¬»áÈÃÄãÔÚ²âÊÔÖÐʧȥÐÅÐÄ£¬ÒËÔç²»Ò˳١£
User Interface End-to-End Test
¶ÔÓڶ˵½¶Ë²âÊÔ£¬SeleniumºÍWebDriverÐÒéÊÇÐí¶à¿ª·¢ÈËÔ±Ê×Ñ¡µÄ¹¤¾ß¡£ ʹÓÃSelenium£¬Äú¿ÉÒÔÑ¡ÔñÒ»¸öÄãϲ»¶µÄä¯ÀÀÆ÷£¬È»ºóÈÃËü×Ô¶¯µ÷ÓÃÄãµÄÍøÕ¾£¬µã»÷½çÃæÕâÀïºÍÄÇÀÊäÈëÊý¾Ý²¢¼ì²éÓû§½çÃæÖеı仯¡£
SeleniumÐèÒªÒ»¸ö¿ÉÒÔÆô¶¯²¢ÓÃÓÚÔËÐвâÊÔµÄä¯ÀÀÆ÷¡£¶ÔÓÚ²»Í¬µÄä¯ÀÀÆ÷£¬¿ÉÒÔʹÓöà¸öËùνµÄ¡°Çý¶¯³ÌÐò¡±¡£
Ñ¡ÔñÒ»¸ö£¨»ò¶à¸ö£©²¢½«ÆäÌí¼Óµ½ÄúµÄbuild.gradle¡£
ÎÞÂÛÄãÑ¡ÔñÄÄÖÖä¯ÀÀÆ÷£¬¶¼ÐèҪȷ±£ÍŶÓÖеÄËùÓпª·¢ÈËÔ±ºÍÄãµÄCI·þÎñÆ÷ÔÚ±¾µØ°²×°ÁËÕýÈ·°æ±¾µÄä¯ÀÀÆ÷¡£±£³Öͬ²½¿ÉÄÜ»á·Ç³£Í´¿à¡£¶ÔÓÚJava£¬ÓÐÒ»¸öºÜºÃµÄСÐÍ¿â½Ð×öwebdrivermanager£¬Ëü¿ÉÒÔ×Ô¶¯ÏÂÔØ²¢ÉèÖÃÄãÏëҪʹÓõÄÕýÈ·°æ±¾µÄä¯ÀÀÆ÷¡£½«ÕâÁ½¸öÒÀÀµ¹ØÏµÌí¼Óµ½ÄãµÄbuild.gradleÖУ¬È»ºó¿ÉÒÔ¼ÌÐø£º

ÔÚ²âÊÔÌ×¼þÖÐÔËÐÐÍêÕûµÄä¯ÀÀÆ÷¿ÉÄÜ»áºÜÂé·³¡£
ÌØ±ðÊÇÔÚʹÓóÖÐø½»¸¶Ê±£¬ÔËÐйܵÀµÄ·þÎñÆ÷¿ÉÄÜÎÞ·¨Æô¶¯°üº¬Óû§½çÃæµÄä¯ÀÀÆ÷£¨ÀýÈçÒòΪûÓÐX-Server¿ÉÓã©¡£
Äú¿ÉÒÔͨ¹ýÆô¶¯ÏñxvfbÕâÑùµÄÐéÄâX-ServerÀ´½â¾ö´ËÎÊÌâ¡£
×î½üµÄ·½·¨ÊÇʹÓÃÎÞÍ·ä¯ÀÀÆ÷£¨¼´Ã»ÓÐÓû§½çÃæµÄä¯ÀÀÆ÷£©À´ÔËÐÐwebdriver²âÊÔ¡£ Ö±µ½×î½üPhantomJSÊÇÁìÏȵÄ×Ô¶¯»¯µÄÎÞÍ·ä¯ÀÀÆ÷¡£
×Ô´ÓChromiumºÍFirefoxÐû²¼ËûÃÇÔÚä¯ÀÀÆ÷ÖÐʵÏÖÎÞͷģʽºó£¬PhantomJSͻȻ±äµÃ¹ýʱÁË¡£
±Ï¾¹£¬×îºÃʹÓÃÓû§Êµ¼ÊʹÓõÄä¯ÀÀÆ÷£¨±ÈÈçFirefoxºÍChrome£©À´²âÊÔÍøÕ¾£¬¶ø²»Êǽö½ö×÷Ϊ¿ª·¢ÈËÔ±·½±ãÄãʹÓ÷ÂÕæä¯ÀÀÆ÷¡£
ÎÞÍ·µÄFirefoxºÍChrome¶¼ÊÇÈ«Ðµģ¬²¢ÇÒÉÐδ±»¹ã·º²ÉÓÃÀ´Ö´ÐÐwebdriver²âÊÔ¡£ ÎÒÃÇÏë±£³Ö¼òµ¥¡£
¶ø²»ÊǰÚŪÎÞ±ßÎ޼ʵÄģʽ£¬ÈÃÎÒÃǼá³ÖʹÓÃSeleniumºÍÆÕͨä¯ÀÀÆ÷µÄ¾µä·½Ê½°É¡£
Ò»¸ö¼òµ¥µÄ¶Ëµ½¶Ë²âÊÔ£¬Ê¹ÓÃChromeä¯ÀÀÆ÷£¬µ¼º½µ½ÎÒÃǵķþÎñ£¬²¢¼ì²éÍøÕ¾µÄÄÚÈÝÈçÏÂËùʾ£º

Çë×¢Ò⣬Èç¹ûÄãÔÚÔËÐд˲âÊÔµÄϵͳ£¨±¾µØ¼ÆËã»ú£¬ÄãµÄCI·þÎñÆ÷£©Éϰ²×°ÁËChrome£¬¸Ã²âÊÔ½«½öÔÚÄãµÄϵͳÉÏÔËÐС£²âÊԺܼòµ¥¡£ËüʹÓÃ@SpringBootTestÔÚÒ»¸öËæ»ú¶Ë¿ÚÉÏÔËÐÐÕû¸öSpringÓ¦ÓóÌÐò¡£È»ºó£¬ÎÒÃÇʵÀý»¯Ò»¸öеÄChromeä¯ÀÀÆ÷Çý¶¯³ÌÐò£¬¸æËßËüµ¼º½µ½ÎÒÃǵÄ΢·þÎñµÄ/
hello¶Ëµã£¬²¢¼ì²éËüÊÇ·ñÔÚä¯ÀÀÆ÷´°¿ÚÖдòÓ¡³ö¡°Hello World£¡¡±¡£ÕâÊǺܿáµÄ¶«Î÷£¡
REST API End-to-End Test
ÔÚ²âÊÔÓ¦ÓóÌÐòʱ±ÜÃâʹÓÃͼÐÎÓû§½çÃæÊÇÒ»¸öºÃÖ÷Ò⣬Ëü¿ÉÒÔÌṩ±È½ÏÍêÕûµÄ¶Ëµ½¶Ë²âÊÔ£¬Í¬Ê±ÈÔº¸ÇÓ¦ÓóÌÐò¶ÑÕ»µÄ´ó²¿·ÖÄÚÈÝ¡£µ±Í¨¹ýÓ¦ÓóÌÐòµÄWeb½çÃæ½øÐвâÊÔÌØ±ðÀ§ÄÑʱ£¬Õâ¿ÉÒÔÅÉÉÏÓó¡¡£
Ò²ÐíÄãÉõÖÁûÓÐÒ»¸öWeb UI£¬¶øÊÇÌṩһ¸öREST APIÀ´´úÌæ£¨ÒòΪÄãÓÐÒ»¸öµ¥¶ÀµÄÒ³ÃæÓ¦ÓóÌÐòÔÚij¸öµØ·½Óë¸ÃAPI½»Ì¸£¬»òÕß½ö½öÊÇÒòΪÄã±ÉÊÓÒ»Çж¼ºÜºÃ£©¡£
ÎÞÂÛÄÄÖÖ·½Ê½£¬Ò»¸öSubcutaneous Test£¬Ö»ÊÇÔÚͼÐÎÓû§½çÃæÏ½øÐвâÊÔ£¬²¢ÇÒ¿ÉÒÔÈÃÄãÕæÕý×ßÔ¶£¬¶ø²»»á¶ÔÐÅÐÄÔì³ÉÌ«´óËðʧ¡£
Èç¹ûÄãÏñÎÒÃǵÄʾÀý´úÂëÄÇÑùÌṩREST API£¬ÄǾÍÊÇÕýÈ·µÄ×ö·¨£º

µ±ÎÒ²âÊÔÒ»¸öÌṩREST APIµÄ·þÎñʱ£¬ÈÃÎÒÔÙÏòÄúչʾһ¸ö¸ü·½±ãµÄ¿â¡£
REST-assured
ÊÇÒ»¸öΪÄãÌṩһ¸öºÜºÃµÄDSLµÄ¿â£¬ÓÃÓÚ·¢ËÍÕë¶ÔAPIµÄʵ¼ÊHTTPÇëÇ󲢯À¹ÀÄãÊÕµ½µÄÏìÓ¦¡£
Ê×ÏÈÒª×öµÄÊÂÇéÊÇ£º½«ÒÀÀµ¹ØÏµÌí¼Óµ½build.gradleÖС£
testCompile('io.rest-assured:rest-assured:3.0.3')
½èÖúÕâ¸ö¿â£¬ÎÒÃÇ¿ÉÒÔΪÎÒÃǵÄREST APIʵʩ¶Ëµ½¶Ë²âÊÔ£º

ÔٴΣ¬ÎÒÃÇʹÓÃ@SpringBootTestÆô¶¯Õû¸öSpringÓ¦ÓóÌÐò¡£
ÔÚÕâÖÖÇé¿öÏ£¬ÎÒÃÇ@Autowire PersonRepository£¬ÒÔ±ãÎÒÃÇ¿ÉÒÔÇáËɵؽ«²âÊÔÊý¾ÝдÈëÎÒÃǵÄÊý¾Ý¿â¡£
µ±ÎÒÃÇÏÖÔÚÒªÇóREST APIÏòÎÒÃǵÄÅóÓÑ¡°ÅËÏÈÉú¡±Ëµ¡°´òÕкô¡±Ê±£¬ÎÒÃÇ»áµÃµ½Ò»¸öºÜºÃµÄÎʺò¡£ ·Ç³£ºÃ£¡
Èç¹ûÄãÉõÖÁûÓÐÔËÐÐÍøÂç½çÃæ£¬ÄÇô¾Í¿ÉÒÔ½øÐÐ×ã¹»¶àµÄ¶Ëµ½¶Ë²âÊÔ¡£
Acceptance Tests ¡ª Do Your Features Work Correctly?
ÔÚ²âÊÔ½ð×ÖËþÖÐÒÆ¶¯µÃÔ½¸ß£¬½øÈë²âÊÔÁìÓòµÄ¿ÉÄÜÐÔ¾ÍÔ½´ó£¬´ÓÓû§µÄ½Ç¶ÈÀ´¿´£¬Äã¹¹½¨µÄ¹¦ÄÜÊÇ·ñÕý³£¹¤×÷¡£
¿ÉÒÔ½«ÄãµÄÓ¦ÓóÌÐòÊÓΪºÚºÐ×Ó£¬²¢½«²âÊÔÖеĽ¹µã´ÓÏÂÃæÖÐÒÆ³ý
µ±ÎÒÊäÈëÖµxºÍyʱ£¬·µ»ØÖµÓ¦¸ÃÊÇz
¶øÊÇÓÃ

ÓÐʱÄã»áÌýµ½ÕâЩ²âÊԵŦÄܲâÊÔ»òÑéÊÕ²âÊÔµÄÌõ¿î¡£
ÓÐʱÈËÃÇ»á¸æËßÄ㹦ÄܺÍÑéÊÕ²âÊÔÊDz»Í¬µÄ¶«Î÷¡£ÕâЩÊõÓïÊÇ»ìÏýµÄ¡£ÉõÖÁÓÐʱºòÈËÃÇ»áÎÞÐÝÖ¹µØÌÖÂÛ´ë´ÇºÍ¶¨Ò塣ͨ³£ÕâÖÖÌÖÂÛ»áÒýÆðÏ൱´óµÄ»ìÂÒ¡£Õâ²ÅÖØÒª£ºÔÚijһʱ¿Ì£¬ÄãÓ¦¸ÃÈ·±£´ÓÓû§µÄ½Ç¶È²âÊÔÈí¼þÊÇ·ñÕý³£¹¤×÷£¬¶ø²»½ö½öÊÇ´Ó¼¼Êõ½Ç¶È¡£
ÄãÈÏΪÕâЩ²âÊÔÕæµÄ²»ÊÇÄÇÃ´ÖØÒª¡£
È»¶ø£¬½øÐÐÕâЩ²âÊÔÊÇÓбØÒªµÄ¡£
Ñ¡ÔñÒ»¸ö£¬¼á³ÖÏÂÈ¥£¬È»ºó±àдÕâЩ²âÊÔ¡£
ÕâÒ²ÊÇÈËÃÇ̸ÂÛBDDºÍʹÄúÄܹ»ÒÔBDD·½Ê½ÊµÊ©²âÊԵŤ¾ßµÄʱ¿Ì¡£
BDD»òBDD·ç¸ñµÄ±àд²âÊÔ·½Ê½¿ÉÄÜÊÇÒ»¸ö²»´íµÄÇÏÃÅ£¬¿É½«ÄãµÄ˼Ïë´Óʵʩϸ½Ú×ªÒÆµ½Óû§ÐèÇó¡£ ¼ÌÐø³¢ÊÔ°É¡£
ÄãÉõÖÁ²»ÐèÒªÏñCucumberÄÇÑù²ÉÓÃÈ«ÃæµÄBDD¹¤¾ß£¨¾¡¹ÜÄã¿ÉÒÔ£©¡£
ÓÐЩ¶ÏÑԿ⣨±ÈÈçchai.jsÔÊÐíÄãÓÃshouldÑùʽµÄ¹Ø¼ü×ÖÀ´±àд¶ÏÑÔ£¬ÕâÑù¿ÉÒÔÈÃÄãµÄ²âÊÔÄܹ»¶ÁÈ¡¸ü¶àÀàËÆÓÚBDDµÄÄÚÈÝ¡£¼´Ê¹Ä㲻ʹÓÃÌṩÕâÖÖ±íʾ·¨µÄ¿â£¬´ÏÃ÷ÇÒ·Ö¹¤ºÏÀíµÄ´úÂë
½«ÔÊÐíÄã±àдÒÔÓû§ÐÐΪΪÖÐÐĵIJâÊÔ¡£Ò»Ð©¸¨Öú·½·¨/º¯Êý¿ÉÒÔΪÄã´øÀ´ºÜ³¤µÄ·Ҫ×ߣº

ÑéÊÕ²âÊÔ¿ÉÒÔÓв»Í¬µÄÁ£¶È¼¶±ð¡£
´ó¶àÊýʱºòËûÃǽ«»áÏ൱¸ß¼¶²¢Í¨¹ýÓû§½çÃæ²âÊÔÄúµÄ·þÎñ¡£È»¶ø£¬Àí½âÔÚ¼¼ÊõÉϲ»ÐèÒªÔÚ²âÊÔ½ð×ÖËþµÄ×î¸ß¼¶±ð±àдÑéÊÕ²âÊÔÊǺܺõġ£
Èç¹ûÄãµÄÓ¦ÓóÌÐòÉè¼ÆºÍÊÖÍ·µÄ³¡¾°ÔÊÐíÄúÔڽϵ͵ļ¶±ðÉϱàдÑéÊÕ²âÊÔ£¬ÄǾÍÈ¥×ö°É¡£ ½øÐеͼ¶²âÊԱȽøÐи߼¶²âÊÔÒªºÃ¡£
ÑéÊÕ²âÊԵĸÅÄî - Ö¤Ã÷¹¦ÄÜΪÓû§ÕýÈ·µØ¹¤×÷ - ÍêÈ«Óë²âÊÔ½ð×ÖËþÕý½»¡£
Exploratory Testing
¼´Ê¹ÊÇ×îÓù¦µÄ×Ô¶¯»¯²âÊÔÒ²²»ÍêÃÀ¡£ ÓÐʱºòÄã»á´í¹ý×Ô¶¯»¯²âÊÔÖеÄijЩ±ßÔµÇé¿ö¡£ ÓÐʱͨ¹ý±àдµ¥Ôª²âÊÔÀ´¼ì²âÌØ¶¨µÄ´íÎ󼸺õÊDz»¿ÉÄܵġ£
ijЩÖÊÁ¿ÎÊÌâÔÚÄúµÄ×Ô¶¯»¯²âÊÔÖÐÉõÖÁ²»Ã÷ÏÔ£¨¿¼ÂÇÉè¼Æ»ò¿ÉÓÃÐÔ£©¡£ ¾¡¹ÜÄã¶Ô²âÊÔ×Ô¶¯»¯ÓÐ×Å×îºÃµÄÒâͼ£¬µ«Ä³Ð©ÀàÐ͵ÄÊÖ¶¯²âÊÔÈÔÈ»ÊÇÒ»¸öºÃÖ÷Òâ¡£

Figure 12: Use exploratory testing to spot all quality
issues that your build pipeline didn¡¯t spot
ÔÚ²âÊÔ×éºÏÖаüº¬Ì½Ë÷ÐÔ²âÊÔ¡£ ÕâÊÇÒ»ÖÖÊÖ¶¯²âÊÔ·½·¨£¬Ç¿µ÷²âÊÔÈËÔ±µÄ×ÔÓɺʹ´ÔìÁ¦£¬ÒÔ±ãÔÚÔËÐÐÖеÄϵͳÖз¢ÏÖÖÊÁ¿ÎÊÌâ¡£
Ö»Ð趨ÆÚ°²ÅÅһЩʱ¼ä£¬¾íÆðÐä×Ó²¢³¢ÊÔÆÆ»µÓ¦ÓóÌÐò¡£
ʹÓÃÆÆ»µÐÔµÄ˼ά·½Ê½£¬Ïë³ö°ì·¨ÔÚÓ¦ÓóÌÐòÖÐÒý·¢ÎÊÌâºÍ´íÎó¡£ ¼Ç¼ÄúÒÔºóÕÒµ½µÄËùÓÐÄÚÈÝ¡£
×¢Òâ´íÎó£¬Éè¼ÆÎÊÌ⣬ÏìӦʱ¼ä»ºÂý£¬¶ªÊ§»òÎóµ¼ÐԵĴíÎóÐÅÏ¢ÒÔ¼°ÆäËûÒ»ÇлáÈÃÄã×÷ΪÈí¼þÓû§·³ÄÕµÄÊÂÇé¡£
ºÃÏûÏ¢ÊÇ£¬Äã¿ÉÒÔʹÓÃ×Ô¶¯»¯²âÊÔÄã´ó²¿·Ö·¢ÏÖ¡£ÎªÄã·¢ÏֵĴíÎó±àд×Ô¶¯»¯²âÊÔ£¬È·±£½«À´²»»á³öÏָôíÎóµÄÈκλØÍË¡£´ËÍ⣬Ëü»¹¿ÉÒÔ°ïÖúÔÚ´íÎóÐÞ¸´ÆÚ¼äËõСÎÊÌâµÄ¸ùÔ´¡£
ÔÚ̽Ë÷ÐÔ²âÊÔ¹ý³ÌÖУ¬Äã»á·¢ÏÖͨ¹ýÄãµÄ¹¹½¨¹ÜµÀδ±»×¢Òâµ½µÄÎÊÌâ¡£²»Òª¸Ðµ½¾ÚÉ¥¡£ Õâ¶ÔÄúµÄ¹¹½¨¹ÜµÀµÄ³ÉÊì¶ÈÓкܺõķ´À¡¡£
ÓëÈκη´À¡Ò»Ñù£¬ÇëÎñ±Ø²ÉÈ¡Ðж¯£º¿¼ÂÇÄ㽫À´¿ÉÒÔ²Éȡʲô´ëÊ©À´±ÜÃâÕâЩÎÊÌâ¡£Ò²ÐíÄã´í¹ýÁËһЩ×Ô¶¯»¯²âÊÔ¡£
Ò²ÐíÔÚÕâ´Îµü´úÖжÔ×Ô¶¯»¯²âÊÔàÍÖ®ÒԱǣ¬²¢ÇÒÐèÒªÔÚ½«À´½øÐиü³¹µ×µÄ²âÊÔ¡£ Ò²ÐíÓÐÒ»ÖÖÉÁÁÁµÄй¤¾ß»ò·½·¨¿ÉÒÔÓÃÀ´±ÜÃ⽫À´³öÏÖÕâЩÎÊÌâ¡£
ÇëÎñ±Ø²ÉÈ¡Ðж¯£¬ÒÔ±ã¹ÜµÀºÍÕû¸öÈí¼þ½»¸¶½«×ߵøüÔ¶±äµÃ¸ü¼Ó³ÉÊì¡£
¹ØÓÚTesting TerminologyµÄ½áÂÛ
̸ÂÛ²»Í¬µÄ²âÊÔ·ÖÀà×ÜÊǺÜÀ§ÄÑ¡£
µ±ÎÒ̸ÂÛµ¥Ôª²âÊÔʱ£¬ÎÒµÄÒâ˼¿ÉÄÜÓëÄãµÄÀí½âÉÔÓв»Í¬¡£
Èç¹ûÊǼ¯³É²âÊÔ£¬Çé¿ö¸üÔã¡£
¶ÔÓÚijЩÈËÀ´Ëµ£¬¼¯³É²âÊÔÊÇÒ»Ïî·Ç³£¹ã·ºµÄ»î¶¯£¬¿ÉÒÔ²âÊÔÕû¸öϵͳµÄÐí¶à²»Í¬²¿·Ö¡£ ¶ÔÎÒ¶øÑÔ£¬ÕâÊÇÒ»¸öÏ൱ÏÁ°¯µÄ¶«Î÷£¬Ò»´ÎÖ»²âÊÔÒ»¸öÍⲿ²¿¼þµÄ¼¯³É¡£
һЩÈ˳ÆËûÃÇΪ¼¯³É²âÊÔ£¬Ò»Ð©È˳ÆËûÃÇΪ×é¼þ²âÊÔ£¬Ò»Ð©È˸üϲ»¶ÊõÓï·þÎñ²âÊÔ¡£
ÉõÖÁÆäËûÈËÒ²»áÕù±ç˵£¬ËùÓÐÕâÈý¸öÊõÓï¶¼ÊÇÍêÈ«²»Í¬µÄ¶«Î÷¡£ ûÓÐ¶Ô´í¡£
Èí¼þ¿ª·¢ÉçÇø¸ù±¾Ã»ÓÐÉè·¨Î§ÈÆ²âÊÔ¶¨ÒåÃ÷È·µÄÊõÓï¡£
²»ÒªÌ«¾ÐÄàÓÚÄ£ÀâÁ½¿ÉµÄ»°¡£
Èç¹ûÄú³ÆÖ®Îª¶Ëµ½¶Ë»ò¹ã·ºµÄ¶ÑÕ»²âÊÔ»ò¹¦ÄܲâÊÔ£¬ÔòÎ޹ؽôÒª¡£
Èç¹ûÄãµÄ¼¯³É²âÊÔ¶ÔÄãÀ´ËµÒâζ×ÅÓëÆäËû¹«Ë¾µÄÈ˲»Í¬£¬ÄǾÍû¹ØÏµÁË¡£ Êǵģ¬Èç¹ûÎÒÃǵÄרҵÄܹ»°´ÕÕһЩÃ÷È·¶¨ÒåµÄÌõ¼þ½â¾ö²¢ÇÒÈ«²¿¼á³ÖÏÂÈ¥£¬Äǽ«»á·Ç³£ºÃ¡£
²»ÐÒµÄÊÇ£¬Õ⻹ûÓз¢Éú¡£
¶øÇÒ£¬ÓÉÓÚÔÚ±àд²âÊÔʱÓкܶàϸ΢²î±ð£¬·´¶ø±ÈÒ»¶ÑÀëÉ¢µÄ´æ´¢Í°¸üÏñÒ»¸öƵÆ×£¬ÕâʹµÃÒ»ÖµÄÃüÃû¸ü¼ÓÀ§ÄÑ¡£
ÖØÒªµÄÊÇ£¬ÄãÓ¦¸ÃÕÒµ½ÊʺÏÄãºÍÄãµÄÍŶӵÄÌõ¿î¡£Çå³þÄãÏëдµÄ²»Í¬ÀàÐ͵IJâÊÔ¡£ ¾ÍÍŶÓÖеÄÃüÃû´ï³ÉÒ»Ö£¬²¢¾ÍÿÖÖÀàÐ͵IJâÊÔ·¶Î§´ï³É¹²Ê¶¡£
Èç¹ûÄãÔÚÍŶÓÄÚ²¿£¨»òÕßÉõÖÁÔÚÄãµÄ×éÖ¯ÄÚ£©»ñµÃÕâÖÖÒ»ÖÂÐÔ£¬ÄÇôÄãÓ¦¸Ã¹ØÐĵľÍÊÇÕâЩ¡£ µ±Simon StewartÃèÊöËûÃÇÔÚGoogleʹÓõķ½·¨Ê±£¬Simon
Stewart×ܽáµÃ·Ç³£ºÃ¡£
¶øÇÒÎÒÈÏΪÕâÍêÈ«±íÃ÷£¬ÈÃÃû×ÖºÍÃüÃû¹ßÀý¹ýÓÚ³ÁÃÆÊDz»ÖµµÃµÄÂé·³¡£
Putting Tests Into Your Depolyment Pipeline
Èç¹ûÄãʹÓõÄÊdzÖÐø¼¯³É»ò³ÖÐø½»¸¶£¬ÄÇô½«ÓµÓÐÒ»¸ö²¿Êð¹ÜµÀ£¬Ã¿´Î¶ÔÈí¼þ½øÐиü¸Äʱ¶¼»áÔËÐÐ×Ô¶¯»¯²âÊÔ¡£
ͨ³£Õâ¸ö¹ÜµÀ·Ö³É¼¸¸ö½×¶Î£¬Öð½¥ÈÃÄã¸ü¼ÓÈ·ÐÅÈí¼þÒÑ×¼±¸ºÃ²¿Êðµ½Éú²ú»·¾³¡£ Ìýµ½ËùÓÐÕâЩ²»Í¬ÀàÐ͵IJâÊÔ£¬Äã¿ÉÄÜÏëÖªµÀÈçºÎ½«ËüÃÇ·ÅÖÃÔÚ²¿Êð¹ÜµÀÖС£
Òª»Ø´ðÕâ¸öÎÊÌ⣬Ӧ¸Ã¿¼ÂdzÖÐø½»¸¶£¨Êµ¼ÊÉÏÊǼ«ÏÞ±à³ÌºÍÃô½ÝÈí¼þ¿ª·¢µÄºËÐļÛÖµÖ®Ò»£©µÄ»ù±¾¼ÛÖµÖ®Ò»£º¿ìËÙ·´À¡¡£
Ò»¸öºÃµÄ¹¹½¨¹ÜµÀ¸æËßÄ㣬¾¡¿ÉÄÜ¿ìµØ¸ãÔÒ¡£Äã²»ÏëµÈÒ»¸öСʱ²ÅÄÜ·¢ÏÖÄãµÄ×îдúÂë¸ü¸ÄÆÆ»µÁËһЩ¼òµ¥µÄµ¥Ôª²âÊÔ¡£Èç¹ûÄãµÄ¹ÜµÀÐèÒªºÜ³¤Ê±¼ä²ÅÄܸø·´À¡£¬ÄÇôÄãºÜ¿ÉÄÜÒѾ»Ø¼ÒÁË¡£Í¨¹ý¿ìËÙÔËÐеIJâÊÔ·ÅÔÚÁ÷Ë®ÏßµÄÔçÆÚ½×¶Î£¬¿ÉÒÔÔÚ¼¸ÃëÖÓÄÚ»ñµÃÕâЩÐÅÏ¢£¬Ò²¿ÉÄÜÐèÒª¼¸·ÖÖÓ¡£Ïà·´£¬ÔÚ½ÏÍíµÄ½×¶Î£¬½Ï³¤Ê±¼äµÄÔËÐвâÊÔ£¨Í¨³£ÊÇ½Ï¿í·¶Î§µÄ²âÊÔ£©·ÅÔÚ²»»áÍÆ³Ù¿ìËÙÔËÐвâÊԵķ´À¡¡£Äã»á·¢ÏÖ¶¨Ò岿Êð¹ÜµÀµÄ½×¶Î²»ÊÇÓɲâÊÔÀàÐÍÇý¶¯µÄ£¬¶øÊÇÓÉËٶȺͷ¶Î§¾ö¶¨µÄ¡£¿¼Âǵ½ÕâÒ»µãËü¿ÉÒÔÊÇÒ»¸ö·Ç³£ºÏÀíµÄ¾ö¶¨£¬°ÑÒ»Ð©ÕæÕýµÄÏÁÒ巶ΧµÄºÍ¿ìËÙÔËÐеɲâÊÔÔÚͬһ¸öÎę̀ÉÏÄãµÄµ¥Ôª²âÊÔ
- ½ö½öÊÇÒòΪËûÃǸøÄã¸ü¿ìµÄ·´À¡£¬¶ø²»ÊÇÒòΪÄãÏë»ÑØ×ÅÄãµÄ²âÊÔµÄÕýʽÀàÐÍ¡£
Avoid Test Duplication
ÏÖÔÚÄãÖªµÀÄãÓ¦¸Ãд³ö²»Í¬ÀàÐ͵IJâÊÔ£¬µ«»¹ÓÐÒ»¸ö¿ÉÒÔ±ÜÃâµÄ´íÎó£ºÔÚ½ð×ÖËþµÄ²»Í¬²ã´ÎÉÏÖØ¸´²âÊÔ¡£
ËäÈ»ÄãµÄÖ±¾õ¿ÉÄÜ»á˵²»ÐèҪ̫¶àµÄ²âÊÔ¡£ÎÒÏòÄã±£Ö¤£¬ÐèÒª¡£
²âÊÔÌ×¼þÖеÄÿһÏî²âÊÔ¶¼ÐèÒª¶îÍâµÄʱ¼ä£¬²¢²»ÊÇÃâ·ÑµÄ¡£
±àдºÍά»¤²âÊÔÐèҪʱ¼ä¡£ ÔĶÁºÍÀí½âÆäËûÈ˵IJâÊÔÐèҪʱ¼ä¡£
µ±È»£¬ÔËÐвâÊÔÐèҪʱ¼ä¡£
ÓëÉú²ú´úÂëÒ»Ñù£¬Ó¦¸Ã¾¡Á¿¼ò»¯²¢±ÜÃâÖØ¸´¡£
ÔÚʵʩÄãµÄ²âÊÔ½ð×ÖËþµÄ±³¾°Ï£¬ÄãÓ¦¸Ã¼ÇסÁ½Ìõ¾Ñé·¨Ôò£º
1¡¢Èç¹û½Ï¸ß¼¶±ðµÄ²âÊÔ·¢ÏÖ´íÎ󣬲¢ÇÒûÓнϵͼ¶±ðµÄ²âÊÔʧ°Ü£¬ÔòÐèÒª±àд½ÏµÍ¼¶±ðµÄ²âÊÔ
2¡¢¾¡¿ÉÄܽ«²âÊÔÍÆµ½²âÊÔ½ð×ÖËþµÄ¾¡Í·¡£
µÚÒ»Ìõ¹æÔòºÜÖØÒª£¬ÒòΪ½ÏµÍ¼¶±ðµÄ²âÊÔ¿ÉÒÔÈÃÄã¸üºÃµØËõС´íÎó²¢ÒÔ¶ÀÁ¢·½Ê½¸´ÖÆ´íÎó¡£ µ±µ÷ÊÔÊÖÍ·µÄÎÊÌâʱ£¬ËüÃÇ»áÔËÐеøü¿ì£¬²¢ÇÒ²»»áÓ·Öס£
ËüÃǽ«³ÉΪδÀ´Á¼ºÃµÄ»Ø¹é²âÊÔ¡£
µÚ¶þÌõ¹æÔò¶ÔÓÚ¿ìËÙ±£³Ö²âÊÔÌ×¼þ·Ç³£ÖØÒª¡£
Èç¹ûÄãÒѾÔڽϵͼ¶±ðµÄ²âÊÔÖÐ×ÔÐŵزâÊÔÁËËùÓÐÌõ¼þ£¬Ôò²»ÐèÒªÔÚ²âÊÔÌ×¼þÖб£Áô¸ü¸ß¼¶±ðµÄ²âÊÔ¡£ ËüÖ»ÊÇûÓÐÔö¼Ó¸ü¶àµÄÐÅÐÄ¡£
¶àÓàµÄ²âÊÔ»áÔÚÈÕ³£¹¤×÷ÖбäµÃ·³ÈË¡£
ÄãµÄ²âÊÔÌ×¼þ»á±äÂý£¬µ±Äã¸Ä±ä´úÂëµÄÐÐΪʱÄãÐèÒª¸Ä±ä¸ü¶àµÄ²âÊÔ¡£
ÈÃÎÒÃÇÒÔ²»Í¬µÄ·½Ê½À´±íÊö£ºÈç¹û¸ü¸ß¼¶±ðµÄ²âÊÔÈÃÄã¸ü¼ÓÈ·ÐÅÓ¦ÓóÌÐòÕý³£¹¤×÷£¬ÄÇôÄãÓ¦¸ÃÓµÓÐËü¡£
ΪControllerÀà±àдµ¥Ôª²âÊÔÓÐÖúÓÚ²âÊÔController±¾ÉíµÄÂß¼¡£
²»¹ý£¬Õâ²¢²»ÄܸæËßÕâ¸öControllerÌṩµÄREST¶ËµãÊÇ·ñʵ¼ÊÏìÓ¦HTTPÇëÇó¡£ ËùÒÔ£¬Òƶ¯²âÊÔ½ð×ÖËþ²¢Ìí¼ÓÒ»¸ö²âÊÔÀ´¼ì²éÈ·ÇеÄ
- µ«Ã»Óиü¶à¡£
Äã²»Òª²âÊԵͼ¶²âÊÔÒѾÔڸ߼¶²âÊÔÖи²¸ÇµÄËùÓÐÌõ¼þÂß¼ºÍ±ß½çÇé¿ö¡£
È·±£½Ï¸ß¼¶±ðµÄ²âÊÔ²àÖØÓڽϵͼ¶±ð²âÊÔÎÞ·¨¸²¸ÇµÄ²¿·Ö¡£
µ±Éæ¼°µ½²»ÌṩÈκμÛÖµµÄ²âÊÔʱ£¬Îҷdz£Ñϸñ¡£
ÎÒɾ³ýÁ˽ϵͼ¶±ðµÄ¸ß¼¶²âÊÔ£¨ÒòΪËüÃDz»Ìṩ¶îÍâµÄÖµ£©¡£
Èç¹û¿ÉÄܵϰ£¬ÎÒÓýϵͼ¶±ðµÄ²âÊÔÌæ»»¸ü¸ß¼¶±ðµÄ²âÊÔ¡£
ÓÐʱºòÕâºÜÄÑ£¬ÌرðÊÇÈç¹ûÄãÖªµÀÌá³öÒ»¸ö²âÊÔÊǼè¿àµÄ¹¤×÷¡£
½÷·À³Áû³É±¾ÃýÎó²¢Çû÷ɾ³ý¼ü¡£
ûÓÐÀíÓÉÀ˷Ѹü¶à±¦¹óµÄʱ¼äÔÚ²»ÔÙÌṩ¼ÛÖµµÄ²âÊÔÉÏ¡£
Writing Clean Test Code
¾ÍÏñÒ»°ã±àд´úÂëÒ»Ñù£¬Ð´³öÁ¼ºÃºÍ¸É¾»µÄ²âÊÔ´úÂëÐèÒª·Ç³£Ï¸ÐÄ¡£
ÔÚ¼ÌÐøÖ®Ç°Ìá³ö¿Éά»¤µÄ²âÊÔ´úÂëÒÔ¼°ÔÚ×Ô¶¯»¯²âÊÔÌ×¼þÖÐÆÆ½â£¬ÒÔÏÂÊÇһЩ¸ü¶àÌáʾ£º
1¡¢²âÊÔ´úÂëÓëÉú²ú´úÂëÒ»ÑùÖØÒª¡£ ¸øËüͬÑùµÄ¹Ø×¢¡£ ¡°ÕâÖ»ÊDzâÊÔ´úÂ롱²»ÊÇÖ¤Ã÷²ÝÂÊ´úÂëºÏÀíµÄÀíÓÉ
2¡¢Ã¿¸ö²âÊÔ²âÊÔÒ»¸öÌõ¼þ¡£ Õâ¿ÉÒÔ°ïÖúÄã±£³Ö²âÊÔ¼ò¶Ì²¢ÇÒÈÝÒ×ÍÆÀí
3¡¢¡°°²ÅÅ£¬²ÉÈ¡Ðж¯£¬¶ÏÑÔ¡±»ò¡°µ±Ê±£¬ÄÇô¡±ÊǺܺõÄÖú¼Ç·û£¬¿ÉÒÔÈÃÄãµÄ²âÊÔ±£³ÖÁ¼ºÃµÄ½á¹¹
4¡¢¿É¶ÁÐÔºÜÖØÒª¡£ ²»ÒªÊÔͼ¹ý¶ÈDRY£¨Don¡¯t repeat yourself£©¡£ ¸´ÖÆÊÇ¿ÉÒԵģ¬Èç¹ûËüÌá¸ß¿É¶ÁÐԵϰ¡£
³¢ÊÔÔÚDRYºÍDAMP´úÂëÖ®¼äÕÒµ½Æ½ºâµã
5¡¢Èç¹ûÓÐÒÉÎÊ£¬ÇëʹÓÃÈýÌõ¹æÔòÀ´¾ö¶¨ºÎÊ±ÖØ¹¹¡£ ÖØÓÃ֮ǰʹÓÃ
½áÂÛ
¾ÍÕâÑù£¡ÎÒÖªµÀÕâÊÇÒ»¸öÂþ³¤¶ø¼èÄѵÄÔĶÁ£¬½âÊÍΪʲôÒÔ¼°ÈçºÎ²âÊÔÄãµÄÈí¼þ¡£
ºÃÏûÏ¢ÊÇ£¬ÕâЩÐÅÏ¢Êdz־ÃÓÐÓõ쬲¢ÇÒÎÞÂÛÄãÕýÔÚ¹¹½¨Ê²Ã´ÑùÑùµÄÈí¼þ¡£ ÎÞÂÛÄúÊÇ´ÓÊÂ΢·þÎñÁìÓò£¬ÎïÁªÍøÉ豸£¬Òƶ¯Ó¦ÓóÌÐò»¹ÊÇWebÓ¦ÓóÌÐò£¬ÕâЩÎÄÕµĽÌѵ¶¼¿ÉÒÔÓ¦Óõ½ËùÓÐÕâЩÁìÓò¡£
|