본문으둜 κ±΄λ„ˆλ›°κΈ°

🌈 Chapter 23: ν…ŒμŠ€νŠΈ 진단

πŸ“š μ‹€νŒ¨ν•˜λŠ” 섀계​

  • ν…ŒμŠ€νŠΈμ˜ 핡심은 톡과가 μ•„λ‹ˆλΌ μ‹€νŒ¨μ— μžˆλ‹€. ν…ŒμŠ€νŠΈ μ‹€νŒ¨κ°€ μš°λ¦¬κ°€ μ•Œμ•„μ°¨λ¦¬μ§€ λͺ»ν–ˆλ˜ μ½”λ“œμƒμ˜ μ•”μ‹œμ μΈ 관계λ₯Ό λ“œλŸ¬λ‚Έλ‹€.
  • μ ˆλŒ€ ν•˜μ§€ 말아야 ν•  일은 디버거λ₯Ό μ—΄μ–΄μ„œ ν…ŒμŠ€νŠΈν•œ μ½”λ“œλ₯Ό λ‹¨κ³„λ³„λ‘œ ν›‘μ–΄ λ‚΄λ €κ°€λ©΄μ„œ λΆˆμΌμΉ˜ν•œ 점을 μ•Œμ•„λ‚΄λŠ” 것이닀. κ·Έλ ‡κ²Œ ν•œλ‹€λŠ” 것은, μ΅œμ†Œν•œ μš°λ¦¬κ°€ μž‘μ„±ν•œ ν…ŒμŠ€νŠΈκ°€ μš”κ΅¬ 사항을 μΆ©λΆ„νžˆ λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•˜μ§€ λͺ»ν–ˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

πŸ“š μž‘κ³ , λ¬Έμ œμ— μ§‘μ€‘ν•˜κ³ , 이름을 잘 지은 ν…ŒμŠ€νŠΈβ€‹

  • 진단을 κ°œμ„ ν•˜λŠ” κ°€μž₯ μ‰¬μš΄ 방법은 각 ν…ŒμŠ€νŠΈλ₯Ό μž‘μœΌλ©΄μ„œ λ¬Έμ œμ— μ΄ˆμ μ„ 맞좘 μƒνƒœλ‘œ μœ μ§€ν•˜κ³  ν…ŒμŠ€νŠΈμ— 가독성 μžˆλŠ” 이름을 λΆ€μ—¬ν•˜λŠ” 것이닀.

πŸ“š μ„€λͺ…λ ₯ μžˆλŠ” 단정 λ©”μ‹œμ§€β€‹

  • JUnit의 λͺ¨λ“  단정 λ©”μ„œλ“œμ—λŠ” 단정이 μ‹€νŒ¨ν–ˆμ„ λ•Œ ν‘œμ‹œν•  λ©”μ‹œμ§€λ₯Ό 첫 번째 λ§€κ°œλ³€μˆ˜λ‘œ 전달할 수 μžˆλ‹€. 이 κΈ°λŠ₯은 단정 λ©”μ‹œμ§€λ₯Ό λ”μš± μœ μš©ν•˜κ²Œ ν•  수 μžˆλ‹€.
  • λ‹¨μ •μ˜ λŒ€μƒμ΄ λ˜λŠ” 값을 μ‹λ³„ν•˜λŠ” 값을 μΆ”κ°€ν•œλ‹€.
assertEquals("account id", "573242", customer.getAccountId());
assertEquals("outstanding balance", 16301, customer.getOutstandingBalance());

πŸ“š 맀처λ₯Ό ν™œμš©ν•œ μ„ΈλΆ€ 사항 강쑰​

  • κ°œλ°œμžλ“€μ€ ν–„ν¬λ ˆμŠ€νŠΈ 맀처의 assertThat()을 μ΄μš©ν•΄ 차이점을 μ •ν™•ν•˜κ²Œ μ΄ν•΄ν•˜λŠ” 데 도움을 μ£ΌκΈ° μœ„ν•΄ λΆˆμΌμΉ˜ν•˜λŠ” 값을 κΈ°μˆ ν•˜λŠ” 보쑰 κΈ°λŠ₯이 ν¬ν•¨λ˜μ–΄ μžˆμ–΄ μ–΄λŠ 값이 μ€‘μš”ν•œμ§€ μ •ν™•ν•œ μ‹€νŒ¨ λ©”μ‹œμ§€λ₯Ό λ§Œλ“€μ–΄λ‚Έλ‹€.

