±à¼ÍƼö: |
ÎÄÕ´øÁì´ó¼Ò³õ²½ÈÏʶ΢·þÎñ¼Ü¹¹£¬°üÀ¨ËüµÄÖ÷ÒªÌØÕ÷ºÍĿǰµÄÖ÷Á÷²¿Êð·½Ê½£¬ÓÈÆäÊÇËü¶ÔÓÚÈí¼þ²âÊÔËù´øÀ´µÄÐÂÌôÕ½ºÍÒªÇó¡£
±¾ÎÄÀ´×ÔÓÚcnblogs£¬ÓÉ»ðÁú¹ûÈí¼þLuca±à¼¡¢ÍƼö¡£ |
|
ʲôÊÇ΢·þÎñ£¿
΢·þÎñµÄÓÉÀ´
΢·þÎñµÄǰÉíÊÇ Peter Rodgers ²©Ê¿ÔÚ 2005 Äê¶ÈÔÆ¶ËÔËË㲩ÀÀ»áÉÏÌá³öµÄ΢
Web ·þÎñ (Micro-Web-Service) ¡£Î¢ÈíµÄ Juval Löwy ËæºóÒ²Ìá³öÁËÀàËÆµÄÏë·¨£¬²¢ÌáÒ齫Æä×÷Ϊ΢ÈíÏÂÒ»½×¶Î×îÖ÷ÒªµÄÈí¼þ¼Ü¹¹¡£
2014Ä꣬Martin Fowler Óë James Lewis ¹²Í¬Ìá³öÁË΢·þÎñµÄ¸ÅÄ¸ø³öÁË΢·þÎñµÄ¾ßÌ嶨Ò壺´Ó±¾ÖÊÉÏÀ´Ëµ£¬Î¢·þÎñÊÇÒ»Öּܹ¹Ä£Ê½¡£ËüÊÇÃæÏò·þÎñÐͼܹ¹£¨SOA£©µÄÒ»ÖÖ±äÌ壬Ìᳫ½«µ¥Ò»Ó¦ÓóÌÐò»®·Ö³ÉÒ»×éСµÄ·þÎñ£¬·þÎñÖ®¼ä»¥Ïàе÷¡¢»¥ÏàÅäºÏ£¬ÎªÓû§Ìṩ×îÖÕ¼ÛÖµ¡£Ã¿¸ö·þÎñÔËÐÐÔÚÆä¶ÀÁ¢µÄ½ø³ÌÖУ¬·þÎñÓë·þÎñÖ®¼ä²ÉÓÃÇáÁ¿¼¶µÄͨÐÅ»úÖÆ»¥Ï๵ͨ£¨Í¨³£ÊÇ»ùÓÚ
HTTP µÄ RESTful API£©¡£Ã¿¸ö·þÎñ¶¼Î§ÈÆ×žßÌåÒµÎñ½øÐй¹½¨£¬²¢ÇÒÄܹ»±»¶ÀÁ¢µØ²¿Êðµ½Éú²ú»·¾³¡¢ÀàÉú²ú»·¾³µÈ¡£ÁíÍ⣬Ӧ¾¡Á¿±ÜÃâͳһµÄ¡¢¼¯ÖÐʽµÄ·þÎñ¹ÜÀí»úÖÆ£¬¶Ô¾ßÌåµÄÒ»¸ö·þÎñ¶øÑÔ£¬Ó¦¸ù¾ÝÒµÎñÉÏÏÂÎÄ£¬Ñ¡ÔñºÏÊʵÄÓïÑÔ¡¢¹¤¾ß¶ÔÆä½øÐй¹½¨¡£
Martin Fowler Êǹú¼ÊÖøÃûµÄÈí¼þר¼Ò£¬Ãô½Ý¿ª·¢·½·¨µÄ´´Ê¼ÈËÖ®Ò»£¬ÏÖΪ ThoughtWorks
¹«Ë¾µÄÊ×ϯ¿ÆÑ§¼Ò¡£ÔÚÃæÏò¶ÔÏó·ÖÎöÉè¼Æ¡¢UML¡¢Ä£Ê½¡¢Èí¼þ¿ª·¢·½·¨Ñ§¡¢XP¡¢Öع¹µÈ·½Ã棬¶¼°çÑÝמÙ×ãÇáÖØµÄ¿ª´´Õß½ÇÉ«¡£ÔçÔÚ20ÊÀ¼Í80Äê´ú£¬Fowler
¾ÍÊÇʹÓöÔÏó¼¼Êõ¹¹½¨¶à²ãÆóÒµÓ¦Óõij«µ¼Õߣ¬ËûÖøÓм¸±¾¾µäÊé¼®£º ¡¶ÆóÒµÓ¦Óüܹ¹Ä£Ê½¡·¡¢¡¶UML¾«´â¡·ºÍ¡¶Öع¹¡·µÈ¡£
΢·þÎñÓ봫ͳ¿ª·¢·½Ê½µÄÇø±ð
Óë΢·þÎñ¼Ü¹¹Ïà¶ÔÓ¦£¬´«Í³¿ª·¢·½Ê½Í¨³£±»³ÆÎªµ¥Ìåʽ¼Ü¹¹£¨Monolithic Architecture£©¡£ËùÓй¦Äܶ¼´ò°üÔÚÒ»Æð£¬»ù±¾Ã»ÓÐÍⲿÒÀÀµ£¬ÆäÖаüº¬ÁËÊý¾ÝÊäÈë/Êä³ö¡¢Êý¾Ý´¦Àí¡¢ÒµÎñʵÏÖ¡¢´íÎó´¦Àí¡¢Ç°¶ËÏÔʾµÈËùÓÐÂß¼¡£
ÏÂͼÏÔʾµÄÒ»¸öµäÐ͵ĵ¥Ìåʽ¼Ü¹¹Ê¾Òâͼ£º

ÕâÖּܹ¹ÓÐÆäÓŵ㣬°üÀ¨£º
¿ª·¢ÍŶӵÄ×éÖ¯¼Ü¹¹¼òµ¥£¬±ãÓÚ¼¯ÖÐʽ¹ÜÀí¡£
ÒòΪ¿ª·¢½ø¶Èͳһ¹ÜÀí£¬±ÜÃâÖØ¸´¿ª·¢µÄÎÊÌâ¡£
ËùÓй¦Äܶ¼¼¯ÖÐÔÚ±¾µØ£¬²»´æÔÚ·Ö²¼Ê½µÄ¹ÜÀíºÍµ÷ÓÃËðºÄ¡£
µ«ÊÇ£¬Ëæ×ÅÏÖ´úÓ¦ÓóÌÐòµÄÈÕÒæ¸´ÔÓ»¯£¬¼ÓÉ϶ÔÓÚµü´úËٶȵÄÒªÇóÔ½À´Ô½¸ß£¬ÕâÖּܹ¹µÄ²»×㿪ʼ±©Â¶³öÀ´£º
ЧÂʵͣºËùÓпª·¢ÈËÔ±¶¼ÔÚͬһ¸öÏîÄ¿ÏÂÐ޸ĴúÂ룬¾³£ÐèÒªÏ໥µÈ´ý¶Ô·½µÄ¹¦ÄܸüУ¬´úÂëÈë¿âʱµÄ³åÍ»²»¶Ï£¬Ôì³É¼«¸ßµÄ¿ª·¢³É±¾¡£
ά»¤ÄÑ£º¸÷¸öÄ£¿éµÄ´úÂë¶¼ñîºÏÔÚÒ»Æð£¬Ò»·½ÃæÐÂÈ˲»ÖªµÀ´ÓºÎÏÂÊÖ£¬Ò»·½ÃæÒ»µ©³öÏÖÎÊÌ⣨Bug£©£¬¾ÍÐèÒª´ó¸Ä¡£ÔÚij¸öÄ£¿éÐèÒªÉý¼¶Ê±£¬Ò²²»µÃ²»Éý¼¶Õû¸öÓ¦ÓóÌÐò¡£
²»Áé»î£º¹¹½¨£¨Build£©Ê±¼ä¹ý³¤£¬ÈκÎÒ»¸öСÁ¿¼¶µÄÐ޸쬶¼ÒªÖع¹Õû¸öÏîÄ¿£¬·Ç³£ºÄʱ¡£
Îȶ¨ÐԲһ¸ö΢СµÄÎÊÌ⣬¶¼¿ÉÄܵ¼ÖÂÕû¸ö½ø³Ì±ÀÀ££¬Ê¹µÃÕû¸öÓ¦ÓóÌÐòÎÞ·¨¹¤×÷¡£
À©Õ¹ÐÔ²»¹»£ºÄÑÒÔ·Ö²¼Ê½²¿ÊðºÍÀ©ÈÝ£¬ÎÞ·¨Âú×ã¸ß²¢·¢ÏµÄÒµÎñÐèÇó¡£¶øÇÒ£¬Ò»µ©ÒµÎñ·¶Î§À©Õ¹»òÕßÐèÇóÓÐËù±ä»¯£¬ÄÑÒÔ¸´ÓÃÔÓеķþÎñ£¬±ØÐëÖØÐ¿ª·¢¡£
ÈçºÎ½â¾öÕâЩÎÊÌ⣿΢·þÎñ¼Ü¹¹Ö𽥸¡³öË®Ãæ¡£´ÓÈí¼þ¿ª·¢µÄ×éÖ¯ÉÏÀ´Ëµ£¬ËüµÄºËÐÄÀíÄîÊǰ´ÕÕÒµÎñ±ß½ç°ÑÕû¸öϵͳ»®·ÖΪÈô¸É¸ö¡°×Óϵͳ¡±¡£Ã¿¸ö×ÓϵͳµÄ¿ª·¢ÍŶÓÖ®¼ä£¬±£³ÖןÏ×÷£¨Inter-Operate£©¶ø²»ÊÇÕûºÏ£¨Intergrate£©µÄ¹ØÏµ¡£¶¨ÒåºÃÿ¸ö×ÓϵͳµÄ±ß½çºÍ½Ó¿Ú£¬ÔÚÒ»¸öÍŶÓÄÚ×ÔÖΡ£ÍŶӰ´ÕÕÕâÑùµÄ·½Ê½×齨£¬¹µÍ¨µÄ³É±¾Î¬³ÖÔÚϵͳÄÚ²¿£¬Ã¿¸ö×Óϵͳ¾Í»á¸ü¼ÓÄÚ¾Û£¬±Ë´ËµÄÒÀÀµñîºÏÄܱäÈõ£¬¿çϵͳµÄ¹µÍ¨³É±¾Ò²¾ÍÄܽµµÍ¡£
ÕâÀï²»µÃ²»Ìá¼°ÖøÃûµÄ¡°¿µÍþ¶¨ÂÉ¡±£¨Conway's Law£©£¬ÕâÊÇ΢·þÎñ¼Ü¹¹µÄÒ»¸öºËÐÄÀíÄî¡£
Melvin Conway ÔÚ1967ÄêÌá³öÁËÕâ¸öÀíÄÔÎÄÊÇ£º¡°Organizations which
design systems are constrained to produce designs
which are copies of the communication structures of
these organizations.¡±
Óüòµ¥µÄ»°À´Ëµ£¬¾ÍÊÇ×éÖ¯ÐÎʽµÈͬÓÚϵͳÉè¼Æ£¬×éÖ¯µÄ¹µÍ¨·½Ê½»áͨ¹ýϵͳÉè¼Æ±íÏÖ³öÀ´¡£ÏÂÃæÕâ·ùÖøÃûµÄÈí¼þÆóÒµ×é֯ͼ£¬ÓëÕâЩÆóÒµµÄ²úÆ·¼Ü¹¹ÓÐ×ÅÒìÇúͬ¹¤µÄ¶ÔÓ¦¹ØÏµ¡£

