E D R , A S I H C RSS

Test First Programming

메인 μ½”λ“œλΌ λ§Œλ“€κΈ° 전에 ν•΄λ‹Ή μ½”λ“œμ˜ μ˜λ„λΌ ν‘œν˜„ν•΄μ„ ν…ŒμŠ€νŠΈ μ½”λ“œλΌ λ¨Όμ € λ§Œλ“œλŠ” 기법.

μ–΄λ–»κ²Œ 보면 μ§ˆλ‹΅λ²•κ³Όλ„ κ°™λ‹€. ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 일단 μžμ‹ μ΄ λ§Œλ“€λ €κ³  ν•˜λŠ” 뢀뢄에 λŒ€ν•΄ μ§ˆλ¬Έμ„ 내리고, TestCaseλΌ λ¨Όμ € λ§Œλ“€μ–΄ λƒ„μœΌλ‘œμ„œ μ˜λ„λΌ ν‘œν˜„ν•œλ‹€. μ΄λ ‡κ²Œ UnitTest CodeλΌ λ¨Όμ € λ§Œλ“¬μœΌλ‘œμ„œ UnitTest FrameWork와 μ»΄νŒŒμΌλŸ¬μ—κ²Œ λ‚΄κ°€ 본래 λ§Œλ“€κ³ μž ν•˜λŠ” κΈ°λŠ₯κ³Ό ν˜„μž¬ λ§Œλ“€μ–΄μ§€κ³  μžˆλŠ” μ½”λ“œκ°€ ν•˜λŠ”μΌμ΄ μΌμΉ˜ν•˜λŠ”μ§€μ— λŒ€ν•΄ μ–΄λŠμ •λ„ 디버깅될 μ •λ³΄λΌ λ“±λ‘ν•΄λ†“λŠ”λ‹€. μ΄λ‘œμ„œ μ»΄νŒŒμΌλŸ¬λŠ” μ–Έμ–΄μ˜ λ¬Έλ²•μ—λŸ¬ κ²€μ¦λΏλ§Œ μ•„λ‹ˆλΌ μ•Œκ³ λ¦¬μ¦˜ μžμ²΄μ— λŒ€ν•œ 디버깅기λŠ₯을 μ–΄λŠμ •λ„ μˆ˜ν–‰ν•΄μ£Όκ²Œ λœλ‹€.

ν…ŒμŠ€νŠΈμ½”λ“œλŠ” ν”„λ‘œκ·Έλž˜λ¨Έκ°€ ν•˜λ €κ³  ν•˜λŠ”μΌ, 즉 μ˜λ„λΌ λ‹΄μ•„λ‚Έλ‹€. μ΄λŠ” 이 ν”„λ‘œκ·Έλž¨μ΄ μ–΄λ– ν•œ μ‹œλ‚˜λ¦¬μ˜€λ‘œ λŒμ•„κ°ˆκ²ƒμΈκ°€λΌ λ¨Όμ € μƒκ°ν•΄λ³΄λŠ” κΈ°νšŒλΌ μ €μ ˆλ‘œ μ œκ³΅ν•΄μ€λ‹€. Testκ°€ κ°€λŠ₯ν•œ μ½”λ“œλŠ” run 을 μ‹œμΌ°μ„λ•Œ μ–΄λ–€ κ²°κ³ΌλΌ λ‚Όμ§€λΌ νŒŒμ•…ν•  수 μžˆλŠ” μ½”λ“œμ΄λ‹€. 이 경우 ν•΄λ‹Ή λͺ¨λ“ˆμ΄ μ™„μ„±λ˜μ—ˆμ„λ•Œκ°€ μ–Έμ œμΈμ§€ κ·Έ λͺ©ν‘œλΌ λΆ„λͺ…ν•˜κ²Œ μž‘λŠ” 역할을 ν•΄μ€λ‹€.

ν…ŒμŠ€νŠΈμ½”λ“œ μžμ²΄κ°€ μΌμ’…μ˜ λ„νλ¨ΌνŠΈμ—­ν• μ„ ν•˜κΈ°λ„ ν•œλ‹€. ν…ŒμŠ€νŠΈ μ½”λ“œλΌ λ§Œλ“€λ©΄μ„œ μžμ‹ μ΄ ν•˜λ €λŠ” 일과 λ¬Έμ œμƒν™©μ„ ꡬ체화 μ‹œμΌœκ°„λ‹€.