πŸ“š 자기 μ„œμˆ μ μΈ 값​

  • 단정 λ‚΄μ˜ 값에 μ„ΈλΆ€ 사항을 μΆ”κ°€ν•  수 μžˆλ‹€. 단정에 μ„ΈλΆ€ 사항을 μΆ”κ°€ν•΄μ•Ό ν•œλ‹€λ©΄ μ•„λ§ˆλ„ μš°λ¦¬κ°€ μ‹€νŒ¨λ₯Ό μ’€ 더 μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€ μˆ˜λ„ μžˆλ‹€λŠ” νžŒνŠΈμ΄λ‹€.
  • 자기 μ„œμˆ μ μΈ κ°’μœΌλ‘œ μ‹€νŒ¨ λ©”μ‹œμ§€λ₯Ό κ°œμ„ ν•  수 μžˆλ‹€.

πŸ“š λͺ…ν™•ν•˜κ²Œ κ°€κ³΅λœ 값​

  • 검사 λŒ€μƒμ΄ λ˜λŠ” 값이 슀슀둜λ₯Ό μ‰½κ²Œ μ„€λͺ…ν•˜μ§€ λͺ»ν•  λ•Œκ°€ μžˆλ‹€. (charλ‚˜ intμ—λŠ” μΆ©λΆ„ν•œ 정보가 μ—†λ‹€.)
  • ν•œ 가지 방법은 μ œν’ˆμ—μ„œ κΈ°λŒ€ν•  λ²•ν•œ κ°’κ³ΌλŠ” ν™•μ—°νžˆ λ‹€λ₯Έ λ³„λ‚œ 값을 μ‚¬μš©ν•˜λŠ” 것이닀.
  • νŒ€μ—μ„œ 곡톡적인 값에 λŒ€ν•΄ 관계λ₯Ό λ§Œλ“€μ–΄μ£Όλ©΄ κ΄€λ‘€κ°€ λΆ„λͺ… λ‘λ“œλŸ¬μ§€κ²Œ λ“œλŸ¬λ‚  수 μžˆλ‹€.

πŸ“š μΆ”μ μž 객체​

  • λ•Œλ‘œλŠ” ν…ŒμŠ€νŠΈ 쀑인 μ½”λ“œλ‘œ μ „λ‹¬ν•œ 객체가 μ μ ˆν•œ ν˜‘λ ₯ κ°μ²΄μ—κΉŒμ§€ μ „λ‹¬λλŠ”μ§€ ν™•μΈν•˜κ³  싢을 λ•Œκ°€ μžˆλ‹€. μ΄λŸ¬ν•œ 값을 ν‘œν˜„ν•˜κΈ° μœ„ν•΄ λͺ…ν™•ν•˜κ²Œ κ°€κ³΅λœ κ°’ νƒ€μž…μ— ν•΄λ‹Ήν•˜λŠ” μΆ”μ μž 객체(tracer object)λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.
  • μΆ”μ μž κ°μ²΄λŠ” λ­”κ°€κ°€ μ‹€νŒ¨ν–ˆμ„ λ•Œ μžμ‹ μ˜ 역할을 κΈ°μˆ ν•˜λŠ” 것을 μ œμ™Έν•˜λ©΄ 자체적인 보쑰적 ν–‰μœ„κ°€ 아무것도 μ—†λŠ” 더미 객체에 ν•΄λ‹Ήν•œλ‹€.
  • μΆ”μ μž κ°μ²΄λŠ” ν΄λž˜μŠ€μ— TDDλ₯Ό μ μš©ν•  λ•Œ μœ μš©ν•œ 섀계 도ꡬ일 수 μžˆλ‹€. λ•Œλ•Œλ‘œ μš°λ¦¬λŠ” 빈 μΈν„°νŽ˜μ΄μŠ€λ‘œ 도메인 κ°œλ…μ„ ν‘œμ‹œν•΄ μΈν„°νŽ˜μ΄μŠ€κ°€ ν˜‘λ ₯에 μ–΄λ–»κ²Œ μ‚¬μš©λ˜λŠ”μ§€ 보여주기도 ν•œλ‹€.

