λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

μ±…/CleanCode

✨ Clean Code 9μž₯: λ‹¨μœ„ ν…ŒμŠ€νŠΈ

πŸ“Œ TDD 법칙 μ„Έ 가지

https://cio-wiki.org/wiki/Test_Driven_Development_(TDD)

  1. μ‹€νŒ¨ν•˜λŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•  λ•ŒκΉŒμ§€ μ‹€μ œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•ŠλŠ”λ‹€.
  2. μ»΄νŒŒμΌμ€ μ‹€νŒ¨ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ 싀행이 μ‹€νŒ¨ν•˜λŠ” μ •λ„λ‘œλ§Œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•œλ‹€.
  3. ν˜„μž¬ μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό 톡과할 μ •λ„λ‘œλ§Œ μ‹€μ œ μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€.

TDDλŠ” μ‹€μ œ μ½”λ“œλ₯Ό 짜기 전에 λ‹¨μœ„ ν…ŒμŠ€νŠΈλΆ€ν„° 짜라고 μš”κ΅¬ν•˜κ³  μžˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ‹€ 보면 λ§Žμ€ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ λ‚˜μ˜€κ²Œ λœλ‹€. ν•˜μ§€λ§Œ μ‹€μ œ μ½”λ“œμ™€ λ§žλ¨Ήμ„ μ •λ„λ‘œ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” λ°©λŒ€ν•΄μ§€λ©° 이에 λŒ€ν•œ 관리 문제λ₯Ό μœ λ°œν•˜κΈ°λ„ ν•œλ‹€.

πŸ“Œ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” κΉ”λ”ν•˜κ²Œ μœ μ§€ν•˜μž.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ μ€‘μš”μ„±

κ°œλ°œμžλ“€μ€ μ½”λ“œμ˜ μœ μ—°μ„±, μœ μ§€λ³΄μˆ˜μ„±, μž¬μ‚¬μš©μ„±μ— λŒ€ν•œ μ€‘μš”μ„±μ„ μ•Œκ³  μžˆλ‹€. ν•΄λ‹Ή λ‹¨μ›μ—μ„œλŠ” μ΄λŸ¬ν•œ μ€‘μš”μ„±μ— λŒ€ν•œ λ²„νŒ€λͺ©μ΄ λ‹¨μœ„ ν…ŒμŠ€νŠΈλΌκ³  μ†Œκ°œν•œλ‹€. μ΄μœ λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ 있으면 λ³€κ²½μ— 두렡지 μ•ŠκΈ° λ•Œλ¬Έμ΄λΌ ν•œλ‹€. λ‚˜λ„ 이에 κ³΅κ°ν•œλ‹€. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ 없을 λ•Œ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜κ³ μž ν•˜λ©΄ λ‹€λ₯Έ 곳에 λ¬Έμ œκ°€ μƒκΈΈκΉŒ 봐 두렡고 λ§μ„€μ—¬μ‘Œλ‹€. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ 있으면 μ΄λŸ¬ν•œ 두렀움을 없앨 수 μžˆλ‹€.

ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ§€μ €λΆ„ν•˜λ‹€λ©΄?

μ‹€μ œ μ½”λ“œλ₯Ό λ³€κ²½ν•˜λ©΄ κΈ°μ‘΄ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” μ‹€νŒ¨ν•œλ‹€. 그러면 ν…ŒμŠ€νŠΈ μ½”λ“œλ„ λ³€κ²½ν•΄μ•Ό ν•œλ‹€. μ—¬κΈ°μ„œ μ–΄λ–€ λ¬Έμ œκ°€ 생길 수 μžˆμ„μ§€ 생각해봐야 ν•œλ‹€. ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ λ§Œμ•½ μ§€μ €λΆ„ν•˜λ‹€λ©΄ μ–΄λ–¨κΉŒ? μ‹€μ œ μ½”λ“œμ™€ κ°™λ‹€. μ§€μ €λΆ„ν•˜λ‹€λ©΄ λ³€κ²½ν•˜κΈ°κ°€ 두렡고 μ–΄λ €μ›Œμ§„λ‹€. ν…ŒμŠ€νŠΈ μ½”λ“œλ„ κΉ”λ”ν•˜κ²Œ μœ μ§€ν•΄μ•Ό ν•œλ‹€λŠ” μ†Œλ¦¬μ΄λ‹€. μ‹€μ œ μ½”λ“œλŠ” λ§Žμ€ 변경이 μΌμ–΄λ‚˜κΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έλ ‡κ²Œ ν•˜μ§€ λͺ»ν•œλ‹€λ©΄ ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ λ³Έμ§ˆμ„ μžƒμ–΄ 였히렀 뢀담이 될 수 μžˆλ‹€.