ÔÙÒÔÉÏÃæÌáµ½µÄµ¥Ìåʽ App ΪÀý£¬Í¨¹ýÓÃ΢·þÎñ¼Ü¹¹·½Ê½¶ÔÆä½øÐиÄÔ죬½«»á±ä³ÉÏÂÃæÕâÖֽṹ£º

³ýÁ˽â¾öµ¥Ìåʽ¼Ü¹¹µÄ¼¸¸öȱÏÝÒÔÍ⣬΢·þÎñ¼Ü¹¹»¹¾ßÓÐÏÂÃæÕâЩÓŵ㣺
²¿Ê𡢻عö±äµÃ¸ü¿ì¡¢¸ü¼ò±ã¡£
΢·þÎñ¼Ü¹¹ÖУ¬ÌᳫÕë¶Ô²»Í¬µÄÒµÎñÌØÕ÷Ñ¡ÔñºÏÊʵļ¼Êõ·½°¸£¬ÓÐÕë¶ÔÐԵĽâ¾ö¾ßÌåÒµÎñÎÊÌ⣬¶ø²»ÊÇÏñµ¥¿é¼Ü¹¹ÖвÉÓÃͳһµÄƽ̨»ò¼¼ÊõÀ´½â¾öËùÓÐÎÊÌâ¡£ÕâÑù¾ÍʵÏÖÁ˼¼ÊõµÄ¶àÔª»¯£¬ÎÞÐ賤ʱ¼äËø¶¨ÓÚijһÖÖ¼¼ÊõÕ»£¬±ãÓÚ²ÉÓÃ×îÐµĹ¤¾ß¡£
ÿ¸ö·þÎñ¶¼¿ÉÒÔµ¥¶ÀÀ©ÈÝ¡£
ÔÚÐèÒª·¢²¼Ð¹¦ÄÜʱ£¬¿ÉÒÔÓòå¼þµÄÐÎʽÌí¼Óµ½ÏµÍ³Öжø²»ÐèÒªÖØÐ²¿ÊðÕû¸öϵͳ¡£
΢·þÎñ¼Ü¹¹Ìṩ×ÔÖ÷¹ÜÀíÆäÏà¹ØµÄÒµÎñÊý¾Ý£¬ÕâÑù¿ÉÒÔËæ×ÅÒµÎñµÄ·¢Õ¹ÌṩÊý¾Ý½Ó¿Ú¼¯³É£¬¶ø²»ÊÇÒÔÊý¾Ý¿âµÄ·½Ê½Í¬ÆäËû·þÎñ¼¯³É¡£ÁíÍâ£¬Ëæ×ÅÒµÎñµÄ·¢Õ¹£¬¿ÉÒÔ·½±ãµØÑ¡Ôñ¸üºÏÊʵŤ¾ß¹ÜÀí»òÕßÇ¨ÒÆÒµÎñÊý¾Ý¡£
µ±È»Ò²ÐèÒªÌáµ½£¬Î¢·þÎñ¼Ü¹¹Ò²´æÔÚ×ÅËüµÄ²»×㣺
ÓÉÓÚ°Ñÿ¸ö×Óϵͳ·ÖÅä¸÷²»Í¬µÄÍŶӣ¬Õâ²»½öÒâζ×ÅϵͳÄÚ²¿Í¨ÐÅÐèÇóµÄÔö¼Ó£¬Ò²´øÀ´Á˲»Í¬ÍŶÓÖ®¼ä½»Á÷³É±¾µÄÌá¸ß¡£
ÔÚ¶Ô»ùÓÚ΢·þÎñ¼Ü¹¹µÄ·Ö²¼Ê½ÏµÍ³½øÐвâÊÔʱ£¬¸´ÔÓ¶È»á´ó·ù¶ÈÌá¸ß¡£
·Ö²¼Ê½²¿Êð»á¸øÍÅ¶ÓµÄ DevOps ÄÜÁ¦Ìá³ö¸ü¸ßµÄÒªÇó¡£
µ±·þÎñÊýÁ¿Ôö¼Óʱ£¬¹ÜÀíµÄ¸´ÔÓ¶ÈÒ²»áÖ¸Êý¼¶Ôö¼Ó¡£
DevOps£¨Development ºÍ Operations µÄ×éºÏ´Ê£©ÊÇÒ»ÖÖÖØÊÓÈí¼þ¿ª·¢ÈËÔ±ºÍ
IT ÔËά¼¼ÊõÈËÔ±Ö®¼ä¹µÍ¨ºÏ×÷µÄÎÄ»¯¡¢Á÷³Ì»òÕßʵ¼ù·½Ê½¡£Í¸¹ýÍêÈ«×Ô¶¯µÄ¡°Èí¼þ½»¸¶¡±ºÍ¡°¼Ü¹¹±ä¸ü¡±Á÷³Ì£¬Ê¹µÃ¹¹½¨¡¢²âÊÔ¡¢·¢²¼Èí¼þ¸ü¼Ó¿ì½Ý¡¢Æµ·±ºÍ¿É¿¿¡£
΢·þÎñ¼Ü¹¹¶Ô²âÊÔÈËÔ±Òâζ×Åʲô£¿
½éÉÜÍê΢·þÎñ¼Ü¹¹ÒԺ󣬻ص½Ö÷ÌâÉÏÀ´£º¶ÔÓÚ²âÊÔÈËÔ±¶øÑÔ£¬Î¢·þÎñ¼Ü¹¹µ½µ×ÓÐÊ²Ã´ÌØµãÄØ£¿ÎÒ°ÑËü¹é½áΪÒÔϼ¸µã£º
1.ÿ¸ö·þÎñ³Ðµ£Ò»¶¨µÄÖ°Ô𣺡°¾¡¿ÉÄÜС£¬µ«ÊÇÓÖ´ïµ½±ØÒªµÄ¹æÄ££¨as small as possible
but as big as necessary£©¡± ¡£
ÔÚÎÊ´ðÍøÕ¾ Quora ÉÏ£¬ÓÐÒ»¸öÖøÃûµÄÎÊÌ⣺ʲôÊdzÌÐòÔ±¾õµÃ×îÀË·Ñʱ¼äµÄÊÂÇ飿ÅÅÃûµÚÒ»µÄ»Ø´ðÖÐÌáµ½£º¡°²»±ØÒªµÄ΢·þÎñ¡£¡±
Õâ¾ä»°½ÒʾÁË¿ª·¢ÍŶÓÔÚתÏò΢·þÎñ¼Ü¹¹Ê±¾³£×ßÈëµÄÎóÇø¡£¡°Î¢¡±¹ÌÈ»ÖØÒª£¬µ«ÊÇÊ×ÒªµÄÊÇÌṩ¡°·þÎñ¡±£¬Õâ²Å¹¹³É¡°Î¢·þÎñ¡±µÄ¼ÛÖµ¡£Ã¤Ä¿µØÇзֹ¦ÄÜ£¨Feature£©£¬È´Ã»ÓÐÆðµ½½âñîºÏµÄ×÷Óã¬Ö»ÊÇ»áÔö¼Óά»¤¡¢²âÊԵijɱ¾¡£±Ï¾¹£¬¶àÒ»Ïî·þÎñ£¬¾Í»á¶à³öһϵÁеÄÁ÷Ë®ÏߺͲâÊÔÒªÇó¡£Òò´Ë£¬²âÊÔ¡¢ÖÊÁ¿ÈËÔ±ÔÚÃæÁÙÍŶӼƻ®²Éȡ΢·þÎñ¼Ü¹¹µÄ¾ö²ßʱ£¬±ØÐëÒª¸ÒÓÚÖÊÒÉ£ºÊÇ·ñÓÐÕâÑù×öµÄ±ØÒª£¿Ä¿µÄÊÇÈþö²ßÈËÔ±Òâʶµ½ÕâÖÖתÐ͵ÄDZÔڳɱ¾£¬±ÜÃ⻨ÎÞÓù¦¡£
2.΢·þÎñÖ®¼äͨ³£Í¨¹ý Rest over HTTP Á¬½Ó¡£
×î³£¼ûµÄÁ¬½Ó/½»»¥·½Ê½£¬¼´Í¨¹ý POST¡¢GET¡¢PUT¡¢DELETE ÕâЩÃüÁî²Ù×÷ API£¬Í¨¹ý
JSON ´«µÝ²ÎÊý¡£ÒÔÏÂÃæÕâ¸öµäÐ͵ÄÖÆÔìÐÍÆóÒµµÄÔËӪϵͳΪÀý¡£ÔÚ´Óµ¥Ìåʽ¼Ü¹¹×ªÎªÎ¢·þÎñÖ®ºó£¬²»Í¬¹¦ÄÜÄ£¿éÖ®¼ä½«Í¨¹ý
Rest ·½Ê½»¥Ïà·ÃÎÊ¡£
.png)
ÕâÖÖ¼òÒס¢Ã÷È·µÄ½»»¥·½Ê½ÎªÆõÔ¼²âÊÔ£¨Contract Test£©ÌṩÁË»ù´¡¡£
3.ÿÖÖ·þÎñ²»Ò»¶¨ÌṩÓû§½çÃæ¡£
ÕâÒâζ×ÅÿÖÖ·þÎñµÄ²âÊÔ£¬²¢²»Ò»¶¨Äܹ»»òÕßÐèÒª´Ó UI Íê³É¡£Õâ¶Ô
API ¼¶±ðµÄ¼¯³É»¯²âÊÔÌá³öÁËÒªÇó¡£
4.΢·þÎñͨ³£»¹¿ÉÒÔ»®·ÖΪ¸üСµÄÄ£¿é¡£
ÈçÏÂͼËùʾ£¬Ò»¸öµäÐ͵Ä΢·þÎñ¿ÉÒÔ·ÖΪÕ⼸¸öÄ£¿é£º×ÊÔ´¡¢ÒµÎñÂß¼¡¢Êý¾Ý´æ´¢½Ó¿Ú¡¢ÍⲿͨÐŽӿڵȡ£

