KoreaMango λ‚˜λ¬΄

[iOS] Unit Test - λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ–΄λ–»κ²Œ ν•˜λŠ”κ±΄λ°.. (1) λ³Έλ¬Έ

iOS/Unit Test

[iOS] Unit Test - λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ–΄λ–»κ²Œ ν•˜λŠ”κ±΄λ°.. (1)

KoreaMango 2022. 7. 2. 23:57

πŸ™ˆ μ„œλ‘ 

μ—¬λŸ¬ μ„Έμ…˜μ΄λ‚˜ μ±„μš©κ³΅κ³ λ₯Ό 보면 λ‹¨μœ„ ν…ŒμŠ€νŠΈμ— λŒ€ν•œ 이야기λ₯Ό 많이 μ ‘ν•  수 μžˆλ‹€.

ν…ŒμŠ€νŠΈν•˜λ©° 코딩을 ν•˜λ©΄ μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•˜κ³  μ½”λ“œ μ•ˆμ •μ„±μ„ λ†’μ΄λŠ” λ“± λ‹€μ–‘ν•œ μž₯점이 μžˆλ‹€.

μ—¬νƒœ ν…ŒμŠ€νŠΈμ˜ μ€‘μš”μ„±μ— λŒ€ν•΄ 잘 μ•Œκ³  μžˆμ—ˆμ§€λ§Œ, λ‚΄ ν”„λ‘œμ νŠΈμ—λŠ” μ μš©ν•΄λ³΄μ§„ λͺ»ν–ˆλ‹€. κ·Έλž˜μ„œ ν•œλ²ˆ μžμ„Έν•˜κ²Œ 파보고자 정리해보렀고 ν•œλ‹€.

 

 

 

 

 

❓Unit Test에 λŒ€ν•΄

μ •μ˜

컴퓨터 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ†ŒμŠ€ μ½”λ“œμ˜ νŠΉμ • λͺ¨λ“ˆμ΄ μ˜λ„λœ λŒ€λ‘œ μ •ν™•νžˆ μž‘λ™ν•˜λŠ”μ§€ κ²€μ¦ν•˜λŠ” 절차

즉, λͺ¨λ“  ν•¨μˆ˜μ™€ λ©”μ†Œλ“œμ— λŒ€ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μž‘μ„±ν•˜λŠ” 절차λ₯Ό λ§ν•œλ‹€. 이λ₯Ό ν†΅ν•΄μ„œ μ–Έμ œλΌλ„ μ½”λ“œ λ³€κ²½μœΌλ‘œ 인해 λ¬Έμ œκ°€ λ°œμƒν•  경우, λ‹¨μ‹œκ°„ 내에 이λ₯Ό νŒŒμ•…ν•˜κ³  λ°”λ‘œ μž‘μ„ 수 μžˆλ„λ‘ ν•΄μ€€λ‹€. μ΄μƒμ μœΌλ‘œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” λΆ„λ¦¬λ˜μ–΄μ•Ό ν•œλ‹€. 이λ₯Ό μœ„ν•΄ κ°€μ§œ 객체(Mock object)λ₯Ό μƒμ„±ν•˜λŠ” 것도 쒋은 방법이닀. μœ λ‹› ν…ŒμŠ€νŠΈλŠ” 개발자 뿐만 μ•„λ‹ˆλΌ 보닀 더 μ‹¬λ„μžˆλŠ” ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ ν…ŒμŠ€ν„°μ— μ˜ν•΄ μˆ˜ν–‰λ˜κΈ°λ„ ν•œλ‹€. 

- μœ„ν‚€ λ°±κ³Ό - 

ν•˜λŠ” 이유

  • ν•΄λ‹Ή λΆ€λΆ„(ν•¨μˆ˜, λ©”μ„œλ“œ)에 λŒ€ν•΄μ„œ λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈλ₯Ό ν•˜κΈ° λ•Œλ¬Έμ— λΉ λ₯Έ λ¦¬νŒ©ν† λ§ 반영과 λΉ λ₯Έ ν…ŒμŠ€νŠΈλ₯Ό 진행할 수 μžˆλ‹€.
  • μ½”λ“œμ˜ ν™•μž₯μ΄λ‚˜ λ¦¬νŒ©ν† λ§ μ‹œμ—λ„ μ•ˆμ •μ„±μ„ ν™•λ³΄ν•œ μ±„λ‘œ λΉ λ₯΄κ²Œ λŒ€μ‘ν•  수 μžˆλ‹€.