μ–΄λ–»κ²Œ κΉ”λ”ν•˜κ²Œ μœ μ§€ν•΄μ•Ό ν• κΉŒ?

ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μ‹€μ œ μ½”λ“œλ§ŒνΌ λ‹¨μˆœν•˜κ³ , κ°„κ²°ν•˜κ³ , ν‘œν˜„λ ₯이 풍뢀해야 ν•œλ‹€. μ΅œμ†Œν•œμ˜ ν‘œν˜„μœΌλ‘œ λ§Žμ€ 것을 λ‚˜νƒ€λ‚΄λŠ” 것이 λ² μŠ€νŠΈμ΄λ‹€. ν•˜μ§€λ§Œ μ‹€μ œ μ½”λ“œλ§ŒνΌ 효율적일 ν•„μš”λŠ” μ—†λ‹€. μ‹€μ œ ν™˜κ²½μ΄ μ•„λ‹ˆλΌ ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œ λŒμ•„κ°€λŠ” μ½”λ“œμ΄κΈ° λ•Œλ¬Έμ΄λ‹€.

ν…ŒμŠ€νŠΈλŠ” 주둜 μ•„λž˜μ™€ 같이 μ„Έ λΆ€λΆ„μœΌλ‘œ λ‚˜λˆˆλ‹€.

  1. [μ€€λΉ„] ν…ŒμŠ€νŠΈ 자료λ₯Ό λ§Œλ“ λ‹€.
  2. [μ‹€ν–‰] ν…ŒμŠ€νŠΈ 자료λ₯Ό μ‘°μž‘ν•œλ‹€.
  3. [검증] μ‘°μž‘ν•œ κ²°κ³Όκ°€ μ˜¬λ°”λ₯Έμ§€ ν™•μΈν•œλ‹€.

λ§Žμ€ κ°œλ°œμžκ°€ 이미 μ•Œκ³  μžˆμ„ 수 μžˆλ‹€. given-when-then νŒ¨ν„΄μ„ λ– μ˜¬λ¦΄ 수 μžˆλ‹€. ν˜Ήμ‹œλ‚˜ given-when-then νŒ¨ν„΄μ— μ΅μˆ™ν•˜μ§€ μ•Šλ‹€λ©΄ μ•„λž˜ 링크λ₯Ό μ°Έκ³ ν•˜λ©΄ 쒋을 것 κ°™λ‹€. ν•΄λ‹Ή κΈ€μ—μ„œλŠ” [μ€€λΉ„-μ‹€ν–‰-검증]이라고 κ°„λ‹¨ν•˜κ²Œ ν‘œν˜„ν•˜μ˜€λ‹€. λ§Œμ•½ λ‚΄κ°€ μ„œνˆ¬λ₯΄κ±°λ‚˜ 마ꡬ작이둜 μž‘μ„±ν•œλ‹€λŠ” λŠλ‚Œμ΄ λ“ λ‹€λ©΄, 이런 μ‹μœΌλ‘œ κ΅¬μ‘°ν™”ν•˜λŠ” 것이 μ’‹λ‹€κ³  μƒκ°ν•œλ‹€.

 

Given-When-Then Pattern

ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± ν‘œν˜„ 방법 (μŠ€ν”„λ§ λΆ€νŠΈ ν™˜κ²½μ—μ„œ) | 이번 κΈ€μ—μ„œλŠ”, ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± μ‹œ 자주 μ‚¬μš©ν•˜λŠ” Given-When-Then Pattern에 λŒ€ν•΄μ„œ κ°„λž΅ν•˜κ²Œ μ†Œκ°œν•˜κ² λ‹€. 별 λ‚΄μš© μ—†λŠ” κΈ€μ΄λ―€λ‘œ, μ•„μ£Ό νŽΈν•œ

brunch.co.kr