ν…ŒμŠ€νŠΈμ½”λ“œκ°€ μ™„λ²½ν•  순 μ—†λ‹€. ν•˜μ§€λ§Œ, ν…ŒμŠ€νŠΈμ½”λ“œκ°€ λͺ¨λ“  μ—λŸ¬λΌ μž‘μ•„λ‚΄μ§€ λͺ»ν•œλ‹€λŠ” 이유둜 λ§Žμ€ 버그듀을 μ„일 수 μžˆλŠ” ν…ŒμŠ€νŠΈμ½”λ“œλΌ μž‘μ„±ν•˜μ§€ μ•Šμ„ μ΄μœ λŠ” μ—†λ‹€.

ExtremeProgrammingμ—μ„œλŠ” UnitTest -> Coding -> Refactoring 이 맞물렀 λŒμ•„κ°„λ‹€. TestFirstProgramming κ³Ό Refactoring 으둜 λ‹¨μˆœν•œ λ””μžμΈμ΄ μœ λ„λ˜μ–΄μ§„λ‹€.

μš”μƒˆλŠ” TestDrivenDevelopment 라고 ν•œλ‹€. λ‹¨μˆœνžˆ Test λΌ λ¨Όμ € μž‘μ„±ν•˜λŠ”κ²Œ μ•„λ‹Œ, Test 주도 개발인 것이닀. TestDrivenDevelopment λŠ” 제 2의 Refactoring 과도 κ°™λ‹€κ³  생각. --1002


μ°Έμ‘° μ‚¬μ΄νŠΈ :
ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±μ— λŒ€ν•΄μ„œλŠ” UnitTest 와 PyUnit, CppUnit λΌ μ°Έμ‘°ν•˜λΌ.

Test Code Refactoring

ν”„λ‘œκ·Έλž¨μ΄ 길어지닀보면 Test Code λ˜ν•œ 같이 κΈΈμ–΄μ§€κ²Œ λœλ‹€. μ–΄λŠμ •λ„ Test Code κ°€ κΈΈμ–΄μ§ˆ κ²½μš°μ—λŠ” μƒˆ κΈ°λŠ₯에 λŒ€ν•œ ν…ŒμŠ€νŠΈμ½”λ“œλΌ μž‘μ„±ν•˜λ €κ³  ν•  λ•Œλ§ˆλ‹€ 쀑볡이 μΌμ–΄λ‚œλ‹€. 이 κ²½μš°μ—λŠ” Test Code λΌ Refactoring ν•΄μ•Ό ν•˜λŠ”λ°, 이 경우 μžμΉ«ν•˜λ©΄ ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μ˜λ„λΌ ννŠΈλ €λœ¨λ¦΄ 수 μžˆλ‹€. ν…ŒμŠ€νŠΈ μ½”λ“œ μžμ²΄κ°€ ν•˜λ‚˜μ˜ λ‹€νλ¨ΌνŠΈκ°€ 되λ€λ‘œ, ν•΄λ‹Ή ν…ŒμŠ€νŠΈμ½”λ“œμ˜ μ˜λ„λŠ” λΆ„λͺ…ν•˜κ²Œ 남도둝 Refactoring 을 ν•΄μ•Ό ν•œλ‹€.

Test - Code Cycle

ν…ŒμŠ€νŠΈλΌ μž‘μ„±ν•˜λŠ” λ•Œμ™€ Code λΌ μž‘μ„±ν•˜λŠ” λ•Œμ˜ μ£ΌκΈ°κ°€ κΈΈμ–΄μ§ˆμˆ˜λ‘ νž˜λ“€λ‹€. μ£ΌκΈ°κ°€ λ„ˆλ¬΄ κΈΈμ–΄μ‘Œλ‹€κ³  μƒκ°λ˜λ©΄ λ‹€μŒμ„ λͺ…μ‹¬ν•˜λΌ.

Test Code Approach

Test Driven 에 λŒ€ν•œ μ ‘κ·Ό λ°©λ²•μ—λŠ” End-To-End (BlackBoxTesting) μ‹μ˜ μ ‘κ·Ό 방법과 WhiteBoxTesting 의 접근방법이 μžˆμ„ 수 μžˆκ² λ‹€.

