Skip to content

Latest commit

Β 

History

History
148 lines (121 loc) Β· 5.65 KB

File metadata and controls

148 lines (121 loc) Β· 5.65 KB

ν…ŒμŠ€νŠΈ μ½”λ“œ

μ½”λ“œλ₯Ό 짜고 λ‚˜μ„œ 잘 μž‘λ™ν•˜λŠ” μ½”λ“œμΈμ§€ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄μ„œλŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. 버그λ₯Ό 미연에 λ°©μ§€ν•˜κ³  λ²„μ „κ΄€λ¦¬μ‹œμŠ€ν…œμ— PullRequest μ‹œ λ‹€λ₯Έ κ°œλ°œμžλ“€μ΄ μΆ”κ°€ κΈ°λŠ₯에 λŒ€ν•΄μ„œ μ•ˆμ‹¬λ„ ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

Python ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±

μ•„λž˜ 두 값을 λ”ν•˜λŠ” ν•¨μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ 숫자만 더해야 ν•œλ‹€κ³  ν•  λ•Œ, μ–΄λ–»κ²Œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

# runcode.py
def addNum(a,b):
    return a + b

ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μ•„λž˜μ²˜λŸΌ μž‘μ„±ν•©λ‹ˆλ‹€.

# testcode.py
import unittest
from runcode import *
class Test_code(unittest.TestCase):
    def test_addNum(self):
        self.assertEqual(addNum(1,2), 3) # μ˜ˆμΈ‘κ°’μ„ μ μŠ΅λ‹ˆλ‹€.
        self.assertEqual(addNum(0.1,2), 2.1)

if __name__ == "__main__":
    unittest.main()

Test μ½”λ“œλŠ” ν„°λ―Έλ„μ—μ„œ μ•„λž˜μ²˜λŸΌ μ‹€ν–‰ν•©λ‹ˆλ‹€.

$ python testcode.py

μ΄λ²ˆμ—λŠ” ν…ŒμŠ€νŠΈ μ½”λ“œμ— μˆ«μžλŒ€μ‹  문자λ₯Ό ν•˜λ‚˜ 넣어보죠.

# testcode.py
import unittest
from runcode import *
class Test_code(unittest.TestCase):
    def test_addNum(self):
        self.assertEqual(addNum(1,2), 3)
        self.assertEqual(addNum(0.1,2), 2.1)
        self.assertEqual(addNum("ν…Œ",2), 2)

if __name__ == "__main__":
    unittest.main()
======================================================================
ERROR: test_addNum (__main__.Test_code)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "testcode.py", line 9, in test_addNum
    self.assertEqual(addNum("ν…Œ",2), 2)
  File "/Users/woong/test/runcode.py", line 7, in addNum
    return a+b
TypeError: cannot concatenate 'str' and 'int' objects

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)

μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

a값에 μˆ«μžκ°€ μ˜¬μ§€, λ¬Έμžκ°€ μ˜¬μ§€, λ¦¬μŠ€νŠΈκ°€ μ˜¬μ§€ μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ΄μ£ . a λ˜λŠ” b 값쀑 ν•˜λ‚˜μ— λ¬Έμžκ°€ λ“€μ–΄κ°€λ©΄ μ•„λž˜μ™€ 같은 νƒ€μž…μ—λŸ¬κ°€ λ°œμƒν•  것 μž…λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ μœ„μ™€ 같은 λ©”μ‹œμ§€κ°€ 좜λ ₯λ©λ‹ˆλ‹€. 문자λ₯Ό λ„£λŠ”κ²ƒμ„ μ˜ˆμƒν•˜μ§€ λͺ»ν•˜κ³  ν•¨μˆ˜λ₯Ό μž‘μ„±ν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ¬Έμ œλŠ” 혼자 μž‘μ„±ν•˜λŠ” μ½”λ“œμ—μ„œλŠ” 자주 μΌμ–΄λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—¬λŸ¬λΆ„μ΄ μˆ˜λ§Žμ€ 개발자λ₯Ό μœ„ν•΄μ„œ λ§Œλ“  API λ˜λŠ” 라이브러리λ₯Ό μž‘μ„±ν•˜λŠ” 상황이라면 μ΄μ•ΌκΈ°λŠ” λ‹¬λΌμ§‘λ‹ˆλ‹€. λ‹€λ₯Έ κ°œλ°œμžκ°€ ν•¨μˆ˜μ— μ‹€μ œλ‘œ μ–΄λ– ν•œ 값이을 넣을지 λͺ¨λ₯Έλ‹€κ³  κ°€μ •ν•˜κ³  μž‘μ„±ν•΄μ•Όν•©λ‹ˆλ‹€.

