Motivation

κΈ°λŠ₯을 μ™„μ „ν•˜κ²Œ κ΅¬ν˜„ν•˜λ €λ©΄?

  • 졜근 과제 μ „ν˜•μ„ 마치고 μ œμΆœν–ˆλ˜ μ½”λ“œλ₯Ό λ‹€μ‹œ μ‚΄νŽ΄λ³΄μ•˜λ‹€.
  • μš”κ΅¬μ‚¬ν•­μ— 따라 λ™μž‘ν•˜κ²Œ λ§Œλ“€μ—ˆμ§€λ§Œ μ—λŸ¬ 핸듀링, μ˜ˆμ™Έ 처리, 효율 μΈ‘λ©΄μ—μ„œ λ†“μΉœ 뢀뢄이 λ§Žμ•˜λ‹€λŠ” κ±Έ κΉ¨λ‹¬μ•˜λ‹€.
  • λ‹¨μˆœνžˆ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” 것과, μ˜ˆμƒν•˜μ§€ λͺ»ν•œ λ™μž‘κ³Ό μƒνƒœλ₯Ό λŒ€λΉ„ν•΄μ„œ 잘 λ§Œλ“œλŠ” 건 μ „ν˜€ λ‹€λ₯Έ λ¬Έμ œμ˜€λ‹€.
  • κ³Όμ œμ—μ„œ 크게 신경을 μ“°μ§€ λͺ»ν•œ Testing μ˜μ—­μ΄ λˆˆμ— λ“€μ–΄μ™”κ³  ‘μ½”λ“œκ³Ό ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μˆœμ„œλ₯Ό λ°”κΏ¨μ—ˆλ”λΌλ©΄?‘μ΄λΌλŠ” 생각이 λ“€μ—ˆλ‹€.

Code First

μš”κ΅¬μ‚¬ν•­ 확인 β†’ κΈ°λŠ₯ 개발 β†’ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± β†’ ν…ŒμŠ€νŠΈ

  • κΈ°μ‘΄ 개발 ν”Œλ‘œμš°λŒ€λ‘œλΌλ©΄ 보톡 μš”κ΅¬μ‚¬ν•­ 확인 β†’ κΈ°λŠ₯ 개발 β†’ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± -> ν…ŒμŠ€νŠΈ μ‹€ν–‰ μˆœμ„œλ‘œ μ§„ν–‰ν•  것 κ°™λ‹€.
    • ‘것 κ°™λ‹€’둜 μ΄μ•ΌκΈ°ν•œ μ΄μœ λŠ”, μ‹€μ œ ν”„λ‘œμ νŠΈμ—μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό ν™œμš©ν•œ κ²½ν—˜μ΄ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.
  • 이 μˆœμ„œλ‘œ μž‘μ—…μ„ ν•  경우 β€œλ‚΄κ°€ λ§Œλ“  κΈ°λŠ₯이 λ§žλ‹€κ³  λ―ΏλŠ” λ²”μœ„β€ μ•ˆμ—μ„œλ§Œ ν…ŒμŠ€νŠΈλ₯Ό μ½”λ“œλ₯Ό μž‘μ„±ν•  μœ„ν—˜μ΄ μžˆκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.
    • λ‚΄κ°€ κ΅¬ν˜„ν•œ ν˜•νƒœμ— 맞좰 ν…ŒμŠ€νŠΈλ₯Ό μ„€κ³„ν•˜κ²Œ 되면, 확증 편ν–₯처럼 μš”κ΅¬μ‚¬ν•­μ„ κ²€μ¦ν•œλ‹€κΈ°λ³΄λ‹€ κ΅¬ν˜„μ„ μ •λ‹Ήν™”ν•˜λŠ” ν…ŒμŠ€νŠΈκ°€ 될 것 κ°™λ‹€.

Test Code First