μ±…μ—μ„œλŠ” ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈμ— assert ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€κ³  ν•œλ‹€. 이 뢀뢄을 μ½μœΌλ©΄μ„œ ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈμ— assert μ—¬λŸ¬ 개둜 κ²€μ¦ν•˜λŠ” λ‚˜μ˜ μ½”λ“œκ°€ λ– μ˜¬λžλ‹€. assert ν•˜λ‚˜λ‘œ μž‘μ„±ν•˜λ €λ©΄ κ²°κ΅­μ—” ν…ŒμŠ€νŠΈλ₯Ό λ‚˜λˆ μ€˜μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ λ§Žμ€ 쀑볡이 λ°œμƒν•  수 μžˆλ‹€. κ·Έλž˜μ„œ assert μ—¬λŸ¬ 개λ₯Ό μ‚¬μš©ν–ˆλ‹€. μ±…μ—μ„œλŠ” 쀑볡을 μ œκ±°ν•˜λŠ” λ°©λ²•μœΌλ‘œ TEMPLATE METHOD νŒ¨ν„΄μ„ μ–ΈκΈ‰ν–ˆλ‹€. ν•˜μ§€λ§Œ 배보닀 배꼽이 더 크기 λ•Œλ¬Έμ— 차라리 assert 문을 μ—¬λŸ¬ 개λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€κ³  ν•œλ‹€. λ­”κ°€ λͺ¨μˆœμ μΈ 상황인 것 κ°™λ‹€. 결ꡭ은 assert 문은 μ΅œλŒ€ν•œ 쀄이며, ν…ŒμŠ€νŠΈ ν•¨μˆ˜λ§ˆλ‹€ ν•œ κ°œλ…λ§Œ ν…ŒμŠ€νŠΈν•˜μž 라고 κ·œμΉ™μ„ μ •ν•˜λŠ” 것이 μ’‹λ‹€.

πŸ“Œ F.I.R.S.T

F.I.R.S.TλŠ” κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“€κΈ° μœ„ν•œ 5가지 κ·œμΉ™μ„ λ§ν•œλ‹€.

F.I.R.S.T μ„€λͺ…
λΉ λ₯΄κ²Œ(Fast) ν…ŒμŠ€νŠΈλŠ” 빨라야 ν•œλ‹€.
ν…ŒμŠ€νŠΈλŠ” 자주 λŒλ €μ•Όν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
λ…λ¦½μ μœΌλ‘œ(Independent) 각 ν…ŒμŠ€νŠΈλŠ” μ˜μ‘΄ν•˜λ©΄ μ•ˆ λœλ‹€.
μž‡λ‹¬μ•„ μ‹€νŒ¨ν•˜μ—¬ 원인을 μ§„λ‹¨ν•˜κΈ° μ–΄λ ΅κ³  ν›„λ°˜ ν…ŒμŠ€νŠΈκ°€ μ°Ύμ•„μ•Ό ν•  경함이 숨겨질 수 μžˆλ‹€.
λ°˜λ³΅κ°€λŠ₯ν•˜κ²Œ(Repeatabel) μ–΄λ–€ ν™˜κ²½μ—μ„œλ„ 반볡 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
λ„€νŠΈμ›Œν¬μ— μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•Šκ±°λ‚˜ μ‹€μ œ ν™˜κ²½ λͺ¨λ‘ μ‹€ν–‰ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
μžκ°€κ²€μ¦ν•˜λŠ”(Self-Validating) ν…ŒμŠ€νŠΈλŠ” λΆ€μšΈ κ°’μœΌλ‘œ 성곡 μ•„λ‹ˆλ©΄ μ‹€νŒ¨λ‘œ κ²°κ³Όλ₯Ό λ‚΄μ•Ό ν•œλ‹€.
μ μ‹œμ—(Timely) ν…ŒμŠ€νŠΈλŠ” μ μ‹œμ— μž‘μ„±ν•΄μ•Ό ν•œλ‹€.
λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” ν…ŒμŠ€νŠΈν•˜λ €λŠ” μ‹€μ œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜κΈ° 직전에 κ΅¬ν˜„ν•œλ‹€.

πŸ“Œ κ²°λ‘ 

ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μ‹€μ œ μ½”λ“œλ§ŒνΌ μ€‘μš”ν•˜λ‹€.
μ΅œλŒ€ν•œ λ‹¨μˆœν•˜κ³ , κ°„κ²°ν•˜κ³ , ν‘œν˜„λ ₯이 ν’λΆ€ν•˜κ²Œ λ‚˜νƒ€λ‚΄λΌ.
assert 문은 μ΅œλŒ€ν•œ 쀄이고, ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈμ— ν•œ κ°œλ…λ§Œ ν…ŒμŠ€νŠΈν•˜κ³  μžˆλŠ”μ§€ λ¬ΌμŒν‘œλ₯Ό 던져봐라.