ÕâÒâζ×Å£¬ÔÚ¶Ô΢·þÎñ¼Ü¹¹½øÐвâÊÔʱ£¬¿ÉÒÔ´Ó²»Í¬µÄÄ£¿é×ÅÊÖ£¬½øÐÐÏàÓ¦µÄÄ£¿é²âÊÔ¡£
×ܽá
¼òµ¥×ܽáÒ»ÏÂËùѧϰµÄÄÚÈÝ£º
΢·þÎñ¼Ü¹¹ÊÇÕë¶Ôµ¥Ìåʽ¼Ü¹¹µÄ²»×ã£¬Ëæ×ÅÓ¦ÓóÌÐò¸´ÔӶȵÄÔö¼Ó¡¢²¿ÊðƵÂʼӿìµÄÒªÇó£¬Ó¦Ô˶øÉú¡£
΢·þÎñ¼Ü¹¹´øÀ´Á˼ò»¯²¿Ê𡢸ôÀ빦ÄÜ/ȱÏÝ¡¢±ãÓÚÉý¼¶/À©ÈݵÈÓŵ㣬µ«Ò²¾ßÓÐÌá¸ß½»Á÷³É±¾¡¢Ôö¼Ó²âÊÔ¸´ÔӶȵȲ»×ã¡£
¶ÔÓÚ²âÊÔÈËÔ±£¬Î¢·þÎñ¼Ü¹¹¾ß±¸Ò»Ð©ÌرðÐèҪעÒâµÄÌØÕ÷£¬ÒªÇó²ÉÓò»Í¬µÄ²âÊÔ·½·¨¼ÓÒÔÓ¦¶Ô¡£
΢·þÎñ¶ÔÈí¼þ²âÊÔÌá³öµÄÌôÕ½
ÔÚÉÏÒ»½ÚÀÎÒÃÇѧϰÁË΢·þÎñµÄÀ´Ô´ºÍÖ÷ÒªÌØµã¡£¶ÔÓÚÈí¼þ²âÊÔÈËÔ±¶øÑÔ£¬Î¢·þÎñ¼Ü¹¹¶ÔÈí¼þ²âÊÔ´øÀ´ÁËÄÄЩеÄÌôսĨ£¿ÎÒÃÇÓ¦¸ÃÓÃʲôÑùµÄ²ßÂԺͷ½·¨À´Ó½ÓÕâЩÌôÕ½£¿
×ÜÌåµÄ²âÊÔ²ßÂÔ
Èí¼þ²âÊÔµÄÄ¿µÄÊÇÈ·±£Èí¼þ²úÆ·µÄÖÊÁ¿·ûºÏÔ¤ÆÚ¡£ºâÁ¿²âÊÔÖÊÁ¿µÄÖ¸±êÓкܶ࣬×î³£¼ûµÄÊDzâÊÔ¸²¸ÇÂʺͲâÊԳɱ¾£¨°üÀ¨²âÊÔËùÓÃʱ¼ä¡¢²âÊÔά»¤³É±¾£©£¬¶øºâÁ¿²âÊÔЧ¹ûµÄÖ÷ÒªÊÖ¶ÎÔòÊÇ×îÖÕ²úÆ·ÔÚʵ¼ÊʹÓÃÖб©Â¶³öÀ´µÄÎÊÌâÊýÁ¿£¨Bug
Number£©¡£
¾ßÌåµ½²ÉÓÃ΢·þÎñ¼Ü¹¹µÄ²úÆ·¶øÑÔ£¬Martin Fowler ÔÚ¹ØÓÚÈí¼þ²âÊÔµÄÂÛÊöÖÐÌá³öÁËÆäÄ¿µÄ£º
¿ª·¢ÍŶӲÉÓõÄÈκβâÊÔ²ßÂÔ£¬¶¼Ó¦µ±Á¦ÇóΪ·þÎñÄÚ²¿Ã¿¸öÄ£¿éµÄÍêÕûÐÔ£¬ÒÔ¼°Ã¿¸öÄ£¿éÖ®¼ä¡¢¸÷¸ö·þÎñÖ®¼äµÄ½»»¥£¬Ìá¹©È«ÃæµÄ²âÊÔ¸²¸ÇÂÊ£¬Í¬Ê±»¹Òª±£³Ö²âÊÔµÄÇá±ã¿ì½Ý¡£
Òò´Ë£¬ÎÒÃÇÐèÒª²ÉÈ¡ÏÂÃæ¼¸µã²âÊÔ²ßÂÔ£º
ÎÒÃÇÒ»·½ÃæÒª±£Ö¤´Ó¸÷¸öά¶ÈÉÏ£¬ÎÞÒ»ÒÅ©µØ¶Ô΢·þÎñ½øÐÐÈ«ÃæµÄ²âÊÔ£¬ÌرðÊǶÔÓÚ·Ö²¼Ê½µÄϵͳ£¬ÏµÍ³µÄËùÓвã´Î¶¼±ØÐë±»¸²¸Çµ½£»ÁíÒ»·½ÃæÓÖҪȷ±£²âÊÔÖ´ÐеĿì½Ý£¬ÕâÑù²ÅÄܱ£Ö¤³ÖÐø¼¯³É/³ÖÐø½»¸¶£¨CI/CD£©µÄʵÏÖ¡£
Ҫȷ±£²âÊÔ²ßÂÔµÄÕýȷʵʩ£¬¹¤¾ßºÍ¼¼Êõ¹ÌÈ»ÖØÒª£¬È»¶ø£¬Ê×ÏÈÐèÒª²âÊÔÈËÔ±ÔÚÍŶÓÖÐÊ÷Á¢ÆðÌᳫÖÊÁ¿µÚÒ»µÄ¡°²âÊÔÎÄ»¯¡±£º
ÎÞ·¨Í¨¹ý²âÊԵĴúÂë²»Ó¦¸Ã±»ºÏ²¢µ½´úÂë²Ö¿âÀ
ÎÞ·¨Í¨¹ý²âÊԵĴúÂë²»Ó¦¸Ã±»·¢²¼³öÈ¥¡£
²»ÄÜΪÁ˲âÊÔ¶ø²âÊÔ£¬²âÊÔµÄÕæÕýÄ¿µÄÊÇΪÁ˽»¸¶¸ßÖÊÁ¿µÄÈí¼þ¸øÓû§£¬¶ø²»ÊǰÑ×ÊÔ´ÀË·ÑÔÚûÓÐʵ¼ÊÒâÒåµÄ²âÊÔÓÃÀýÉÏ¡£ËùÓеIJâÊÔ²ã´Î¡¢Á÷³ÌºÍÓÃÀý£¬¶¼Ó¦¸ÃÓеķÅʸ¡£
´«Í³²âÊÔ·½·¨ÃæÁÙµÄÌôÕ½
ÒÔÒ»¸ö³£¼ûµÄ¿ª·¢ÍŶÓΪÀý£¬ÔÚ²ÉÓÃÁË΢·þÎñ¼Ü¹¹Ö®ºó£¬ºÜ¿ÉÄÜͬʱ»á¿ª·¢¶à¸öÄ£¿é£¨¼´Î¢·þÎñ£©£¬Ã¿¸ö΢·þÎñÓв»Í¬µÄ¿Í»§ÒªÇ󡢿ª·¢ÖÜÆÚ¡¢¿ª·¢½ø¶ÈºÍ½»¸¶ÆÚÏÞ£¬µ«ÊÇÕû¸öÍŶÓÓÖ±ØÐë±£Ö¤Äܹ»Ôڹ̶¨µÄʱ¼ä½Úµã£¨Æ©ÈçÿÔÂÒ»´Î¡¢Ã¿Á½ÖÜÒ»´Î£¬ÉõÖÁÿÌìÒ»´Î»òÕß¶à´Î£©£¬³ÖÐøµØ¡¢Îȶ¨µØÎªÓû§Ìṩ¿ÉÒÔ²¿Êð¡¢Ê¹ÓõIJúÆ·¡£ÕâÒâζ×Å£¬¹ýÈ¥ÄÇÖÖÏȵȲúÆ·¾Àí¡¢ÒµÎñ²¿ÃÅÌṩÐèÇ󣬿ª·¢ÈËÔ±ÔÙ½øÐпª·¢£¬×îºó½»¸ø²âÊÔÈËÔ±Ö´Ðм¯³É²âÊÔ¡¢¶Ëµ½¶Ë²âÊԵķ½·¨£¬ÒѾÎÞ·¨Ìṩ×ã¹»µÄ²âÊÔÁ£¶ÈºÍ×ã¹»¿ìµÄÏìÓ¦ËÙ¶È¡£
¹é½áÆðÀ´£¬Óë»ùÓÚµ¥Ìåʽ¼Ü¹¹µÄ´«Í³²âÊÔ·½·¨Ïà±È£¬Î¢·þÎñ¼Ü¹¹¶Ô²âÊÔÌá³öÁËÒÔÏÂÌôÕ½£º
·þÎñ/Ä£¿é/²ã´Î£¨layer£©Ö®¼ä´æÔÚ¸´ÔÓµÄÒÀÀµÐÔ¡£
ÔÚµ¥Ìåʽ¼Ü¹¹ÖУ¬Í¨³£Ê¹Óü¯³É²âÊÔÀ´ÑéÖ¤ÒÀÀµÊÇ·ñÕý³£¡£¶øÔÚ΢·þÎñ¼Ü¹¹ÖУ¬·þÎñÊýÁ¿ÍùÍùºÜ¶à£¬Ã¿¸ö·þÎñ¶¼ÊǶÀÁ¢µÄÒµÎñµ¥Ôª£¬·þÎñÖ®¼äÖ÷Ҫͨ¹ý½Ó¿Ú½øÐн»»¥£¬ÈçºÎ±£Ö¤ÕâЩÒÀÀµµÄÕý³££¬ÊDzâÊÔÈËÔ±ÃæÁÙµÄÖ÷ÒªÌôÕ½¡£ÕâÒâζ×Å£¬Èç¹ûÏëµ¥¶À²âÊÔijһ¸ö·þÎñ£¬»òÕß·þÎñÖеÄij¸öÄ£¿é£¬¾Í±ØÐë°þÀëËüÃǶÔÓÚÆäËû»·½ÚµÄÒÀÀµ¹ØÏµ¡£ÕâÐèҪͨ¹ý
Mock¡¢Stub µÈ·½·¨À´ÊµÏÖ¡£
²»Í¬µÄ·þÎñ¿ÉÄÜ»áÔÚ²»Í¬µÄ»·¾³/ÉèÖÃÏÂÔËÐС£
ÌØ±ðÊÇһЩºó¶Ë·þÎñ£¬Óëǰ¶Ë·þÎñµÄÔËÐл·¾³¿ÉÄܽØÈ»²»Í¬¡£ÕâʱÔÚ¿¼ÂǶÔÿÖÖ·þÎñÉèÁ¢×Ô¶¯»¯¹ÜÏßʱ£¬¾Í±ØÐëÓÐÕë¶ÔÐÔµÄÉèÖÃÏàÓ¦µÄ»·¾³ÅäÖ᣶øÇÒ£¬ÔÚ΢·þÎñ¼Ü¹¹ÖУ¬Ã¿¸ö·þÎñ¶¼¶ÀÁ¢²¿Ê𣬽»¸¶ÖÜÆÚ¶ÌÇÒÆµÂʸߣ¬È˹¤²¿ÊðÒѾÎÞ·¨ÊÊÓ¦ÒµÎñµÄ¿ìËٱ仯¡£Òò´ËÈçºÎÓÐЧµØ¹¹½¨×Ô¶¯»¯²¿ÊðÌåϵ£¬±£Ö¤ÅäÖõÄÎȶ¨ÐÔ¡¢¿ÉÖØ¸´ÐÔ£¬ÊÇ΢·þÎñ²âÊÔÃæÁÙµÄÁíÒ»¸öÌôÕ½£¬±ØÐëÓë
DevOps ÈËԱһͬ½â¾ö¡£
Éæ¼°¶à¸ö·þÎñµÄ UI ¶Ëµ½¶Ë²âÊÔ£¨End-to-End ²âÊÔ£¬¼ò³Æ E2E ²âÊÔ£©·Ç³£ÈÝÒ׳ö´í¡£
ÒòΪÿÖÖ·þÎñµÄ¿ª·¢½ø¶È²»Í¬£¬¼¯³É²»Í¬·þÎñµÄ¶Ëµ½¶Ë²âÊÔÍùÍù»áÒòΪijһ¸ö·þÎñµÄ΢С¸Ä¶¯¶ø³ö´í¡£ÕâÖÖ³ö´íÊDzâÊÔÈËԱϣÍû±ÜÃâµÄ¸ÉÈÅÐÅÏ¢¡£ÕâÒâζ×Å£¬¶Ô¶Ëµ½¶Ë²âÊÔµÄÉè¼Æ£¬±ØÐë²Éȡһ¶¨µÄ·À¸ÉÈÅ¡¢·ÀÎ󱨲ßÂÔ¡£
²âÊÔ½á¹û¿ÉÄÜÈ¡¾öÓÚÍøÂçµÄÎȶ¨ÐÔ¡£
΢·þÎñ¼Ü¹¹ÊÇ»ùÓÚ·Ö²¼Ê½µÄϵͳ£¬¶ø¹¹½¨·Ö²¼Ê½ÏµÍ³±ØÈ»»á´øÀ´¶îÍâµÄ¿ªÏú¡£
ÐÔÄÜ£º ·Ö²¼Ê½ÏµÍ³ÊÇ¿ç½ø³Ì¡¢¿çÍøÂçµÄµ÷Óã¬ÊÜÍøÂçÑӳٺʹø¿íµÄÓ°Ïì¡£
¿É¿¿ÐÔ£º ÓÉÓڸ߶ÈÒÀÀµÓÚÍøÂç×´¿ö£¬ÈκÎÒ»´ÎµÄÔ¶³Ìµ÷Óö¼ÓпÉÄÜʧ°Ü£¬Ëæ×Å·þÎñµÄÔö¶à»¹»á³öÏÖ¸ü¶àµÄDZÔÚ¹ÊÕϵ㡣Òò´Ë£¬ÈçºÎÌá¸ßϵͳµÄ¿É¿¿ÐÔ¡¢½µµÍÒòÍøÂçÒýÆðµÄ¹ÊÕÏÂÊ£¬ÊÇϵͳ¹¹½¨µÄÒ»´óÌôÕ½¡£
Òì²½£º Ò첽ͨÐÅ´ó´óÔö¼ÓÁ˹¦ÄÜʵÏֵĸ´ÔÓ¶È£¬²¢ÇÒ°éËæ×Ŷ¨Î»ÄÑ¡¢µ÷ÊÔÄѵÈÎÊÌâ¡£
Êý¾ÝÒ»ÖÂÐÔ£º Òª±£Ö¤·Ö²¼Ê½ÏµÍ³µÄÊý¾ÝǿһÖÂÐÔ£¬³É±¾ÊǷdz£¸ßµÄ£¬ÐèÒªÔÚ C£¨Ò»ÖÂÐÔ£©A£¨¿ÉÓÃÐÔ£©P£¨·ÖÇøÈÝ´íÐÔ£©ÈýÕßÖ®¼ä×ö³öȨºâ¡£
ÌØ±ðÊÇÉæ¼°µ½Êý¾Ý´æ´¢ºÍÍⲿͨÐŵIJ¿·Ö£¬Èç¹ûÔÚ²âÊÔÖв»°ÚÍÑÕâЩÒòËØµÄÓ°Ï죬¾Í¿ÉÄÜ»áµÃµ½Ò»Ð©Ëæ»úÐÔµÄÎ󱨣¬¸ÉÈŲâÊÔ½á¹û¡£
¹ÊÕÏ·ÖÎöµÄ¸´ÔÓ¶È»áËæ×Å·þÎñµÄÔö¼Ó¶øÌá¸ß¡£
΢·þÎñ¼Ü¹¹ÖУ¬ÒòΪÿ¸ö·þÎñ¶¼ÐèÒª¶ÀÁ¢µØÅäÖᢲ¿Êð¡¢¼à¿ØºÍÊÕ¼¯ÈÕÖ¾£¬Òò´ËÔÚ·¢ÏÖÎÊÌâÖ®ºó£¬½øÐÐÕï¶Ï·ÖÎöʱ£¬ËѼ¯È±ÏÝÐÅÏ¢µÄ³É±¾³ÊÖ¸Êý¼¶Ôö³¤¡£
Óë½»¸¶ÖÜÆÚ²»Í¬µÄ¿ª·¢ÍŶÓÖ®¼äµÄ½»Á÷³É±¾¡£
ÕâÒ»µãËäÈ»¸ú¼¼ÊõÎ޹أ¬µ«ÊÇʵ¼ÊÉÏ»á¶Ô²âÊÔÈËÔ±µÄ¹¤×÷Ôì³ÉºÜ´óµÄÀ§ÈÅ¡£ÒòΪ¿ª·¢Ä£Ê½·Ö½âΪ¸ºÔð²»Í¬·þÎñµÄ¶à¸öС×飬²âÊÔÈËÔ±ÍùÍùÿÌìÒª»¨·Ñ´óÁ¿µÄʱ¼ä£¬Á˽ⲻͬÍŶӵĿª·¢½ø¶È¡£Èç¹û»¹ÐèÒªÊÖ¶¯½øÐлعé²âÊÔ£¨Regression
Test£©£¬×îÖÕ½«»á²»¿°Öظº¡£ËùÒÔ×Ô¶¯»¯²âÊÔÊDZØÐë²ÉÈ¡µÄÊֶκͷ½Ïò¡£
ÈçºÎÓ¦¶ÔÕâЩÌôÕ½£¬ÎÒ×ܽáÁËÏÂÃæÕâÈý¸öÔÔò£º
1.×Ô¶¯»¯£º²âÊÔÈÎÎñµÄÔö¼Ó£¬ÒªÇó²âÊÔÈËÔ±±ØÐë°ÑÖ÷ÒªµÄ¾«Á¦ÓÃÓÚ½«²âÊÔ×Ô¶¯»¯£¬°ÚÍÑÊÖ¶¯²âÊÔ´øÀ´µÄ³ÁÖØ¸ºµ£¡£µ±È»£¬×Ô¶¯»¯²âÊÔ±ØÐë×ã¹»Îȶ¨¡¢ÎȽ¡£¬²»Äܶ¯éüÎ󱨣¬·ñÔò·´¶ø»áµ¼ÖºܸߵÄά»¤³É±¾¡£
2.²ã´Î»¯£ºÕâÒâζ×ŲÉÓ÷ֲã´ÎµÄ²âÊÔ·½·¨£¬Á£¶ÈÓÉϸµ½´Ö£¬·¶Î§ÓÉСµ½´ó¡£ÏÂͼ˵Ã÷Á˼¸¸öÖ÷Òª²ã´ÎÖ®¼äµÄ¹ØÏµ£º