μš”κ΅¬μ‚¬ν•­ 확인 β†’ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± (μ˜ˆμƒ 좜λ ₯ μˆ˜λ™ μž…λ ₯) β†’ κΈ°λŠ₯ 개발 -> ν…ŒμŠ€νŠΈ (μ‹€μ œ 좜λ ₯κ³Ό 비ꡐ)

  • κ·Έλ•Œ λ– μ˜€λ₯Έ 방법이 β€œμ‹œλ‚˜λ¦¬μ˜€ 기반 ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € λ§Œλ“€κ³  κ°œλ°œμ„ μ‹œμž‘ν•˜λŠ” λ°©μ‹β€μ΄μ—ˆλ‹€.
  • μˆœμ„œλ₯Ό λ°”κΏ”μ„œ, μš”κ΅¬μ‚¬ν•­ 확인 β†’ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± β†’ 개발의 μ΄ν„°λ ˆμ΄μ…˜μ„ λŒλ €λ³΄μžλŠ” 생각을 ν–ˆλ‹€.
    • 특히 μš”κ΅¬μ‚¬ν•­μ„ μœ μ € μ‹œλ‚˜λ¦¬μ˜€λ‘œ ν’€μ–΄ ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € μ„€κ³„ν•˜λ©΄, β€œμ •μƒ μž…λ ₯만 λ“€μ–΄μ˜¨λ‹€β€λŠ” κ°€μ •μ—μ„œ λ²—μ–΄λ‚˜ 더 넓은 μ‹œμ•Όλ‘œ 문제λ₯Ό λ³Ό 수 μžˆμ„ 것 κ°™μ•˜λ‹€.
    • 예λ₯Ό λ“€μ–΄ μ‹€νŒ¨ μΌ€μ΄μŠ€(잘λͺ»λœ μž…λ ₯, 빈 κ°’, 쀑볡 μš”μ²­, νƒ€μž„μ•„μ›ƒ λ“±)λ₯Ό μžμ—°μŠ€λŸ½κ²Œ λ– μ˜¬λ¦¬κ²Œ 되고, κ·Έ κ³Όμ •μ—μ„œ μ˜ˆμ™Έ μ²˜λ¦¬μ™€ μ—λŸ¬ ν•Έλ“€λ§μ˜ ν’ˆμ§ˆλ„ ν•¨κ»˜ 올라갈 κ°€λŠ₯성이 크닀.

TDD와 BDD

  • ν…ŒμŠ€νŠΈ μ½”λ“œμ— λŒ€ν•΄ μ•Œμ•„λ³΄λ©΄μ„œ, λ‚΄κ°€ λŠλ‚€ λ¬Έμ œμ˜μ‹μ΄ TDD와 κ΄€λ ¨μžˆλ‹€λŠ” 것도 μ•Œκ²Œ λ˜μ—ˆλ‹€.
    • TDDλŠ” “ν…ŒμŠ€νŠΈ λ¨Όμ €, κ΅¬ν˜„ λ‚˜μ€‘” μ›μΉ™μœΌλ‘œ, Red(μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈ μž‘μ„±) β†’ Green(ν…ŒμŠ€νŠΈ ν†΅κ³Όν•˜λŠ” μ΅œμ†Œ μ½”λ“œ μž‘μ„±) β†’ Refactor(μ½”λ“œ κ°œμ„ ) 사이클을 λ°˜λ³΅ν•˜λ©° κ°œλ°œν•˜λŠ” 방법둠이닀.
  • λ™μ‹œμ— λ‚΄κ°€ μƒκ°ν–ˆλ˜ “μœ μ € μ‹œλ‚˜λ¦¬μ˜€ 기반 ν…ŒμŠ€νŠΈ"λ₯Ό 더 ν™•μž₯ν•œ κ°œλ…μ΄ BDD와 μœ μ‚¬ν•˜λ‹€λŠ” 점도 ν₯λ―Έλ‘œμ› λ‹€.
    • BDDλŠ” TDDμ—μ„œ λ°œμ „ν•œ κ°œλ…μœΌλ‘œ, μ‚¬μš©μž 행동(Behavior) κ΄€μ μ—μ„œ Given-When-Then ν˜•μ‹μœΌλ‘œ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•œλ‹€.
  • λ‘˜μ˜ 핡심 μ°¨μ΄λŠ” ν…ŒμŠ€νŠΈ λ²”μœ„κ°€ μ•„λ‹ˆλΌ 관점이닀.
    • TDDκ°€ “이 ν•¨μˆ˜κ°€ μ˜¬λ°”λ₯΄κ²Œ λ™μž‘ν•˜λŠ”κ°€?”, “μ„±λŠ₯은 μ–΄λ– ν•œκ°€?“λ₯Ό λ¬»λŠ”λ‹€λ©΄, BDDλŠ” “μ‚¬μš©μžκ°€ Xλ₯Ό ν–ˆμ„ λ•Œ Yκ°€ μΌμ–΄λ‚˜λŠ”κ°€?“λ₯Ό λ¬»λŠ”λ‹€.
    • TDDλŠ” 개발자 κ΄€μ μ—μ„œ μ½”λ“œμ˜ μ •ν™•μ„±κ³Ό μ„±λŠ₯을, BDDλŠ” μ‚¬μš©μž/λΉ„μ¦ˆλ‹ˆμŠ€ κ΄€μ μ—μ„œ μš”κ΅¬μ‚¬ν•­ 좩쑱을 κ²€μ¦ν•œλ‹€.
  • λ‘˜ λ‹€ ν•¨κ»˜ μ“°λŠ” 방법도 μžˆμ„κΉŒ μƒκ°ν–ˆλŠ”λ°, κ²€μ¦ν•˜λ €λŠ” μ˜μ—­μ΄ μ—¬λŸ¬ ν…ŒμŠ€νŠΈ μ½”λ“œμ— 걸쳐 μ€‘λ³΅λ˜κ±°λ‚˜ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±μ—λ§Œ μ‹œκ°„μ΄ κ³Όλ„ν•˜κ²Œ μŸμ•„μ§ˆ μœ„ν—˜(본말전도)도 μžˆκ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.