μ „μžμ˜ κ²½μš°λŠ” μΌμ’…μ˜ 'λΆ€λΆ„κ²°κ³Ό - λΆ€λΆ„κ²°κ³Ό' λΌ μ΄μ–΄λ‚˜κ°€λ©΄μ„œ μ΅œμ’…λͺ©ν‘œλ‘œ μ ‘κ·Όν•˜λŠ” 방법이닀. μ΄λŠ” μ–΄λ–»κ²Œ 보면 Functional Approach 와 μœ μ‚¬ν•˜λ‹€. (Context Diagram 을 κΈ°μ€μœΌλ‘œ 계속 Divide & Conquer ν•΄ λ‚˜κ°€λ©΄μ„œ κ°€μž₯ μž‘μ€ λͺ¨λ“ˆλ“€μ„ μΆ”μΆœν•΄λ‚΄κ³ , κ·Έ λͺ¨λ“ˆλ“€μ„ ν•˜λ‚˜ν•˜λ‚˜μ”© μ •λ³΅ν•΄λ‚˜κ°€λŠ” 방법)

ν›„μžμ˜ κ²½μš°λŠ” ν•΄λ‹Ή μ½”λ“œμ˜ κ΅¬μ‘°λΌ ν…ŒμŠ€νŠΈν•΄λ‚˜κ°€λŠ” λ°©λ²•μœΌλ‘œ, ν•΄λ‹Ή μ½”λ“œμ˜ 진행이 μ˜λ„ν•œ 상황에 맞게 μ§„ν–‰λ˜μ–΄κ°€λŠ”μ§€λΌ μ²΄ν¬ν•΄λ‚˜κ°€λŠ” 방법이닀. μ΄λŠ” MockObjects λΌ μ΄μš©ν•˜μ—¬ μ ‘κ·Όν•  수 μžˆλ‹€. 즉, ν•΄λ‹Ή ν…ŒμŠ€νŠΈν•˜λ €λŠ” λͺ¨λ“ˆμ„ MockObject둜 κ΅¬ν˜„ν•˜κ³ , 호좜되기 μ›ν•˜λŠ” ν•¨μˆ˜λ“€μ΄ μ œλŒ€λ‘œ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€λΌ (MockObjects 의 mockobject.py 에 μžˆλŠ” ExpectationCounter λ“±μ˜ 이용) ν™•μΈν•˜κ±°λ‚˜ ν•΄λ‹Ή λ°μ΄ν„°μ˜ μΆ”κ°€ & μ‚­μ œκ΄€λ ¨ ν•¨μˆ˜λ“€μ΄ μ œλŒ€λ‘œ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€λΌ ν™•μΈν•˜λŠ” 방법 (ExpectationList, Set, Map λ“±μ˜ 이용) λ“±μœΌλ‘œμ„œ μ ‘κ·Όν•΄ λ‚˜κ°ˆ 수 μžˆλ‹€.

Test - Code μ£ΌκΈ°κ°€ κΈΈλ‹€κ³  μƒκ°λ˜κ±°λ‚˜, ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•œ κ²½μš°μ— λŒ€ν•œ 아이디어가 λ– μ˜€λ₯΄μ§€ μ•Šμ€ 경우, μ ‘κ·Ό 방법을 λ‹€λ₯΄κ²Œ κ°€μ Έλ³΄λŠ” 것도 ν•˜λ‚˜μ˜ 방법이 될 수 μžˆκ² λ‹€.

μ‹œλ‚˜λ¦¬μ˜€μ˜ 이용

Test Code λΌ μž‘μ„±ν•˜μ§„ μ•Šμ•˜μ§€λ§Œ, 이런 κ²½ν—˜μ€ μžˆμ—ˆλ‹€. PairProgramming 을 ν•˜λŠ” 쀑 νŒŒνŠΈλ„ˆμ—κ²Œ
'μ΄λ²ˆμ—λŠ” Socket Class λΌ λ§Œλ“€ μ°¨λ€μ•Ό. μ‹œμž‘ν•΄λ³ΌκΉŒ'