Õâ¾ÍÊÇ Mike Cohn Ìá³öµÄ²âÊÔ½ð×ÖËþ£¨Test Pyramid£©£¬ÆäÖÐ×îÖØÒªµÄÁ½¸öÔÔòÊÇ£º
Ó¦¸ÃÓò»Í¬µÄÁ£¶ÈÀ´²âÊÔÓ¦ÓóÌÐò£»
²ã´ÎÔ½¸ß£¬²âÊÔÔ½ÉÙ¡£
×îµ×²ãµÄÊǵ¥Ôª²âÊÔ£¨Unit Test£©£¬Á£¶È×îϸ£¬ËÙ¶È×î¿ì£¬Î¬»¤³É±¾Ò²×îµÍ¡£ÍùÉÏÊÇÕë¶ÔÿÖÖ·þÎñÄÚ²¿µÄ¸÷ÖÖÄ£¿é¡¢ÒµÎñÁ÷³ÌµÄ²âÊÔ¡£×îÉÏÃæÊÇ»ùÓÚǰ¶Ë
UI µÄ²âÊÔ£¬Õⲿ·ÖµÄÁ£¶È×î´Ö£¬·¶Î§×î´ó£¨ÒòΪ»á¸²¸Ç´ó¶àÊý·þÎñ£©£¬µ«ÊÇά»¤³É±¾×î¸ß£¬ÒòΪÉÔ΢ÓÐЩϸ΢µÄ±ä»¯¾Í¿ÉÄÜÐèÒªµ÷Õû½Å±¾¡£¶øÇÒ£¬ÓÉÓÚ»ùÓÚǰ¶Ë£¬ÐèÒªÉèÖúܶàÏìӦʱ¼äºÍµÈ´ýʱ¼ä£¬ËùÒÔËÙ¶È×îÂý¡£
Mike Cohn ÊÇ Scrum Èí¼þ¿ª·¢·½·¨µÄÌá³öÕßÖ®Ò»£¬Ò²ÊÇ Scrum ÁªÃ˵Ĵ´Ê¼³ÉÔ±¡£ËûĿǰÊÇ
Mountain Goat Software ¹«Ë¾µÄËùÓÐÕߣ¬ÖÂÁ¦ÓÚÌṩ¹ØÓÚ Scrum ºÍ Agile
Èí¼þ¿ª·¢¼¼ÊõµÄÅàѵ¡£
3.¿ÉÊÓ»¯£ºÎªÁ˽µµÍ½»Á÷³É±¾£¬×îºÃµÄ°ì·¨¾ÍÊÇÈÃËùÓеIJâÊÔ½á¹û¿ÉÊÓ»¯¡£ÕâÒâζ׎«¹¹½¨£¨Build£©¡¢²âÊÔ£¨Test£©¡¢²¿Êð£¨Deploy£©ËùÓÐÕâЩÏà¹ØÈÎÎñ¹¹½¨ÔÚÒ»¸öÁ÷Ë®ÏßÖ®ÖУ¬ÈÃËùÓÐÍŶӳÉÔ±¶¼¿ÉÒÔËæÊ±¼à¿ØÏîÄ¿½ø¶È£¬ÕÒµ½×è°ÏîÄ¿µÄÆ¿¾±¡£
ÒÔÏÂÃæÕâ¸öµäÐÍÍŶÓΪÀý£¬Õû¸ö´Ó¿ª·¢¡¢²âÊÔ¡¢¹¹½¨µ½²¿ÊðµÄһϵÁйý³Ì£¬¶¼¿ÉÒÔ½èÖú Jenkins »òÕß
TeamCity ÕâÑùµÄÈÎÎñµ÷¶È¹¤¾ß£¬ÍêÈ«¿ÉÊÓ»¯£¬ÔÙ½èÖú SonarQube ÕâÑùµÄ´úÂëÖÊÁ¿¼à¿Ø¹¤¾ß¼à¿Ø²âÊÔ½á¹û¡£Google
Analytics »òÕß Microsoft µÄ Azure ApplicationInsight
µÈÔÆ¶Ë¼à¿Ø¹¤¾ß£¬Ôò¿ÉÒÔÌṩʵʱÉú²ú»·¾³µÄ¿Í»§Ê¹ÓÃÐÅÏ¢»òÕß²âÊÔÊý¾Ý£¬ÈÃÕû¸öÍŶӿÉÒÔËæÊ±°ÑÎÕ²úÆ·µÄÕû¸öÁ÷Ë®ÏßµÄÔËÐÐ״̬¡£