AI μ‹œλŒ€μ˜ ν…ŒμŠ€νŒ…

  • AI μ‹œλŒ€μ— ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ–΄λ–€ μ˜λ―ΈμžˆλŠ”μ§€ κΆκΈˆν•΄μ Έμ„œ μ˜μƒμ„ 찾아보닀가 2025λ…„ 6μ›” μΌ„νŠΈλ°±μ˜ TDD 토크λ₯Ό λ°œκ²¬ν–ˆλ‹€.
  • TDD, AI agent and coding with Kent Beck λ‚΄μš©μ„ 짧게 μš”μ•½ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
  • AI μ‹œλŒ€μ˜ 사고방식:
    • λΉ„μ „κ³Ό 섀계 λŠ₯λ ₯이 핡심 μŠ€ν‚¬λ‘œ 뢀상 (λΉ„μ „ μ„€μ •, μ΄μ •ν‘œ 관리, λ³΅μž‘μ„± μ œμ–΄)
    • μ–Έμ–΄ 세뢀사항은 더 이상 μ€‘μš”ν•˜μ§€ μ•ŠμŒ
    • μ‹€ν—˜μ˜ 양적 증가가 경쟁 μš°μœ„
      • μ½”λ“œ 양이 증가함에 따라 νƒμƒ‰λœ μ•„μ΄λ””μ–΄μ˜ 양이 μ€‘μš”
      • “λͺ¨λ“  것을 μ‹€ν—˜” 해봐야 ν•˜λŠ” μ‹œλŒ€ comment
  • μΌ„νŠΈ 백의 μ¦κ°•ν˜• μ½”λ”© ν›„κΈ° λ²ˆμ—­λ„ 재미있게 μ½μ—ˆλ‹€. (+ TDDλ₯Ό μœ„ν•œ ν”„λ‘¬ν”„νŠΈ)
    • 야크털 깎기(yak shaving)λΌλŠ” ν‘œν˜„ μž¬λ°Œλ‹€.

μ•„λ¬΄νŠΌ ν…ŒμŠ€νŒ…

  • 이번 과제λ₯Ό 톡해 ν•˜λ‚˜μ˜ μˆ˜λ‹¨μ΄μž λ„κ΅¬λ‘œμ„œμ˜ ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ ν•„μš”μ„±μ„ μ²΄κ°ν–ˆλ‹€.
  • 개인 iOS μ•± ν”„λ‘œμ νŠΈμ—μ„œμ„œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©° 배운 것듀을 이 λ¬Έμ„œμ— μ°¨κ·Όμ°¨κ·Ό 정리해보렀고 ν•œλ‹€.

Overview

  • ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ λͺ©μ 
  • Testing의 μ’…λ₯˜
  • Apple Platforms κ°œλ°œμ—μ„œμ˜ testing frameworks
    • XCTest
    • Swift Testing
  • 쒋은 ν…ŒμŠ€νŠΈ μž‘μ„± 팁