μ‹€λ¬΄μ—μ„œλŠ” addNum ν•¨μˆ˜ ν•˜λ‚˜λ₯Ό μž‘μ„±ν•˜λ”λΌλ„ λͺ¨λ“  μ—λŸ¬λŠ” μ•„λ‹ˆμ§€λ§Œ, μ˜ˆμΈ‘ν•  수 μžˆλŠ” μ—λŸ¬λ₯Ό μƒκ°ν•˜λ©° μž‘μ„±ν•  ν•„μš”λŠ” μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ μž‘μ„±ν•˜λ©΄ κ±°λŒ€ν•œ μ†Œν”„νŠΈμ›¨μ–΄κ°€ μž‘λ™μ€‘μ— κ°‘μžκΈ° λ°œμƒν•˜λŠ” μ—λŸ¬λ₯Ό 미연에 λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. νŒŒμ΄μ¬μ€ λ‹€μ΄λ‚˜λ―Ή 렝귀지 μž…λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬κ°€ μ½”λ“œλ₯Ό 일일히 μ²΄ν¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 이야기 μž…λ‹ˆλ‹€. μ½”λ“œλ₯Ό 싀행을 ν•΄μ•Ό λΉ„λ‘œμ†Œ κ·Έ μ½”λ“œμ— μ—λŸ¬κ°€ μžˆλŠ”μ§€ μ•Œ 수 μžˆλ‹΅λ‹ˆλ‹€. κ°•λ ₯ν•˜κ²Œ νƒ€μž…μ„ μ²΄ν¬ν•΄μ•Όν•˜λŠ” 상황이라면 μ•„λž˜κ°™μ€ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜ μ½”λ“œλŠ” νŽΈμ˜μƒ 두 값을 더할 수 μ—†λ‹€λ©΄ μ—λŸ¬μ™€ ν•¨κ»˜ 0을 λ°˜ν™˜ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

# coding:utf-8
# runcode.py
def addNum(a,b):
    """
    addNum ν•¨μˆ˜λŠ” 두 수λ₯Ό λ”ν•˜λŠ” ν•¨μˆ˜ μž…λ‹ˆλ‹€.
    """
    if not(isinstance(a,int) or isinstance(a,float)):
        return 0, "두 값을 더할 수 μ—†μŠ΅λ‹ˆλ‹€."
    if not(isinstance(b,int) or isinstance(b,float)):
        return 0, "두 값을 더할 수 μ—†μŠ΅λ‹ˆλ‹€."
    return a+b, None

λ¬Όλ‘  상황에 λ”°λΌμ„œλŠ” μ•„λž˜ μ½”λ“œμ²˜λŸΌ try, exceptλ₯Ό μ‚¬μš©ν•΄λ„ μ’‹μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—¬λŸ¬λΆ„μ΄ μ„œλ²„ν”„λ‘œκ·Έλž¨μ²˜λŸΌ μ •ν™•ν•˜κ²Œ μ–΄λ””μ„œ μ—λŸ¬κ°€ λ‚¬λŠ”μ§€ μ•Œκ³  μ‹Άμ„λ•ŒλŠ” μœ„μ²˜λŸΌ 각 μƒν™©λ³„λ‘œ μ—λŸ¬λ₯Ό μ²΄ν¬ν•˜λŠ” 것이 더 쒋을 수 μžˆμ–΄μš”. λ§Œμ•½ a, b κ°’ λ‘˜λ‹€ λ¦¬μŠ€νŠΈν˜•μœΌλ‘œ ν•¨μˆ˜μ˜ 인수둜 듀어와 버리면 try/except둜 κ΅¬ν˜„ν•œ μ½”λ“œλŠ” μ˜€μž‘λ™μ„ ν•˜κ²Œλ  ν…Œλ‹ˆκΉŒμš”.

# coding:utf-8
# runcode.py
def addNum(a,b):
    """
    addNum ν•¨μˆ˜λŠ” 두 수λ₯Ό λ”ν•˜λŠ” ν•¨μˆ˜ μž…λ‹ˆλ‹€.
    """
    try:
        return a+b, None
    except:
        return 0, "두 값을 더할 수 μ—†μŠ΅λ‹ˆλ‹€."

이 ν•¨μˆ˜μ— λ¬Έμ œκ°€ μžˆλŠ”μ§€ μ—†λŠ”μ§€λ₯Ό νŒλ‹¨ν•˜κΈ° μœ„ν•˜μ—¬ a λ˜λŠ” b 값에 int, float νƒ€μž…μ΄ μ•„λ‹Œ λ‹€λ₯Έ type을 λ„£μ–΄μ„œ ν…ŒμŠ€νŠΈν•΄ λ΄…μ‹œλ‹€. κ΄€λ ¨ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μ•„λž˜μ™€ 같은 ꡬ쑰λ₯Ό λ„κ²Œ λ©λ‹ˆλ‹€.

# coding:utf-8
# testcode.py
import unittest
from runcode import *
class Test_code(unittest.TestCase):
    def test_addNum(self):
        self.assertEqual(addNum(1,2), (3,None))
        self.assertEqual(addNum(0.1,2), (2.1,None))
        self.assertEqual(addNum("ν…Œ",2), (0,"두 값을 더할 수 μ—†μŠ΅λ‹ˆλ‹€."))
        self.assertEqual(addNum("ν…Œ","슀"), (0,"두 값을 더할 수 μ—†μŠ΅λ‹ˆλ‹€."))
        self.assertEqual(addNum([1,2],[1,2]), (0,"두 값을 더할 수 μ—†μŠ΅λ‹ˆλ‹€.")) # 리슀트λ₯Ό λ„£μ—ˆμŠ΅λ‹ˆλ‹€.
        self.assertEqual(addNum({"a":1},(1)), (0,"두 값을 더할 수 μ—†μŠ΅λ‹ˆλ‹€.")) # λ”•μ…”λ„ˆλ¦¬μ™€ νŠœν”Œμ„ λ”ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
if __name__ == "__main__":
    unittest.main()

ν…ŒμŠ€νŠΈκ°€ 잘 μ§„ν–‰λ˜λ©΄ μ•„λž˜μ™€ 같은 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

$ python testcode.py
.
---------------------------------------------------------------
Ran 1 test in 0.000s

OK

μ΄μƒμœΌλ‘œ νŒŒμ΄μ¬μ—μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 과정을 μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.