방법

λŒ€μƒ νŒŒμ•…

  • 핡심 κΈ°λŠ₯ : λͺ¨λΈ 클래슀 및 λ©”μ„œλ“œ / μ»¨νŠΈλ‘€λŸ¬μ™€μ˜ μƒν˜Έμž‘μš©
  • κ°€μž₯ 일반적인 UI μ›Œν¬ ν”Œλ‘œ
  • 경계 쑰건
  • 버그 μˆ˜μ •

ν…ŒμŠ€νŠΈ κΈ°μ€€ (FIRST 원칙

효과적인 λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ κ°„κ²°ν•œ κΈ°μ€€ μ„ΈνŠΈ

  • Fast
    • ν…ŒμŠ€νŠΈκ°€ λΉ λ₯΄κ²Œ μ§„ν–‰λ˜μ–΄μ•Ό ν•œλ‹€.
    • μˆ˜λ§Žμ€ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν• ν…λ° ν•œ ν…ŒμŠ€νŠΈκ°€ 느리게 λ™μž‘ν•˜λ©΄ λ„ˆλ¬΄ μ˜€λž˜κ±Έλ¦°λ‹€.
  • Independent/Isolated
    • 각각의 ν…ŒμŠ€νŠΈλŠ” μ„œλ‘œ 독립적이며 μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆλœλ‹€. 
      • ν…ŒμŠ€νŠΈλŠ” μ„œλ‘œ μƒνƒœλ₯Ό κ³΅μœ ν•΄μ„œλŠ” μ•ˆλœλ‹€.
    • μ˜μ‘΄μ„±μ΄ λ†’μœΌλ©΄ ν…ŒμŠ€νŠΈμ˜ 원인을 μ°ΎκΈ° μ–΄λ €μ›Œμ§„λ‹€.
  • Repeatable
    • ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ λ™μΌν•œ κ²°κ³Όλ₯Ό μ–»μ–΄μ•Ό ν•œλ‹€.
    • ν†΅μ œν•˜κΈ° μ–΄λ €μš΄ 뢀뢄은 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ 객체λ₯Ό λ§Œλ“€μ–΄μ£ΌλŠ” 방법도 μžˆλ‹€.
    • μ™ΈλΆ€ 데이터 κ³΅κΈ‰μž λ˜λŠ” λ™μ‹œμ„± 문제둜 인해 간헐적인 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.
  • Self-validating
    • ν…ŒμŠ€νŠΈλŠ” μ™„μ „ μžλ™ν™”λ˜μ–΄μ•Ό ν•œλ‹€.
    • 좜λ ₯은 λ‘œκ·ΈνŒŒμΌμ— λŒ€ν•œ ν”„λ‘œκ·Έλž˜λ¨Έμ˜ 해석에 μ˜μ‘΄ν•˜μ§€ μ•Šκ³  “pass” λ˜λŠ” “fail’ μ—¬μ•Ό ν•œλ‹€.
  • Timely
    • μ΄μƒμ μœΌλ‘œλŠ” ν…ŒμŠ€νŠΈν•˜λŠ” ν”„λ‘œλ•μ…˜ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° 전에 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€. 이λ₯Ό ν…ŒμŠ€νŠΈ 주도 개발이라고 ν•œλ‹€. (TDD)
      • (이게 κ·Έ 유λͺ…ν•œ TDD?…)

 

 

 

πŸ€” Xcodeμ—μ„œμ˜ UnitTest

ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€ λ•Œ 보면 μ΄λ ‡κ²Œ includes Tests κ°€ μžˆλŠ”λ° 이걸 μ²΄ν¬ν•˜κ³  ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•˜λ©΄ μΆ”κ°€λ‘œ Tests 폴더가 더 생긴닀.

μƒμ„±λœ 것

  • (ν”„λ‘œμ νŠΈ λͺ…) + Tests
    • (ν”„λ‘œμ νŠΈ λͺ…) + Tests
  • (ν”„λ‘œμ νŠΈ λͺ…) + UITests
    • (ν”„λ‘œμ νŠΈ λͺ…) + UITests
    • (ν”„λ‘œμ νŠΈ λͺ…) + LaunchTests

μ‹€ν–‰

  • Build - cmd + B
  • Test - cmd + U

Testλ₯Ό μ‹œμž‘ν•˜λ©΄ 앱이 2κ°œκ°€ μ„€μΉ˜λœλ‹€.

μ²˜μŒμ—λŠ” 일반적인 Tests μ½”λ“œλ“€λΆ€ν„° μ§„ν–‰λ˜κ³  κ·Έλ‹€μŒμ—λŠ” UITestsλ₯Ό μ§„ν–‰ν•˜λŠ”λ° 이건 μ‹œκ°„μ΄ 였래 κ±Έλ¦°λ‹€.

그리고 UITestsκ°€ μ’…λ£Œλ˜λ©΄ 닀크 λͺ¨λ“œλ‘œ λ³€ν•œλ‹€ γ…Žγ…Ž;;

 

 

 

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

First Test μž‘μ„± 방법

  • ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œμ˜ 이름은 항상 test둜 μ‹œμž‘ν•˜κ³  κ·Έ 뒀에 ν…ŒμŠ€νŠΈ λŒ€μƒμ— λŒ€ν•œ μ„€λͺ…이 μ˜¨λ‹€.
  • given, when, then μ„Ήμ…˜μœΌλ‘œ λ‚˜λˆ„λŠ” ν˜•μ‹μ΄ μ’‹λ‹€.
    • given: ν•„μš”ν•œ 값을 μ„€μ •ν•œλ‹€. 그리고 μ˜ˆμƒ κ°’μ΄λž‘ 비ꡐ할 λ•Œ 쓰인닀.
    • when : ν…ŒμŠ€νŠΈ 쀑인 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μ„Ήμ…˜μ΄λ‹€.
    • then : ν…ŒμŠ€νŠΈκ°€ μ‹€νŒ¨ν•˜λ©΄ μΈμ‡„λ˜λŠ” λ©”μ‹œμ§€μ™€ ν•¨κ»˜ μ˜ˆμƒν•œ κ²°κ³Όλ₯Ό μ£Όμž₯ν•˜λŠ” μ„Ήμ…˜μ΄λ‹€.

예제

func testScoreIsComputedWhenGuessIsHigherThanTarget() {
  // given
  let guess = sut.targetValue + 5

  // when
  sut.check(guess: guess)

  // then
  XCTAssertEqual(sut.scoreRound, 95, "Score computed from guess is wrong")
}

 

 

ν…ŒμŠ€νŠΈ 디버깅

μ•±μ˜ λͺ©μ μ— 버그가 μžˆμ„ λ•Œ 그것을 μ°ΎλŠ” 방법을 μ•Œμ•„λ³΄μž.

쀑단점 νƒμƒ‰κΈ°μ—μ„œ ν…ŒμŠ€νŠΈ μ‹€νŒ¨ 쀑단점을 μΆ”κ°€ν•œλ‹€.

μ΄λ ‡κ²Œ ν•˜λ©΄ ν…ŒμŠ€νŠΈ λ©”μ„œλ“œκ°€ μ‹€νŒ¨λ₯Ό μ°Ύμ•˜μ„ λ•Œ ν…ŒμŠ€νŠΈ 싀행이 μ€‘μ§€λœλ‹€.

그러면 디버그 μ½˜μ†”μ„ κ²€μ‚¬ν–ˆμ„ λ•Œ μ–΄λ–€ 값이 λ¬Έμ œκ°€ μžˆλŠ”μ§€ 확인할 수 μžˆλ‹€.

 

 

XCTestExpectation을 μ‚¬μš©ν•˜μ—¬ 비동기 μž‘μ—… ν…ŒμŠ€νŠΈ

λͺ¨λΈμ„ ν…ŒμŠ€νŠΈν•˜κ³  ν…ŒμŠ€νŠΈ μ‹€νŒ¨λ₯Ό 디버그 ν•˜λŠ” 방법을 λ°°μ› μœΌλ―€λ‘œ 이제 비동기 μ½”λ“œ ν…ŒμŠ€νŠΈλ‘œ λ„˜μ–΄κ°ˆ 차둀이닀.

URLSessionλ©”μ„œλ“œλŠ” λΉ„λ™κΈ°μ‹μž…λ‹ˆλ‹€. μ¦‰μ‹œ λ°˜ν™˜λ˜μ§€λ§Œ λ‚˜μ€‘κΉŒμ§€ 싀행이 μ™„λ£Œλ˜μ§€ μ•ŠλŠ”λ‹€.

비동기식 λ©”μ„œλ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜λ €λ©΄ XCTestExpectationλ₯Ό μ‚¬μš©ν•΄μ„œ 비동기식 μž‘μ—…μ΄ μ™„λ£Œλ  λ•ŒκΉŒμ§€ ν…ŒμŠ€νŠΈλ₯Ό λŒ€κΈ°μ‹œμΌœμ•Ό ν•œλ‹€.

비동기 ν…ŒμŠ€νŠΈλŠ” 일반적으둜 λŠλ¦¬λ―€λ‘œ 더 λΉ λ₯Έ λ‹¨μœ„ ν…ŒμŠ€νŠΈμ™€ λ³„λ„λ‘œ μœ μ§€ν•΄μ•Ό ν•œλ‹€.

XCodeTest Method

  1. expectation(description:)
    • XCTestExpectation을 λ¦¬ν„΄ν•œλ‹€.
    • μ˜ˆμƒλ˜λŠ” κ²°κ³Ό 값을 description에 λ„£λŠ”λ‹€.
  2. promise.fulfill()
    • 비동기 λ©”μ„œλ“œ μ™„λ£Œ ν•Έλ“€λŸ¬μ˜ 성곡 쑰건 ν΄λ‘œμ €μ—μ„œ 이것을 ν˜ΈμΆœν•˜μ—¬ κΈ°λŒ€κ°€ μΆ©μ‘±λ˜μ—ˆμŒμ„ ν”Œλž˜κ·Έλ‘œ μ§€μ •ν•œλ‹€.
  3. wait(for:timeout:)
    • λͺ¨λ“  κΈ°λŒ€κ°€ μΆ©μ‘±λ˜κ±°λ‚˜ timeout λ˜μ–΄μ„œ 간격이 끝날 λ•ŒκΉŒμ§€ ν…ŒμŠ€νŠΈλ₯Ό 계속 μ‹€ν–‰ν•œλ‹€.

 

 

Failing Fast

μ‹€νŒ¨λŠ” μ•„ν”„μ§€λ§Œ μ˜μ›νžˆ 걸릴 ν•„μš”λŠ” μ—†λ‹€.

URL을 ν‹€λ € μΌλΆ€λ‘œ μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λ§Œλ“€μ–΄μ„œ ν…ŒμŠ€νŠΈν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄ 전체 μ‹œκ°„ μ΄ˆκ³Όκ°€ λ˜λŠ” 간격이 ꡬ해진닀. μ™œλƒν•˜λ©΄ 항상 성곡할 거라고 κ°€μ •ν–ˆκ³ , κ±°κΈ°μ„œ promise.fulfill()을 λΆˆλ €κΈ° λ•Œλ¬Έμ΄λ‹€.

requestκ°€ μ‹€νŒ¨λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 였직 μ œν•œμ‹œκ°„μ΄ λ§Œλ£Œλ˜μ—ˆμ„ λ•Œλ§Œ μ’…λ£Œκ°€ λœλ‹€.

가정을 λ³€κ²½ν•˜μ—¬ 이λ₯Ό κ°œμ„ ν•˜κ³  ν…ŒμŠ€νŠΈκ°€ 더 빨리 μ‹€νŒ¨ν•˜λ„λ‘ ν•  수 μžˆλ‹€.

requestκ°€ 성곡할 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” λŒ€μ‹  비동기 λ©”μ„œλ“œμ˜ μ™„λ£Œ μ²˜λ¦¬κΈ°κ°€ 호좜될 λ•ŒκΉŒμ§€ 기닀렀라..

μ΄λŠ” 앱이 μ„œλ²„λ‘œλΆ€ν„° 응닡(OK λ˜λŠ” 였λ₯˜)을 μˆ˜μ‹ ν•˜λŠ” μ¦‰μ‹œ λ°œμƒν•˜λ©°, μ΄λŠ” μ˜ˆμƒμ„ μΆ©μ‘±ν•œλ‹€.

그러면 ν…ŒμŠ€νŠΈμ—μ„œ μš”μ²­μ΄ μ„±κ³΅ν–ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό 확인할 수 μžˆλ‹€.

 

 

Failing Conditionally

μ–΄λ–€ μƒν™©μ—μ„œλŠ” ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜λŠ” 것이 μ˜λ―Έκ°€ μ—†λ‹€.

 

예λ₯Ό λ“€μ–΄, testValidApiCallGetsHTTPStatusCode200() λ„€νŠΈμ›Œν¬ μ—°κ²° 없이 μ‹€ν–‰ν•˜λ©΄ μ–΄λ–»κ²Œ 될까? 

λ¬Όλ‘  200 μƒνƒœ μ½”λ“œλ₯Ό 받지 λͺ»ν•˜κΈ° λ•Œλ¬Έμ— ν†΅κ³Όν•΄μ„œλŠ” μ•ˆ λœλ‹€. 

κ·ΈλŸ¬λ‚˜ 아무것도 ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ‹€νŒ¨ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

 

XCTSkipUnless(_:_:)λ₯Ό μ‚¬μš©ν•  λ•Œ λ„€νŠΈμ›Œν¬μ— μ—°κ²°ν•  수 μ—†μœΌλ©΄ ν…ŒμŠ€νŠΈλ₯Ό κ±΄λ„ˆλ›΄λ‹€.

λ„€νŠΈμ›Œν¬ 연결을 λΉ„ν™œμ„±ν™”ν•˜κ³  ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜μ—¬ 이λ₯Ό 확인해라.

ν…ŒμŠ€νŠΈ μ˜†μ— μžˆλŠ” 여백에 ν…ŒμŠ€νŠΈκ°€ ν†΅κ³Όν•˜κ±°λ‚˜ μ‹€νŒ¨ν•˜μ§€ μ•Šμ•˜μŒμ„ λ‚˜νƒ€λ‚΄λŠ” μƒˆ μ•„μ΄μ½˜μ΄ ν‘œμ‹œλœλ‹€.

 

Faking Objects and Interactions

비동기 ν…ŒμŠ€νŠΈλŠ” μ½”λ“œκ°€ 비동기 API에 λŒ€ν•œ μ˜¬λ°”λ₯Έ μž…λ ₯을 μƒμ„±ν•œλ‹€λŠ” 확신을 μ€€λ‹€.

URL μ„Έμ…˜μ—μ„œ μž…λ ₯을 받을 λ•Œ μ½”λ“œκ°€ μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•˜λŠ”μ§€, λ˜λŠ” UserDefaults λ°μ΄ν„°λ² μ΄μŠ€ λ˜λŠ” iCloud μ»¨ν…Œμ΄λ„ˆλ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ—…λ°μ΄νŠΈν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•  μˆ˜λ„ μžˆλ‹€.

λŒ€λΆ€λΆ„μ˜ 앱은 μ‚¬μš©μžκ°€ μ œμ–΄ν•  수 μ—†λŠ” μ‹œμŠ€ν…œ λ˜λŠ” 라이브러리 κ°œμ²΄μ™€ μƒν˜Έ μž‘μš©ν•œλ‹€. μ΄λŸ¬ν•œ κ°œμ²΄μ™€ μƒν˜Έ μž‘μš©ν•˜λŠ” ν…ŒμŠ€νŠΈλŠ” 느리고 λ°˜λ³΅ν•  수 μ—†μœΌλ©° 첫 번째 원칙 쀑 두 가지λ₯Ό μœ„λ°˜ν•  수 μžˆλ‹€. λŒ€μ‹  μŠ€ν…μ—μ„œ μž…λ ₯을 λ°›κ±°λ‚˜ λͺ¨μ˜ 개체λ₯Ό μ—…λ°μ΄νŠΈν•˜μ—¬ μƒν˜Έ μž‘μš©μ„ μœ„μ‘°ν•  수 μžˆλ‹€. 

μ½”λ“œκ°€ μ‹œμŠ€ν…œ λ˜λŠ” 라이브러리 κ°œμ²΄μ— μ’…μ†λ˜μ–΄ μžˆλŠ” 경우 κ°€μ§œλ₯Ό μ‚¬μš©ν•œλ‹€. κ·Έ 뢀뢄을 μ—°κΈ°ν•  κ°€μ§œ 객체λ₯Ό λ§Œλ“€κ³  이 κ°€μ§œλ₯Ό λ‹Ήμ‹ μ˜ μ½”λ“œμ— μ£Όμž…ν•¨μœΌλ‘œμ¨ 이것을 μˆ˜ν–‰ν•΄λΌ. John Reid의 Dependency Injection은 이λ₯Ό μœ„ν•œ λͺ‡ 가지 방법을 μ„€λͺ…ν•œλ‹€.

 

 

Faking Input From Stub

이 ν…ŒμŠ€νŠΈλŠ” 두 가지 μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

  1. κ°€μ§œ 데이터와 응닡을 μ„€μ •ν•˜κ³  κ°€μ§œ μ„Έμ…˜ 개체λ₯Ό λ§Œλ“ λ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ κ°€μ§œ μ„Έμ…˜μ„ sut의 μ†μ„±μœΌλ‘œ 앱에 μ£Όμž…ν•œλ‹€.
  2. μŠ€ν…μ΄ 비동기 λ©”μ„œλ“œλ‘œ κ°€μž₯ν•˜κΈ° λ•Œλ¬Έμ— μ—¬μ „νžˆ 비동기 ν…ŒμŠ€νŠΈλ‘œ μž‘μ„±ν•΄μ•Ό ν•œλ‹€. startNewRound(completion:)λ₯Ό ν˜ΈμΆœν•˜λ©΄ targetValue와 stubed κ°€μ§œ 번호λ₯Ό λΉ„κ΅ν•˜μ—¬ κ°€μ§œ 데이터λ₯Ό ꡬ문 λΆ„μ„ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.

ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. 그것은 μ‹€μ œ λ„€νŠΈμ›Œν¬ 연결이 μ—†κΈ° λ•Œλ¬Έμ— κ½€ 빨리 성곡할 것이닀!

 

 

Faking an Update to Mock Object

이전 ν…ŒμŠ€νŠΈμ—μ„œλŠ” μŠ€ν…μ„ μ‚¬μš©ν•˜μ—¬ κ°€μ§œ κ°œμ²΄λ‘œλΆ€ν„°μ˜ μž…λ ₯을 μ œκ³΅ν–ˆλ‹€.

그런 λ‹€μŒ Mock Objectλ₯Ό μ‚¬μš©ν•˜μ—¬ μ½”λ“œκ°€ μ‚¬μš©μž 기본값을 μ˜¬λ°”λ₯΄κ²Œ μ—…λ°μ΄νŠΈν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•œλ‹€.

 

 

UI Testing in Xcode

UI ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€μ™€μ˜ μƒν˜Έ μž‘μš©μ„ ν…ŒμŠ€νŠΈν•  수 μžˆλ‹€.

UI ν…ŒμŠ€νŠΈλŠ” 쿼리둜 μ•±μ˜ UI 개체λ₯Ό μ°Ύκ³  이벀트λ₯Ό ν•©μ„±ν•œ λ‹€μŒ ν•΄λ‹Ή κ°œμ²΄μ— 이벀트λ₯Ό λ³΄λ‚΄λŠ” λ°©μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€.

APIλ₯Ό μ‚¬μš©ν•˜λ©΄ UI 개체의 속성 및 μƒνƒœλ₯Ό κ²€μ‚¬ν•˜μ—¬ μ˜ˆμƒ μƒνƒœμ™€ 비ꡐ할 수 μžˆλ‹€.

tap() μ΄λ ‡κ²Œ ν•˜λ©΄ λΆ„ν• λœ 컨트둀의 각 λ²„νŠΌμ— μ˜¬λ°”λ₯Έ λ ˆμ΄λΈ”μ΄ μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜μ‹­μ‹œμ˜€. λͺ¨λ“  μ–΄μ„€μ…˜μ΄ 성곡해야 ν•œλ‹€.

 

 

Testing Performance

Apple λ¬Έμ„œ μ—μ„œ :

μ„±λŠ₯ ν…ŒμŠ€νŠΈλŠ” ν‰κ°€ν•˜λ €λŠ” μ½”λ“œ 블둝을 μ‚¬μš©ν•˜μ—¬ 10번 μ‹€ν–‰ν•˜μ—¬ 싀행에 λŒ€ν•œ 평균 μ‹€ν–‰ μ‹œκ°„κ³Ό ν‘œμ€€ 편차λ₯Ό μˆ˜μ§‘ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ°œλ³„ μΈ‘μ •κ°’μ˜ 평균은 ν…ŒμŠ€νŠΈ 싀행에 λŒ€ν•œ 값을 ν˜•μ„±ν•œ λ‹€μŒ κΈ°μ€€μ„ κ³Ό λΉ„κ΅ν•˜μ—¬ 성곡 λ˜λŠ” μ‹€νŒ¨λ₯Ό 평가할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ„±λŠ₯ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ” 것은 κ°„λ‹¨ν•˜λ‹€.

μΈ‘μ •ν•˜λ €λŠ” μ½”λ“œλ₯Ό measure()의 ν΄λ‘œμ €μ— λ°°μΉ˜ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€.
λ˜ν•œ μΈ‘μ •ν•  μ—¬λŸ¬ λ©”νŠΈλ¦­μ„ 지정할 수 μžˆλ‹€.

  • XCTClockMetric
    • κ²½κ³Ό μ‹œκ°„μ„ μΈ‘μ •ν•œλ‹€.
  • XCTCPUMetric
    • CPU μ‹œκ°„, μ£ΌκΈ° 및 λͺ…λ Ή 수λ₯Ό ν¬ν•¨ν•œ CPU ν™œλ™μ„ μΆ”μ ν•œλ‹€.
  • XCTStorageMetric
    • ν…ŒμŠ€νŠΈν•œ μ½”λ“œκ°€ μŠ€ν† λ¦¬μ§€μ— μ“°λŠ” λ°μ΄ν„°μ˜ 양을 μ•Œλ €μ€€λ‹€.
  • XCTMemoryMetric
    • μ‚¬μš©λœ 물리적 λ©”λͺ¨λ¦¬μ˜ 양을 μΆ”μ ν•œλ‹€.

ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•œ λ‹€μŒ ν›„ν–‰ ν΄λ‘œμ €μ˜ μ‹œμž‘ λΆ€λΆ„ μ˜†μ— λ‚˜νƒ€λ‚˜λŠ” μ•„μ΄μ½˜μ„ ν΄λ¦­ν•˜μ—¬ measure() 톡계λ₯Ό ν™•μΈν•œλ‹€. 

μΈ‘μ •ν•­λͺ© μ˜†μ— μžˆλŠ” μ„ νƒν•œ μΈ‘μ •ν•­λͺ©μ„ λ³€κ²½ν•  수 μžˆλ‹€.

 

 

 

πŸ™πŸ» Ref

https://www.raywenderlich.com/21020457-ios-unit-testing-and-ui-testing-tutorial#toc-anchor-011

 

iOS Unit Testing and UI Testing Tutorial

Learn how to add unit tests and UI tests to your iOS apps, and how you can check on your code coverage.

www.raywenderlich.com

https://yagom.net/courses/unit-test-μž‘μ„±ν•˜κΈ°/

 

Unit Test μž‘μ„±ν•˜κΈ° - μ•Όκ³°λ‹·λ„·

Unit Test μž‘μ„±ν•˜κΈ° ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ©΄ μ’‹λ‹€λŠ” 말을 많이 듀어보셨을 것 κ°™μŠ΅λ‹ˆλ‹€.  ν•˜μ§€λ§Œ 막상 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•΄λ³΄λ €κ³  […]

yagom.net