XCTest

μ„€λͺ…

  • Xcode ν”„λ‘œμ νŠΈμ—μ„œ λ‹¨μœ„ ν…ŒμŠ€νŠΈ(Unit Test)λ₯Ό μž‘μ„±ν•˜κ³ , Xcode의 ν…ŒμŠ€νŠΈ μ›Œν¬ν”Œλ‘œμ™€ μ›ν™œν•˜κ²Œ ν†΅ν•©λ˜λ„λ‘ μ„€κ³„λœ Apple 곡식 ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬. μ—­ν• 
  • μ½”λ“œ μ‹€ν–‰ 쀑 νŠΉμ • 쑰건이 μΆ©μ‘±λ˜λŠ”μ§€ κ²€μ¦ν•˜κ³ , 쑰건이 λ§Œμ‘±λ˜μ§€ μ•ŠμœΌλ©΄ μ‹€νŒ¨ 기둝.
  • μ½”λ“œ λΈ”λ‘μ˜ μ„±λŠ₯을 μΈ‘μ •ν•˜μ—¬ μ„±λŠ₯ νšŒκ·€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” μ„±λŠ₯ ν…ŒμŠ€νŠΈλ₯Ό 제곡.
  • XCUIAutomationκ³Ό ν•¨κ»˜ μ‚¬μš©ν•  경우, μ•±μ˜ UIλ₯Ό μžλ™μœΌλ‘œ μ‘°μž‘ν•˜μ—¬ μ‹€μ œ μ‚¬μš©μž 흐름을 κ²€μ¦ν•˜λŠ” UI ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„± κ°€λŠ₯ κΈ°λ³Έ ꡬ쑰
  • XCTestCaseλ₯Ό μƒμ†ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ νƒ€μž…μ„ λ§Œλ“€κ³ , 이름이 Β test 둜 μ‹œμž‘ν•˜λŠ” λ©”μ„œλ“œλ₯Ό μ •μ˜.
  • ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό κ°œλ³„ ν…ŒμŠ€νŠΈλ‘œ 인식.
  • ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ μ•ˆμ—μ„œ Β XCTAssertEqual, Β XCTAssertTrueΒ  λ“± λ‹€μ–‘ν•œ assertion ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ κΈ°λŒ€ κ°’κ³Ό μ‹€μ œ 값을 비ꡐ Xcodeμ™€μ˜ 톡합
  • ν…ŒμŠ€νŠΈλŠ” Xcode λ‚΄μ—μ„œ λΉŒλ“œ-μ‹€ν–‰-κ²°κ³Ό ν™•μΈκΉŒμ§€ ν•œ νλ¦„μœΌλ‘œ 처리
  • Test navigatorλ‚˜ μŠ€ν‚΄μ—μ„œ μ†μ‰½κ²Œ μ‹€ν–‰ κ°€λŠ₯
  • UI μžλ™ν™” ν…ŒμŠ€νŠΈλŠ” μ—¬λŸ¬ κΈ°κΈ°, μ–Έμ–΄, μ§€μ—­ μ„€μ •, ν™˜κ²½ μ‘°κ±΄μ—μ„œ μž¬μ‹€ν–‰ κ°€λŠ₯
  • μ‚¬μš©μž κ²½ν—˜μ„ ν­λ„“κ²Œ κ²€μ¦ν•˜λŠ” 데 ν™œμš© Swift Testing과의 관계
  • Swift Testing은 μƒˆλ‘œμš΄ ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬
  • XCTest와 λΉ„μŠ·ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€λ§Œ λ‹€λ₯Έ 문법과 λ™μ‹œμ„± λͺ¨λΈμ„ μ‚¬μš©.
    • UI μžλ™ν™”(XCUIApplication λ“±)λ‚˜ μ„±λŠ₯ λ©”νŠΈλ¦­(XCTMetric λ“±)을 μ‚¬μš©ν•˜λŠ” ν…ŒμŠ€νŠΈ, Objective-C 기반 ν…ŒμŠ€νŠΈλŠ” μ—¬μ „νžˆ XCTestλ₯Ό μ‚¬μš©ν•΄μ•Ό 함

References πŸ‘€