νŒŒνŠΈλ„ˆκ°€ λ¨Όμ € μ½”λ“œλΌ μž‘κΈ΄ ν–ˆλŠ”λ°, μ½”λ“œκ°€ μ€μ²˜λŸΌ 진행이 λ˜μ§€ μ•Šμ•˜λ‹€. λ¬Έμ œκ°€ 뭘까 κ³ λΌν•˜λ‹€κ°€ λ‹€μŒκ³Ό 같이 μ ‘κ·Όν•΄λ΄€λ‹€.
'μ§€κΈˆ μ €μͺ½μ—λŠ” μ—μ½”μ„œλ²„κ°€ μžˆμ–΄. μ§€κΈˆ λ§Œλ“€κ±΄ ν΄λΌμ΄μ–ΈνŠΈκ³ , μ§€κΈˆ λ§Œλ“€ 클래슀둜 write λΌ ν•˜λ©΄ μ €κΈ° 띄어놓은 μ—μ½”μ„œλ²„μ— λ‚΄κ°€ μž…λ ₯ν•œ 메세지가 κ·ΈλŒ€λ‘œ ν‘œμ‹œλ κ±°μ•Ό' 즉, μ™„μ„±λ˜μ—ˆμ„ λ•Œμ˜ κ²°κ³ΌλΌ λΈλ¦¬ κ·Έλ €λ³΄λŠ” 것이닀.

μ•„κΉŒλ³΄λ‹€ 훨씬 μˆ˜μ›”ν•˜κ²Œ μ§„ν–‰λ˜μ—ˆκ³ , κ·Έ κ²°κ³ΌλΌ λˆˆμœΌλ‘œ ν™•μΈν–ˆκ³ , κ²°κ³ΌλΌ λˆˆμœΌλ‘œ ν™•μΈν•œλ’€ 'μ™„λ£Œ' ν–ˆλ‹€. TFP 라면 μ΄λΌ μ½”λ“œλ‘œ μž‘μ„±ν•˜μ—¬ μžλ™ν™” ν•  것이닀. μžλ™ν™”λœ ν…ŒμŠ€νŠΈλŠ” μ•žμœΌλ‘œμ˜ μΆ”ν›„ λͺ¨λ“ˆ μˆ˜μ •μ‹œμ—λ„ μ•žμ—μ„œ λ‚΄κ°€ μ›ν•˜λŠ” κΈ°λŠ₯듀이 μ—¬μ „νžˆ μž‘λ™ν•¨μ„ 보μž₯ν•΄μ€λ‹€.

Random Generator

Random 은 μš°λ¦¬κ°€ μ˜ˆμΈ‘ν•  수 μ—†λŠ” 값이닀. μ΄λΌ μ²˜μŒλΆ€ν„° ν…ŒμŠ€νŠΈλΌ ν•˜λ €κ³  ν•˜λŠ” 것은 쒋은 접근이 λ˜μ§€ λͺ»ν•œλ‹€. 이 κ²½μš°μ—λŠ” Random Generator λΌ MockObjects 둜 κ΅¬ν˜„ν•˜μ—¬ 예츑 κ°€λŠ₯ν•œ Random 값이 λ‚˜μ˜€λ„λ‘ ν•œ λ’€, ν…ŒμŠ€νŠΈλΌ ν•  수 μžˆκ² λ‹€.

Server - Client

이 κ²½μš°μ—λ„ MockObjects λΌ μ΄μš©ν•  수 μžˆλ‹€. 기본적으둜 XPμ—μ„œμ˜ ν…ŒμŠ€νŠΈλŠ” μžλ™ν™”λœ ν…ŒμŠ€νŠΈ, 즉 ν…ŒμŠ€νŠΈκ°€ μ½”λ“œν™” 된 것이닀. 처음 λ°”λ‘œ 접근이 νž˜λ“€λ‹€λ©΄ Mock Server / Mock Client λΌ λ§Œλ“€μ–΄μ„œ ν…ŒμŠ€νŠΈ ν•  수 μžˆκ² λ‹€. 즉, ν•΄λ‹Ή 상황에 λŒ€ν•΄ μ΄λΈ λ‚΄μž₯λ˜μ–΄ μžˆλŠ” 값을 λ¦¬ν„΄ν•΄μ£ΌλŠ” μ„œλ²„λ‚˜ ν΄λΌμ΄μ–ΈνŠΈλΌ λ§Œλ“œλŠ” 것이닀. (μ΄λŠ” TestFirstProgramming μ—μ„œλ³΄λ‹¨ AcceptanceTest 에 λ„£λŠ”κ²Œ 더 λ§žμ„ λ“ ν•˜κΈ΄ ν•˜λ‹€. XP μ—μ„œλŠ” UnitTest 와 AcceptanceTest λ‘˜ λ‹€ μ΄μš©ν•œλ‹€.)

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:11
Processing time 0.0321 sec