ÔÚ΢·þÎñ¼Ü¹¹ÖÐËù²ÉÓõÄÖ÷Òª²âÊÔ·½·¨¡£ÈçÏÂͼËùʾ£¬ËüÃÇÖ÷Òª°üÀ¨£º
µ¥Ôª²âÊÔ£¨Unit Test£©
ÓÃÓÚÑé֤΢·þÎñÄÚ²¿µÄÀà·½·¨»òº¯ÊýµÄÐÐΪ¡£ËüÃÇ»á¸ù¾Ý²âÊÔ¿ò¼Ü£¬Ö´ÐдúÂëÎļþÀïµÄÀà·½·¨»òº¯Êý£¬Ìṩ²»Í¬µÄÊäÈ룬²¢ÑéÖ¤Óëÿһ¸öÊäÈëÏà¶ÔÓ¦µÄÊä³ö¡£
¼¯³É²âÊÔ£¨Integration Test£©
ÓÃÓÚÑé֤΢·þÎñÓëÍⲿģ¿éµÄͨÐÅ»òÕß½»»¥ÐÐΪ¡£²âÊÔ¿ò¼Ü»áÆô¶¯·þÎñµÄÒ»¸öʵÀý£¬²¢µ÷Ó÷þÎñµÄÍⲿ½Ó¿ÚÀ´Ö´ÐÐÒµÎñÂß¼¡£
×é¼þ²âÊÔ £¨Component Test£©
¼´Ñé֤΢·þÎñÄÜ·ñÆðµ½Ô¤ÆÚµÄ×÷Óá£ÕâÐèÒª°Ñ΢·þÎñÖܱßÒÀÀµµÄËùÓÐÆäËû·þÎñ»òÕß×ÊÔ´È«²¿Ä£Ä⻯£¬´Ó¸Ã·þÎñÍⲿ¡°Óû§¡±µÄ½Ç¶ÈÀ´¼ì²é·þÎñÄÜ·ñÌṩԤÆÚµÄÊä³ö¡£
¶Ëµ½¶Ë²âÊÔ£¨End-to-end Test£©
ÑéÖ¤Õû¸öϵͳµÄ¹¦ÄÜÄÜ·ñ·ûºÏÓû§µÄÔ¤ÆÚ£¬Ò»°ãÊÇ´Ó UI ²ãÃæ½øÐвâÊÔ£¬È·±£Óû§ÌåÑéÍêÈ«´ïµ½¿Í»§ÒªÇó¡£
̽Ë÷²âÊÔ£¨ Exploratory Test£¬¼´ÊÖ¶¯²âÊÔ£©
ÕâÒ»²½Í¨³£ÓÉÒµÎñר¼ÒÐÍÓû§Ö´ÐУ¬¾ßÌå²é¿´Ä³¸öÐÂÌí¼ÓµÄÌØÐÔÊÇ·ñ¿ª·¢¡¢²¿Êð³É¹¦¡£

