Test First Programming


½ÇÁ¦ ÇÁ·Î±×·¥À» Çϱâ Àü¿¡ Å×½ºÆ®¸¦ ¸ÕÀúÇ϶ó´Â XPÀÇ Áß¿ä ¿øÄ¢ Áß Çϳª.

ÀåÁ¡:

DIPÀÇ [WWW]5Àå¿¡ UnitTesting ¼³¸íÀÌ ÀÖ±ä Çѵ¥, ¾ÆÁÖ ½É°¢ÇÑ ¹®Á¦(½ÇÇàÄÚµå¿Í Å×½ºÆ®Äڵ尡 ÇÔ²² Á¡ÁøÀûÀ¸·Î ¼ºÀåÇØ ³ª°¡Áö ¾Ê°í Å×½ºÆ®Äڵ带 ¸ÕÀú ¿Ï¼ºÇÏ°í ³ª¼­ ÇϳªÇϳª Åë°úÇØ ³ª°¡´Â °ÍÀº XP°¡ BUFD¶ó°í ºÎ¸£¸ç °æ°èÇÏ´Â °Í Áß ÇϳªÀÌ´Ù)°¡ ÀÖ´Â ¼³¸íÀÌ´Ù. XP¿Í TFP¿¡ ´ëÇÑ ÀÌÇØ°¡ ¾ø´Â »ç¶÷Àº ÁÖÀǸ¦ ¿äÇÑ´Ù. PyUnit?ÀÇ »ç¿ë¹ýÀ» ÀÍÈ÷±â¿¡´Â ±¦Âú´Ù.


¸ÕÀú Å×½ºÆ® ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ°í ³ª¼­, ÀÌ Å×½ºÆ® ÇÁ·Î±×·¥À» Åë°úÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µç´Ù. ProgrammingByIntention?ÀÌ °¡´ÉÇÑ °ÍÀÌ´Ù.

¿¹¸¦ µé¾î, 1ºÎÅÍ N±îÁöÀÇ ÇÕÀ» ±¸ÇÏ´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù°í Çϸé, ´ëºÎºÐÀÇ ÇÁ·Î±×·¡¸ÓµéÀº ±¸Ã¼Àû ·ÎÁ÷ºÎÅÍ »ý°¢ÇÏ´Â BottomUp?¹æ½ÄÀ¸·Î Á¢±ÙÇÒ °ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÌ·± °æ¿ì, ¸ÛÇÏ´Ï ¸Õ »ê¸¸ ¹Ù¶óº¸¸ç ¹» ¸ÕÀú ÇؾßÇÒÁö °¨ÀÌ ¿ÀÁö ¾Ê´Â °æ¿ìµµ ¸¹°í, ¾ðÁ¦ ÀÌ ÇÁ·Î±×·¥ÀÌ ¿Ï¼ºµÇ´ÂÁöµµ ¾Ë±â Èûµé°í, ´õ±¸³ª ÇÁ·Î±×·¥ ÀÛ¼º Áß°£¿¡ Äڵ带 °íÄ¡´Â °ÍÀ» ²¨¸®°Ô µÈ´Ù.

ÇÏÁö¸¸, ProgrammingByIntention?°ú TestFirstProgramming¿¡¼­´Â ¸ÕÀú "Àǵµ"(intention)°¡ µå·¯³ªµµ·Ï ÇÑ´Ù. µû¶ó¼­ ÈǸ¢ÇÑ µðÀÚÀεµ ´ýÀ¸·Î ¾ò´Â´Ù.

TFP¿Í PBI¸¦ ÇÏ´Â ÇÁ·Î±×·¡¸Ó´Â ¸ÕÀú ´ÙÀ½ÀÇ Äڵ带 ÀÛ¼ºÇÑ´Ù:

... 
out=1+2+3+4+5+6+7+8+9+10 
self.assertEqual(out,sumFromOne(10)) 
... 

ÀÌ ¶§ ÀÌ¹Ì ÇÁ·Î±×·¡¸Ó´Â, °¡Àå ºÐ¸íÇÏ°í ´Ü¼øÇÑ ÄÚµùÀ» Çϸ鼭 µ¿½Ã¿¡ ÀÚ½ÅÀÌ ÀÛ¼ºÇÒ ÇÁ·Î±×·¥ÀÇ ÀÎÅÍÆäÀ̽º¸¦ µðÀÚÀÎÇÑ °ÍÀÌ´Ù. ¸ñÇ¥°¡ ¸¸µé¾î Á³À¸¸é ÀÌ ¸ñÇ¥¸¦ ¿Ï¼öÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µé¸é µÈ´Ù.

