๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS/๐Ÿ“– Docs

[iOS]Unit Test์˜ ์‚ฌ์šฉ

by MINT09 2024. 2. 5.

์ด๋ฒˆ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ํ•„์š”์„ฑ์„ ์ ˆ์‹คํžˆ ๋А๊ผˆ๋˜ ๊ฒƒ์ด ๋ฐ”๋กœ ์ด test์˜€๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„, ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•˜๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ์‹ถ์€ ๊ทธ ๋งˆ์Œ..!! ๊ทธ๋Ÿฐ๋ฐ ๋งˆ์นจ ํ™œ๋™ํ•™์Šต์—์„œ Unit Test์™€ TDD๊ฐ€ ๋‚˜์™”๊ธธ๋ž˜, ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. 

Unit Test

Unit Test๋Š” ๋ฉ”์„œ๋“œ๋ณ„ ๊ธฐ๋Šฅ์ด ์˜๋„ํ•œ ๋Œ€๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์†Œ์Šค ์ฝ”๋“œ์˜ ํŠน์ • ๋ชจ๋“ˆ์ด ์˜๋„๋œ๋Œ€๋กœ ์ •ํ™•ํžˆ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋ถ€์—ฌํ•œ๋‹ค. 

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค Test๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ• ๊นŒ?

FIRST ์›์น™

Fast ๋น ๋ฅด๊ฒŒ

Independent / Isolated ๋…๋ฆฝ์ ์œผ๋กœ

Repeatable ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ

Self-Validating ์Šค์Šค๋กœ ๊ฒ€์ฆํ•˜๋Š”

Timely ์ ์‹œ์—

F. ํ…Œ์ŠคํŠธ๋ผ๋Š” ๋ชฉ์ ์— ๋งž๊ฒŒ ๋น ๋ฅด๊ฒŒ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋“ค์ด์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

I. A ํ…Œ์ŠคํŠธ๊ฐ€ B๋‚˜ C ํ…Œ์ŠคํŠธ์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

R. ์–ด๋–ค ์ƒํ™ฉ์— ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋”๋ผ๋„, ์‹คํ–‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. (๋„คํŠธ์›Œํฌ -> Mock ๊ฐ์ฒด)

S. ํ…Œ์ŠคํŠธ ๋‚ด๋ถ€์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค. (์ฆ‰, ํŒ๋ณ„ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๊ฐ€ ์ „๋ถ€ ํ…Œ์ŠคํŠธ ๋‚ด๋ถ€์— ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.)

T. ์ฝ”๋“œ ์ž‘์„ฑ ์ง์ „์— ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. (TDD)

์œ„์™€ ๊ฐ™์€ FIRST ์›์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค. ๋‹ค๋งŒ ์ด์ค‘์—์„œ TDD๋Š” Test-Driven Development๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ์ด์•ผ๊ธฐํ•œ๋‹ค. ๋”ฐ๋กœ ๋ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๋“ฏ ํ•˜๋‹ค. 

Xcode์—์„œ

1. import

import XCTest
@testable import (ํ…Œ์ŠคํŠธ ํ•˜๊ณ  ์‹ถ์€ ํ”„๋กœ์ ํŠธ)

2. test Class

class Tests: XCTestCase {
	var sut: (Testํ•˜๊ณ  ์‹ถ์€ ๊ฐ์ฒด)!
}

:sut๋ž€ System Under Test์˜ ์•ฝ์ž๋กœ ์‹คํ–‰์ค‘์ธ ์‹œ์Šคํ…œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. 

: ์™œ ๊ฐ•์ œ ์–ธ๋ž˜ํ•‘์„ ํ• ๊นŒ? _ FIRST์˜ F์— ๋”ฐ๋ผ, ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ. + ๊ธฐ๋Šฅ์— ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

3. ํ™˜๊ฒฝ์„ค์ •

//์ดˆ๊ธฐ ์‹คํ–‰ ํ™˜๊ฒฝ ์„ธํŒ….
//ํ…Œ์ŠคํŠธ๊ฐ€ ๋™์ผํ•œ ์กฐ๊ฑด, ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค. 
override func setUpWithError() throws {
    sut = LinkedList()
}
//์„ธํŒ…๋œ ์‹คํ–‰ ํ™˜๊ฒฝ ์ œ๊ฑฐ
//์ดˆ๊ธฐํ™”
override func tearDownWithError() throws {
    sut = nil
}

4. test

func test_์ด๋ ‡๊ฒŒ_๊ฐ€๋Šฅํ•œ์ง€() {
//given
์‚ฌ์šฉํ•  ๊ฐ’
//when
ํ…Œ์ŠคํŠธ
//then
๊ฒฐ๊ณผ
}

์ˆœ์„œ

  1. setUpWithError: ์ดˆ๊ธฐ ์‹คํ–‰ํ™˜๊ฒฝ ์„ธํŒ…
  2. func test : ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์‹คํ–‰
  3. tearDownWithError: ์‹คํ–‰ ํ™˜๊ฒฝ ์ดˆ๊ธฐํ™”

→ ์ด๋ ‡๊ฒŒ 1,2,3์ด ๋ฐ˜๋ณต๋˜๋Š”๋ฐ, 2๋Š” ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ๋ฐ”๋€Œ๋ฉด์„œ ์‹คํ–‰๋œ๋‹ค.

→ ๋ธŒ๋ ˆ์ดํฌ ํฌ์ธํŠธ๋กœ ์ฐ์–ด๋ณด๋ฉด์„œ ํ™•์ธํ•ด๋ณด๋ฉด ๋” ํ™•์‹คํ•˜๊ฒŒ ๋ณด์ธ๋‹ค!

 

๋ฌผ๋ก  ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ค๊ณ  ์–ด๋ ต๊ฒ ์ง€๋งŒ ์•ž์œผ๋กœ๋Š” ์ตœ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ์— Unit Test๋ฅผ ํ™œ์šฉํ•ด์•ผ๊ฒ ๋‹ค. ๋ฐ˜์„ฑ, ๋ฐ˜์„ฑ.

'๐ŸŽ iOS > ๐Ÿ“– Docs' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[SwiftUI] InteractiveUI (Gesture, Animation, Transition)  (0) 2025.04.21
[๋””์ž์ธ ํŒจํ„ด]Observer Pattern  (1) 2024.01.27