×ܽá
¼òµ¥×ܽáÒ»ÏÂËùѧϰµÄÄÚÈÝ£º
΢·þÎñ¼Ü¹¹¶ÔÈí¼þ²âÊÔÌá³öÁ˺ܶàȫеÄÌôÕ½¡£
Ó¦¶ÔÕâЩÌôÕ½µÄ·½·¨°üÀ¨£º
×Ô¶¯»¯
²ã´Î»¯
¿ÉÊÓ»¯
ÔõôÕë¶Ô΢·þÎñ¼Ü¹¹×öµ¥Ôª²âÊÔ£¿
µ¥Ôª²âÊÔÊÇ¿ª·¢ÈËÔ±±àдµÄһС¶Î´úÂ룬ÓÃÓÚ¼ìÑé±»²â´úÂëµÄÒ»¸öºÜСµÄ¡¢ºÜÃ÷È·µÄ¹¦ÄÜÊÇ·ñÕýÈ·¡£Í¨³£¶øÑÔ£¬Ò»¸öµ¥Ôª²âÊÔÊÇÓÃÓÚÅжÏij¸öÌØ¶¨Ìõ¼þ£¨»òÕß³¡¾°£©ÏÂij¸öÌØ¶¨º¯ÊýµÄÐÐΪ¡£ÀýÈ磬Äã¿ÉÄܰÑÒ»¸öºÜ´óµÄÖµ·ÅÈëÒ»¸öÓÐÐò
list ÖÐÈ¥£¬È»ºóÈ·ÈϸÃÖµ³öÏÖÔÚ list µÄβ²¿¡£»òÕߣ¬Äã¿ÉÄÜ»á´Ó×Ö·û´®ÖÐɾ³ýÆ¥ÅäijÖÖģʽµÄ×Ö·û£¬È»ºóÈ·ÈÏ×Ö·û´®È·Êµ²»ÔÙ°üº¬ÕâЩ×Ö·ûÁË¡£
¶ÔÓÚµ¥Ôª²âÊÔÖе¥ÔªµÄº¬Ò壬һ°ãÀ´Ëµ£¬Òª¸ù¾Ýʵ¼ÊÇé¿öÈ¥Åж¨Æä¾ßÌ庬Ò壬Èç C ÓïÑÔÖе¥ÔªÖ¸Ò»¸öº¯Êý£¬Java
Àïµ¥ÔªÖ¸Ò»¸öÀ࣬ǰ¶ËÓ¦ÓÃÖпÉÒÔÖ¸Ò»¸ö´°¿Ú»òÒ»¸ö²Ëµ¥µÈ¡£×ܵÄÀ´Ëµ£¬µ¥Ôª¾ÍÊÇÈËΪ¹æ¶¨µÄ×îСµÄ±»²â¹¦ÄÜÄ£¿é¡£
ÎÒÃǽ«Ì½ÌÖÔÚ΢·þÎñ¼Ü¹¹Ï£¬µ¥Ôª²âÊÔµÄÉè¼Æ¡¢ÊµÏÖºÍÖÊÁ¿¿ØÖÆ¡£
Éè¼Æ£º¶¨Òå²âÊԱ߽ç
ÒªÉè¼Æ¸ßЧÂÊ£¨¼ÈÔËÐпìËÙÓÖ¸²¸ÇÂʸߣ©µÄµ¥Ôª²âÊÔ£¬Ê×ҪҪ׼ȷµØ¶¨Òå²âÊԱ߽硣²âÊÔµÄÄ¿µÄ¾ÍÊÇΪÁËÑéÖ¤±ß½çÀï¡°ºÚºÐ¡±µÄÐÐΪÊÇ·ñ·ûºÏÔ¤ÆÚ£¬ÎÒÃÇÏòºÚºÐÊäÈëÊý¾Ý£¬È»ºóÑéÖ¤Êä³öµÄÕýÈ·ÐÔ¡£ÔÚµ¥Ôª²âÊÔÀºÚºÐÖ¸µÄÊǺ¯Êý»òÕßÀàµÄ·½·¨£¬Ä¿µÄÊǵ¥¶À²âÊÔÌØ¶¨´úÂë¿éµÄÐÐΪ¡£
µ«ÊÇÔÚ΢·þÎñ¼Ü¹¹ÖУ¬ºÜ¶àʱºòºÚºÐµÄÊä³öÐèÒªÒÀÀµÓÚÆäËûµÄ¹¦ÄÜ»òÕß·þÎñ£¬¼´´æÔÚÍⲿÒÀÀµ¡£ÎªÁ˸üºÃµØÀí½âÕâ¸ö¸ÅÄÎÒÃÇÒÔÒ»¸ö¼òµ¥µÄ×¢²á¹¦ÄÜΪÀý£º

´ÓͼÖпÉÒÔ¿´³ö£¬Õâ¸öº¯Êý°üº¬ÁËһЩÊäÈëºÍÊä³ö¡£ÊäÈë²ÎÊý°üÀ¨»ù±¾µÄÓû§×¢²áÐÅÏ¢£¨ÐÕÃû¡¢Óû§ÃûºÍÃÜÂ룩£¬¶ø·µ»ØÐ´´½¨µÄÓû§
ID¡£
µ«ÊÇÔڴ˹ý³ÌÖУ¬»¹ÓÐһЩ²»ÊǺÜÃ÷ÏÔµÄÊäÈëÊý¾Ý¡£Õâ¸öº¯Êýµ÷ÓÃÁËÁ½¸öÍⲿº¯Êý£ºdb.user.inser()
ÊÇÏòÊý¾Ý¿â²åÈëÊý¾Ý£»Password.hashAndsave() ÊÇÒ»¸ö΢·þÎñ£¬ÓÃÓÚÉú³ÉÃÜÂëµÄ¹þÏ£Öµ£¬ÔÙ¼ÓÒÔ±£´æ¡£ÔÚijЩÇé¿öÏ£¬Êý¾Ý¿â¿ÉÄܻ᷵»Ø´íÎ󣬱ÈÈçÓû§ÃûÒѾ´æÔÚ£¬µ¼ÖÂÊý¾Ý¿â²åÈëʧ°Ü¡£ÁíÍ⣬ÒòΪÐèÒªµ÷ÓÃÍⲿµÄ΢·þÎñÉú³ÉÃÜÂë¹þÏ£Öµ£¬Èç¹ûÍøÂçÁ¬½Ó³öÏÖÎÊÌ⣬»òÕß¹þÏ£ÖµÉú³É·þÎñÓÉÓÚ·¢Éú¹ýÔØ¶øµ¼Ö·þÎñ³¬Ê±£¬ÄÇôÃÜÂë±£´æ¾Í»á·µ»Ø´íÎó¡£User.create()
º¯Êý±ØÐëÄܹ»Í×ÉÆµØ´¦ÀíÕâÁ½ÖÖ´íÎó£¬ÕâÊDzâÊÔµÄÖØµã¡£
Ò²¾ÍÊÇ˵£¬ÎªÁËÈ«ÃæµØ²âÊÔÓû§×¢²á¹¦ÄÜ£¬µ¥Ôª²âÊÔËùÒª×öµÄ²»½ö½öÊǼòµ¥µØÊäÈë¸÷ÖÖ²»Í¬µÄ²ÎÊý£¬Ëü»¹ÒªÄܹ»ÈÃÍⲿº¯Êý/΢·þÎñ£¬Äܹ»²úÉú³öÖ¸¶¨µÄ´íÎó£¬ÔÙÑéÖ¤º¯ÊýµÄ´íÎó´¦ÀíÂß¼ÊÇ·ñ·ûºÏÔ¤ÆÚ¡£
Òò´Ë£¬ÎªÁËÔÚ²»ÒÀÀµÓÚÍⲿÌõ¼þµÄÇé¿öÏÂÖÆÔì³ö¸÷ÖÖÊäÈëÊý¾Ý£¬¾ÍÐèҪʹÓà Stub »òÕß Mock£¬ÖÐÎÄ¿ÉÒÔÀí½âΪ¶Ôº¯ÊýÍⲿÒÀÀµµÄÄ£ÄâÆ÷¡£¼ò¶øÑÔÖ®£¬ËüÒâζ×ÅÓÃÒ»¸ö¼ÙµÄ°æ±¾Ìæ»»ÁËÕæÊµµÄ¶ÔÏó£¨ÀýÈçÒ»¸öÀࡢģ¿é¡¢º¯Êý»òÕß΢·þÎñ£©¡£¼ÙµÄ°æ±¾µÄÐÐÎªÌØÕ÷ºÍÕæÊµ¶ÔÏó·Ç³£ÀàËÆ£¬²ÉÓÃÏàͬµÄµ÷Ó÷½·¨£¬²¢°´ÕÕÄãÔÚ²âÊÔ¿ªÊ¼Ö®Ç°Ô¤¶¨ÒåµÄ·µ»Ø·½Ê½£¬Ìṩ·µ»ØÊý¾Ý¡£²âÊÔ¿ò¼ÜÔÚÔËÐб»²âÊԵĺ¯Êýʱ£¬¿ÉÒ԰ѶÔÍⲿÒÀÀµº¯Êý/·þÎñµÄµ÷Óã¬Öض¨Ïòµ½
Stub ÉÏ£¬ÕâÑùµ¥Ôª²âÊԾͿÉÒÔÔÚûÓÐÍⲿ·þÎñµÄÇé¿öϽøÐУ¬¼´±£Ö¤ÁËËÙ¶È£¬ÓÖ±ÜÃâÁËÍøÂçÌõ¼þµÄÓ°Ïì¡£
ÕâÀïÔÙÇ¿µ÷Ï Stub ºÍ Mock µÄÇø±ð£¬ºÜ¶àÈ˾³£¸ã»ì¡£Stub ¾ÍÊÇÒ»¸ö´¿´âµÄÄ£ÄâÆ÷£¬ÓÃÓÚÌæ´úÕæÊµµÄ·þÎñ/º¯Êý£¬ÊÕµ½ÇëÇó·µ»ØÖ¸¶¨½á¹û£¬²»»á¼Ç¼ÈκÎÐÅÏ¢¡£Mock
Ôò¸ü½øÒ»²½£¬»¹»á¼Ç¼µ÷ÓÃÐÐΪ£¬¿ÉÒÔ¸ù¾ÝÐÐΪÀ´Ñé֤ϵͳµÄÕýÈ·ÐÔ¡£
´´½¨ Stub µÄ¹¤¾ßÓкܶ࣬°üÀ¨ Node.js/JavaScript ¿ò¼ÜÏ嵀 sinon.js£¬
testdouble.js µÈ£»Python Ï嵀 mock µÈ¡£
ÔÚ¸Õ¸ÕÌáµ½µÄ×¢²áº¯ÊýºÍÃÜÂë¹þÏ£ÖµÉú³É¡¢±£´æ·þÎñÖ®¼ä£¬²åÈëÒ»¸ö Stub£¨Ä£ÄâÆ÷£©µÄʾÒâͼÈçÏ£º