»ç½Ç ÀÌ Å×½ºÆ® Äڵ带 ¸ÕÀú ÀÛ¼ºÇÏ°í ¹Ù·Î Å×½ºÆ® Äڵ带 ½ÇÇàÇÑ´Ù. ±×·¯¸é ´ç¿¬È÷ sumFromOneÀ̶ó´Â À̸§ÀÌ Á¤ÀǵǾî ÀÖÁö ¾Ê´Ù´Â ¿¡·¯°¡ ³ª¿Â´Ù. ÀÌ ¶§ ¹Ù·Î, ÄÄÇ»ÅÍ°¡ ¿ä±¸ÇÏ´Â °ÍÀ» µé¾îÁÖ¸é µÈ´Ù. Áï, sumFromOneÀ̶ó´Â À̸§À» Á¤ÀÇÇÑ´Ù.

def sumFromOne(upTo): 
    pass 

¿©±â±îÁö¸¸ ÀÛ¼ºÇÏ°í ´Ù½Ã Å×½ºÆ® Äڵ带 µ¹¸°´Ù. ±×·¯¸é À̹ø¿¡´Â ¾Æ±îÀÇ À̸§ÀÌ Á¤ÀǵǾî ÀÖÁö ¾Ê´Ù´Â ¿¡·¯´Â »ç¶óÁö°í À̹ø¿¡´Â 1ºÎÅÍ 10±îÁöÀÇ ÇÕÀÌ None°ª(sumFromOneÀÇ ¸®ÅÏ°ª)°ú ´Ù¸£´Ù´Â "½ÇÆÐ"(failure) ¸Þ¼¼Áö°¡ ³ª¿Â´Ù.

±×·³, ÀÌÁ¦´Â ´Ù½Ã ÄÄÇ»ÅÍ°¡ ¿ä±¸ÇÏ´Â, µÎ °ªÀ» µ¿ÀÏÇÏ°Ô ÇØÁÖ´Â Äڵ带 ÀÛ¼ºÇÏ¸é µÈ´Ù. (¾ðÁ¦³ª ½ÇÆÐÇÏ´Â ºÎºÐÀÌ ÇÑ ±ºµ¥ ÀÓ¿¡ ÁÖÀÇÇÑ´Ù. »õ·Î¿î ±â´ÉÀ» Ãß°¡ÇÒ ¶§µµ, Å×½ºÆ® Äڵ忡 ÇØ´ç ±â´É °ü·Ã Å×½ºÆÃÀ» ¸ÕÀú Ãß°¡ÇÏ°í, ´ÙÀ½ ±× Äڵ带 ÆнºÇÏ´Â ½ÇÇà Äڵ带 ÀÛ¼ºÇϴµ¥, ¾ðÁ¦³ª ÇÑ °ÉÀ½ ¾¿ ³ª°¡¾ß ÇÑ´Ù. µ¿½Ã¿¡ µÎ°³ ÀÌ»óÀÇ ±â´ÉÀ» Ãß°¡ÇÏ°í Å×½ºÆÃÀÌ ½ÇÆÐÇÏ¸é ¾î´À °ÍÀÌ ¹®Á¦¿´´ÂÁö ã¾Æ³»´Â µ¥¿¡ ½Ã°£ÀÌ ÇãºñµÈ´Ù)

def sumFromOne(upTo): 
    sum=0 
    for i in range(1,upTo+1): 
        sum+=i 
    return sum 

ÀÌÁ¦ Å×½ºÆ® Äڵ带 µ¹¸®¸é ÆнºÇÏ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

ÀÌ·Î½á ¿ì¸®´Â "Áö¼ÓÀûÀ¸·Î ÄÄÇ»ÅÍ°¡ ¿ä±¸ÇÏ´Â ÇÑ°¡Áö"¸¸ ÇØ°áÇØ Áָ鼭 Àüü¹®Á¦¸¦ Á¡ÁøÀûÀ¸·Î ÇØ°áÇß´Ù. ¶Ç óÀ½ Ãâ¹ß ¶§ °¡Àå ºÐ¸íÇÏ°Ô "Àǵµ"¸¦ µå·¯³Â±â ¶§¹®¿¡ ÀÎÅÍÆäÀ̽º µðÀÚÀÎ(¿©±â¼­´Â ÇÔ¼ö À̸§, ÀÎÀÚ ³»¿ë µî) µîÀÌ ±ò²ûÇÏ°í, ·ÎÁ÷µµ ºÐ¸íÇÏ´Ù.