πŸ“š μ˜ˆμƒμ΄ μΆ©μ‘±λμŒμ„ λͺ…μ‹œμ μœΌλ‘œ λ‹¨μ •ν•˜λΌβ€‹

  • μ˜ˆμƒ ꡬ문과 단정이 λͺ¨λ‘ ν¬ν•¨λœ ν…ŒμŠ€νŠΈλŠ” ν˜Όλž€μŠ€λŸ¬μš΄ μ‹€νŒ¨λ₯Ό λ§Œλ“€μ–΄λ‚Ό 수 μžˆλ‹€.
  • κ°€λ Ή ν˜‘λ ₯ 객체가 적절히 λ™μž‘ν•˜μ§€ μ•Šκ³  잘λͺ»λœ 값을 λ°˜ν™˜ν•œλ‹€λ©΄ 단정이 μ˜ˆμƒ ꡬ문을 κ²€μ‚¬ν•˜κΈ° 전에 μ‹€νŒ¨ν• μ§€λ„ λͺ¨λ₯Έλ‹€. λ‹€μ‹œ 말해 μ΄λ ‡κ²Œ 되면 μ‹€μ œλ‘œ ν…ŒμŠ€νŠΈ μ‹€νŒ¨λ₯Ό μ•ΌκΈ°ν•œ λˆ„λ½λœ ν˜‘λ ₯ κ°μ²΄λ³΄λ‹€λŠ” μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ 계산 κ²°κ³Όλ₯Ό λ³΄μ—¬μ£ΌλŠ” μ‹€νŒ¨ 보고가 λ§Œλ“€μ–΄μ§„λ‹€.
  • 일뢀 κ²½μš°μ—λŠ” μ–΄λ–€ ν…ŒμŠ€νŠΈ 단정이 μ˜¬λ°”λ₯Έ μ‹€νŒ¨ 보고λ₯Ό νšλ“ν•˜κΈ° 전에 Mockery에 λŒ€ν•΄ assertIsSatisfied() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 편이 κ°€μΉ˜μžˆλ‹€.
context.assertIsSatisfied();
assertThat(result, equalTo(expectedResult));
  • μ˜ˆμƒ ꡬ문이 μΆ©μ‘±λ˜μ§€ μ•Šκ³  ν›„ν–‰ 쑰건 단정이 λŒ€μ‹  μ‹€νŒ¨ν•˜κΈ° λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈκ°€ μ‹€νŒ¨ν•˜λ¦¬λΌ μ˜ˆμƒν•œλ‹€λ©΄ λͺ¨λ“  μ˜ˆμƒμ΄ μΆ©μ‘±λμŒμ„ λ‹¨μ •ν•˜λŠ” λͺ…μ‹œμ μΈ ν˜ΈμΆœμ„ μΆ”κ°€ν•΄μ•Όν•œλ‹€λŠ” 사싀을 μ•Œκ²Œ 될 것이닀.

πŸ“š 진단은 일급 κΈ°λŠ₯이닀​

  • μš”μ¦˜μ—λŠ” λ„€ 단계 TDD μ£ΌκΈ°(μ‹€νŒ¨, 보고, 톡과, λ¦¬νŒ©ν„°λ§)λ₯Ό λ”°λ₯΄λ € ν•˜λŠ”λ°, μ΄λ ‡κ²Œ ν•΄μ„œ μš°λ¦¬κ°€ μ•„λŠ” κΈ°λŠ₯을 이해할 수 있으며, ν•œ 달 내에 κΈ°λŠ₯을 λ³€κ²½ν•΄μ•Ό ν•˜λŠ” μ‚¬λžŒμ΄ λˆ„κ΅¬μ΄λ“  κ·Έ λˆ„κ΅°κ°€λ„ κΈ°λŠ₯을 이해할 것이기 λ•Œλ¬Έμ΄λ‹€.

μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈ μž‘μ„± -> 진단 정보λ₯Ό λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ -> ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όμ‹œν‚€κΈ° -> λ¦¬νŒ©ν„°λ§