ÎÒÃÇ¿ÉÒÔʹÓÃÄ£ÄâÆ÷À´´ïµ½¸÷ÖÖÄ¿µÄ£º
Ä£ÄâÆ÷¿É·µ»ØÈÎÒâµÄÉ趨ֵ£¬ÓÃÓÚÄ£ÄâÍⲿº¯ÊýµÄÊä³ö¡£ÕâÔÚ²âÊÔº±¼ûµÄ±ß½çÇé¿öʱ»á·Ç³£ÓÐÓ㬱ÈÈçÓÐЩ´íÎ󳡾°¿ÉÄܺÜÉÙ·¢Éú»òÕ߷dz£ÄÑÒÔÖØÏÖ¡£
Ä£ÄâÆ÷Ò²¿ÉÒÔ²¶×½±»²âÊÔº¯Êý´«¸øÍⲿº¯ÊýµÄ²ÎÊý£¬»òÕß°ÑÕâЩ²ÎÊý¼Ç¼ÏÂÀ´¡£ÕâÑù¾Í¿ÉÒÔÑéÖ¤±»²âÊÔº¯ÊýÐèÒªµ÷ÓÃÄÄЩÍⲿº¯Êý£¬ÒÔ¼°ÐèÒª´«¸øÍⲿº¯ÊýÄÄЩ²ÎÊý¡£
ͨ¹ý¶ÔÍⲿÒÀÀµº¯ÊýʹÓÃÄ£ÄâÆ÷£¬Í¨³£¿ÉÒÔÔÚ¼¸ÃëÖÓÄÚ£¬Ö´ÐÐÊýǧ¸öµ¥Ôª²âÊÔ¡£ÕâÑù£¬¿ª·¢ÈËÔ±¾Í¿ÉÒ԰ѵ¥Ôª²âÊÔ¼ÓÈëµ½ÈÕ³£µÄ¿ª·¢¹¤×÷¹ÜÏߣ¨Pipeline£©µ±ÖУ¬°üÀ¨Ö±½Ó¼¯³Éµ½³£ÓõÄ
IDE À»òÕßͨ¹ýÖÕ¶ËÃüÁîÐд¥·¢¡£Í¨¹ýÔÚ±àд´úÂëµÄͬʱ£¬Æµ·±ÔËÐе¥Ôª²âÊÔ£¬ÓÐÖúÓÚ¾¡Ôç·¢ÏÖ´úÂëÖеÄÎÊÌâ¡£¶ÔÓÚ³ÌÐòÔ±À´Ëµ£¬Èç¹ûÑø³ÉÁ˶Ô×Ô¼ºÐ´µÄ´úÂë½øÐе¥Ôª²âÊÔµÄϰ¹ß£¬²»µ«¿ÉÒÔд³ö¸ßÖÊÁ¿µÄ´úÂ룬¶øÇÒ»¹ÄÜÌá¸ß±à³Ìˮƽ¡£
˳±ã˵һ¾ä£¬ÔÚ΢·þÎñ¼Ü¹¹ÖУ¬µ¥Ôª²âÊÔµÄ×÷Óò»½öÏÞÓÚ´úÂ뿪·¢£¬ËüÃÇ»¹¶Ô DevOps/CI£¨³ÖÐø¼¯³É£©ÓкܴóµÄ°ïÖú£¬¿ÉÒÔ¼¯³Éµ½´úÂëºÏ²¢£¨Merge£©Á÷³ÌÀï¡£
Æ©È磬GitHub Ö§³Ö¶ÔһЩÖ÷Á÷ CI ·þÎñµÄ״̬¼ì²é¡£Ò»°ãËü»áÏÞÖÆ¶Ô¡°Master¡±Ö÷·ÖÖ§µÄÌύȨÏÞ£¬²»ÔÊÐí¿ª·¢ÈËÔ±Ö±½ÓÏò¸Ã·ÖÖ§Ìá½»´úÂ룬¶øÊÇÒªÇóËûÃǰѴúÂëÏÈÌá½»µ½ÆäËû·ÖÖ§ÉÏ£¨Ìá½»
Pull Request£©£¬ÔÙÓÉÆäËû¿ª·¢ÈËÔ±½øÐдúÂëÉó²é£¨Code Review£©¡£×îºó£¬ÔÚ½«´úÂëºÏ²¢µ½Ö÷·ÖÖ§µÄʱºò£¬GitHub
ÒªÇóÏÈͨ¹ý״̬¼ì²é¡£Õâʱ£¬Jenkins¡¢CircleCI ºÍ TravisCI µÈ CI ·þÎñ¶¼ÌṩÁË״̬¼ì²é¹³×Ó£¨hook£©£¬ËüÃÇ»á´Ó·ÖÖ§ÉÏ»ñÈ¡´úÂë²¢ÔËÐе¥Ôª²âÊÔ¡£Èç¹ûͨ¹ýÁË£¬¾ÍÔÊÐíºÏ²¢´úÂ룬·ñÔò¾Í²»ÔÊÐí¡£Õû¸ö¹ý³ÌÈçÏÂͼËùʾ£º