¶Ç 100% ÆнºÇÏ´Â Å×½ºÆ® Äڵ尡 °®ÃçÁ® Àֱ⠶§¹®¿¡ °ú°¨È÷ ½ÇÇà Äڵ带 º¯°æ/°³¼±ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ÇÑ ºÎºÐÀ» °³¼±Çߴµ¥(small step is important!) ±âÁ¸¿¡ ÆнºÇÏ´ø Å×½ºÆ® ¸î °³°¡ ½ÇÆи¦ ÇÑ´Ù¸é ¹æ±Ý °íÄ£ ºÎºÐÀÌ ¹®Á¦¸¦ ¾ß±âÇÑ °ÍÀ̹ǷΠ±× ºÎºÐÀ» ´Ù½Ã ºÐ¼®ÇÑ´Ù.


½Ç»ýÈ°¿¡ÀÇ Àû¿ë

¹«½¼ ÀÏÀÌ°Ç ÇؾßÇÒ ÀÏÀÌ, Ç®¾î¾ßÇÒ ¹®Á¦ »óȲÀÌ Á¸ÀçÇÑ´Ù¸é ¿ì¼± ±× ¹®Á¦°¡ ÇØ°áµÈ »óȲÀ» »óÁ¤ÇÑ´Ù. ±×¸®°í ±× »óȲ¿¡¼­ ÇØ°áÀÌ µÇ¾ú´ÂÁö ¾ÈµÇ¾ú´ÂÁö¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» »ý°¢ÇÑ´Ù. (À̸¦ TopDown
? ¹æ½ÄÀ̶ó°íµµ ÇÏ°í, ¹Ì·ÎÀÇ ¸ñÀûÁö¿¡¼­ ¹Ý´ë·Î °Å½½·¯ ³»·Á¿À´Â ¹æ¹ýÀ̶ó°íµµ º¼ ¼ö ÀÖ´Ù.) ÀÏÁ¾ÀÇ Å×½ºÆ® ¹æ¹ýÀ» ¸¸µå´Â °ÍÀÌ´Ù.

ÀÌÁ¦´Â Á»ÀüÀÇ Å×½ºÆ®¸¦ 100% Åë°úÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» »ý°¢ÇÑ´Ù. ÀÌ°ÍÀÌ ³Ê¹« º¹ÀâÇÏ´Ù¸é, ´Ù½Ã ÀÛÀº ´ÜÀ§ÀÇ Å×½ºÆ®¸¦ ¸¸µé°í, ÀÌ Å×½ºÆ®¸¦ Åë°úÇÒ ¹æ¹ýÀ» »ý°¢ÇÑ´Ù. ÁÖÀÇÁ¡Àº Çѹø¿¡ ²À ÇϳªÀÇ Å×½ºÆ®¸¸ Åë°úÇÒ °í¹ÎÀ» ÇØ¾ß ÇÑ´Ù.

¿¹¸¦ µé¾î, ºÎ»ê¿¡ °¡¾ßÇÑ´Ù¸é, ÀÚ½ÅÀÌ ºÎ»êÀÌ µµÂøÇß´Ù´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Â °£´ÜÇÑ Å×½ºÆ®¸¦ »ý°¢ÇÑ´Ù. "ºÎ»ê¿ª"¿¡¼­ ±× ±ÛÀÚ¸¦ Àд °Íó·³ ºÐ¸íÇÏ°í ´Ü¼øÇÑ °ÍÀϼö·Ï ÁÁ´Ù. ÀÌÁ¦´Â ºÎ»ê¿ª ±ÛÀÚ¸¦ Àоî¾ß ÇÏ´Â Å×½ºÆ®¸¦ Åë°úÇÒ ¹æ¹ýÀ» »ý°¢ÇÑ´Ù. °£´ÜÇÏ°Ô´Â ¼­¿ï¿ª¿¡¼­ ±âÂ÷¸¦ Ÿ°í ºÎ»ê¿ªÀ¸·Î °¡´Â °ÍÀÌ´Ù. ±×·¯¸é ¶Ç ´Ù½Ã, ¼­¿ï¿ª¿¡¼­ ±âÂ÷¸¦ ÅÀ´Ù´Â °ÍÀ» È®ÀÎÇÒ Å×½ºÆ®¸¦ »ý°¢ÇÏ°í, ¶Ç ÀÌ Å×½ºÆ®¸¦ Åë°úÇÒ ¹æ¹ýÀ» »ý°¢ÇØ ³½´Ù.

º¹ÀâÇÑ ÀÏÀϼö·Ï ÀÌ ¹®Á¦ÇØ°á¹ýÀº È¿·Â¸¦ ¹ßÈÖÇÑ´Ù.


ÇÁ·Î±×·¡¹ÖºÐ·ù