ʵÏÖ£ºµ¥Ôª²âÊÔµÄÁ÷³Ì
µ¥Ôª²âÊԵŤ¾ßÓкܶ࣬ÀýÈ磺
C++£ºGoogletest¡¢GMock
Java£ºJunit¡¢TestNG¡¢Mockito¡¢PowerMock
JavaScript£ºQunit¡¢Jasmine
Python£ºunittest
Lua£ºluaunit
Ò»¸öµ¥Ôª²âÊÔµÄʵÏÖÖ÷Òª·ÖΪÒÔϼ¸²½£º
ÉèÖòâÊÔÊý¾Ý£»
ÔÚ²âÊÔÖе÷ÓÃÄãµÄ·½·¨£»
ÅжϷµ»ØµÄ½á¹ûÊÇ·ñ·ûºÏÔ¤ÆÚ¡£
ÕâÈý²½¿ÉÒÔ¼ò»¯Îª¡°Èý A ÔÔò¡±: Arrange£¨ÉèÖã©¡¢Act £¨µ÷Óã©¡¢Assert£¨¼ì²é£©¡£
»òÕßÒ²¿ÉÒÔ½èÓà BDD£¨ÐÐΪÇý¶¯²âÊÔ£©µÄ¸ÅÄ°Ñµ¥Ôª²âÊÔµÄÁ÷³Ì·ÖΪÈý²½£ºGiven£¨ÉÏÏÂÎÄ£©¡¢When
£¨Ê¼þ£©¡¢Then£¨½á¹û£©¡£
ÏÂÃæÎÒÃÇÀ´¿´Ò»¸öÕæÊµµÄÀý×Ó£¬ÕâÊÇÒ»¸öÃûΪ ExampleController µÄÀ࣬ÓÃÓÚÔÚÈËÃû¿â£¨PersonRepository£©ÖвéÕÒÈËÃû¡£
@RestControllerpublic
class ExampleController { private final PersonRepository
personRepo; @Autowired public ExampleController(final
PersonRepository personRepo) { this.personRepo
= personRepo; } @GetMapping("/hello/{lastName}")
public String hello(@PathVariable final String
lastName) { Optional<Person> foundPerson
= personRepo.findByLastName(lastName); return
foundPerson .map(person -> String.format("Hello
%s %s!", person.getFirstName(), person.getLastName()))
.orElse(String.format("Who is this '%s' youre
talking about?", lastName)); }} |
ÏÂÃæ£¬ÎÒÃǽ«Óà Junit£¬¶ÔÀàÖÐµÄ hello£¨lastname£©·½·¨½øÐе¥Ôª²âÊÔ¡£
JUnit ÊÇ Java ÉçÇøÖÐÖªÃû¶È×î¸ßµÄµ¥Ôª²âÊÔ¹¤¾ß£¬ÓÃÓÚ±àдºÍÔËÐпÉÖØ¸´µÄ²âÊÔÓÃÀý¡£JUnit
Éè¼ÆµÃ·Ç³£Ð¡ÇÉ£¬µ«Êǹ¦ÄÜÈ´·Ç³£Ç¿´ó¡£Ëüµ®ÉúÓÚ 1997 Ä꣬ÓÉ Erich Gamma ºÍ Kent
Beck ¹²Í¬¿ª·¢Íê³É¡£ÆäÖÐ Erich Gamma ÊǾµäÖø×÷¡¶Éè¼ÆÄ£Ê½£º¿É¸´ÓÃÃæÏò¶ÔÏóÈí¼þµÄ»ù´¡¡·Ò»ÊéµÄ×÷ÕßÖ®Ò»£¬²¢ÔÚ
Eclipse ÖÐÓкܴóµÄ¹±Ï×£»Kent Beck ÔòÊÇһλ¼«ÏÞ±à³Ì£¨XP£©·½ÃæµÄר¼ÒºÍÏÈÇý¡£
public class
ExampleControllerTest { private ExampleController
subject; @Mock // Ä£ÄâÆ÷ private PersonRepository
personRepo; @Before // ÔÚÿ¸ö²âÊÔ·½·¨Ö®Ç°Ö´ÐÐ public void
setUp() throws Exception { initMocks(this); subject
= new ExampleController(personRepo); } @Test //
²âÊÔÓÃÀý1 public void shouldReturnFullNameOfAPerson()
throws Exception { Person peter = new Person("¶«",
"Íõ"); given(personRepo.findByLastName("Íõ"))
.willReturn(Optional.of(¶«)); String greeting =
subject.hello("Íõ"); assertThat(greeting,
is("ÄãºÃÍõ¶«!")); } @Test // ²âÊÔÓÃÀý2 public
void shouldTellIfPersonIsUnknown() throws Exception
{ given(personRepo.findByLastName(anyString()))
.willReturn(Optional.empty()); String greeting
= subject.hello("Íõ"); assertThat(greeting,
is("ÕâλÍõÏÈÉúÊÇË£¿")); }} |
Arrange£¨ÉèÖã©¡¢Act £¨µ÷Óã©¡¢Assert£¨¼ì²é£©¡£
¿ÉÒÔ¿´µ½£¬Ê×ÏÈÎÒÃÇÓÃÒ»¸ö Stub£¨Ä£ÄâÆ÷£©£¬Ìæ»»ÕæÕýµÄ PersonRepository À࣬ÕâÑùÎÒÃÇ¿ÉÒÔÔ¤Ïȶ¨ÒåÎÒÃÇÏ£Íû·µ»ØµÄÖµ¡£
¼ÇÏÂÀ´£¬ÎÒÃǰ´ÕÕ 3A ÔÔò£¬±àдÁËÁ½¸öµ¥Ôª²âÊÔ¡£µÚÒ»¸öÊÇÕý³£ÔËÐеÄÓÃÀý£º
Arrange£¨ÉèÖã©£º½¨Á¢Ò»¸öÃûΪÍõ¶«µÄÈËÎ²¢ÇÒÈÃÄ£ÄâÆ÷×¼±¸ºÃ£¬ÔÚÊäÈë²ÎÊýΪÍõʱ£¬·µ»Ø¡°Íõ¶«¡±¡£
Act£¨µ÷Óã©£ºµ÷Óú¯Êý hello("Íõ")¡£
Assert£¨¼ì²é£©£º¼ì²é·µ»Ø½á¹ûÊÇ·ñΪ"ÄãºÃÍõ¶«!"¡£
µÚ¶þÊÇÒì³£ÔËÐеIJâÊÔÓÃÀý£º
Arrange£¨ÉèÖã©£ºÈÃÄ£ÄâÆ÷×¼±¸ºÃ£¬ÔÚÊäÈëÈκβÎÊýʱ£¬¾ù·µ»Ø¿ÕÖµ¡£
Act£¨µ÷Óã©£ºµ÷Óú¯Êý hello("Íõ")¡£
Assert£¨¼ì²é£©£ºÒòΪģÄâÆ÷·µ»ØµÄÊÇ¿ÕÖµ£¬ÕâÊǼì²é·µ»Ø½á¹ûÊÇ·ñΪ"ÕâλÍõÏÈÉúÊÇË£¿"
ͨ¹ýÕâÑùµÄÕýÃæºÍ·´ÃæµÄ²âÊÔÓÃÀý£¬ÎÒÃÇ¿ÉÒÔ³¹µ×µØ¼ì²é hello(lastname) ·½·¨ÊÇ·ñ¹¤×÷Õý³£¡£
ÖÊÁ¿¿ØÖÆ£º¼à¿Ø²âÊÔ¸²¸ÇÂÊ
×ÅÖØÐèÒªÌá¼°µÄÒ»µãÊÇ£¬²âÊÔÈËÔ±Ó¦µ±Éè·¨½«µ¥Ôª²âÊԵĸ²¸ÇÂÊ×÷Ϊһ¸öÖØÒªµÄ¼à¿ØÖ¸±ê£¬¼Ç¼²¢¿ÉÊÓ»¯¡£ÀýÈ磬Teamcity
»òÕß Jenkins ÕâÑùµÄÁ÷³Ì»¯¹¤¾ß£¬Ö§³ÖÓà dotCover À´Í³¼ÆÁ÷³ÌÖе¥Ôª²âÊԵĸ²¸ÇÂÊ£¬²¢½«½á¹ûÒÔ
TXT ±¨¸æ»òÕß HTML µÄ·½Ê½ÏÔʾÔÚÈÎÎñÒ³ÃæÉÏ¡£½øÒ»²½Ò²¿ÉÒÔ½«¸²¸ÇÂÊ¡¢²âÊÔ½á¹ûµÄÊý¾Ý£¬×Ô¶¯Êä³öµ½
SonarQube ÕâÑùµÄ´úÂëÖÊÁ¿¼à¿Ø¹¤¾ßÖ®ÖУ¬ÒÔ±ãËæÊ±¼ì²é³ö²âÊÔûÓÐͨ¹ý»òÕß²âÊÔ¸²¸ÇÂʲ»·ûºÏÔ¤ÆÚµÄÇé¿ö¡£

¸ß¸²¸ÇÂʵĵ¥Ôª²âÊÔÊDZ£ÕÏ´úÂëÖÊÁ¿µÄµÚÒ»µÀÒ²ÊÇ×îÖØÒªµÄ¹Ø¿Ú¡£´Ó·Ö¹¤ÉÏÀ´Ëµ£¬²âÊÔÈËÔ±¿ÉÄܲ»»á²ÎÓëµ¥Ôª²âÊԵĿª·¢Óëά»¤£¬µ«ÊDzâÊÔÈËÔ±Ó¦µ±ÐÖú¿ª·¢ÈËԱȷ±£µ¥Ôª²âÊԵIJ¿ÊðºÍ¸²¸ÇÂÊ£¬ÕâÊÇÈ·±£ºóÐøÒ»ÏµÁвâÊÔÊֶη¢»Ó×÷ÓõÄǰÌá¡£
×ܽá
¼òµ¥×ܽáÒ»ÏÂËùѧϰµÄÄÚÈÝ£º
ÓÃÄ£ÄâÆ÷À´¶¨Òåµ¥Ôª²âÊԵı߽磬ģÄâ¶ÔÍâ½çº¯Êý/·þÎñµÄµ÷Óã»
ÒÀÕÕÈý A ÔÔò£¬ÊµÏÖµ¥Ôª²âÊÔ£»
ʹÓÃÁ÷³Ì»¯¹¤¾ß£¬ÊµÊ±¼à¿Øµ¥Ôª²âÊԵĸ²¸ÇÂÊ¡£ |