๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IOS๐ŸŽ/iOS+Swift

[iOS] Swift Unit Test ์‚ดํŽด๋ณด๊ธฐ

by Jouureee 2022. 4. 7.

Unit Test๋ž€ ?

๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํŠน์ • ๊ธฐ๋Šฅ์ด ์˜๋„ํ•œ๋Œ€๋กœ ์ž˜ ์ž‘๋™๋˜๋Š”์ง€ ์ ๊ฒ€ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งํ•œ๋‹ค. ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ๊ฐ€๋Šฅ์„ฑ์„ ๋‚ฎ์ถ”๊ณ  ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

Xcode์—์„œ "Include Test"๋ฅผ ์„ ํƒํ•˜๋ฉด 

ํ”„๋กœ์ ํŠธ์ด๋ฆ„-Test, ํ”„๋กœ์ ํŠธ์ด๋ฆ„-UITest ๋‘๊ฐœ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

๋งŒ์•ฝ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธ ํ•  ์ƒ๊ฐ์ด ์—†์–ด "Include Test" ์ฒดํฌํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด ?

์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ Xcode Test Navigator ํƒญ์„ ํด๋ฆญํ•˜๊ณ  unit test target์„ ํด๋ฆญํ•˜๋ฉด ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. 

 

์–ด์จŒ๋“  ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

XCTestCase๋ฅผ ์ƒ์† ๋ฐ›๊ณ  ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค, ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ํด๋ž˜์Šค๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋ ๊ฑฐ ๊ฐ™๋‹ค.

 

๋˜ํ•œ ํŒŒ์ผ ์•„๋ž˜

setUpWithError,

tearDownWithError,

testExample,

testPerformanceExample

4๊ฐ€์ง€ ํ•จ์ˆ˜๊ฐ€ ์ œ๊ณต๋œ๋‹ค. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž

 

1. setUp

์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ ํด๋ž˜์Šค์˜ ๊ฐ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์ „์— ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜

setUp() async throws , setUpWithError(), setUp()๊ฐ€ ์žˆ๋‹ค. ์ด ์…‹์ด ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ ๋” ์ฐพ์•„๋ณด๋‹ˆ

ํ .. ๋ฌด์Šจ ์ฐจ์ด์ธ์ง€ ์•„์ง์€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค ...

ํ•˜์ง€๋งŒ 

https://developer.apple.com/documentation/xctest/xctestcase/set_up_and_tear_down_state_in_your_tests

 

Apple Developer Documentation

 

developer.apple.com

๊ธ€์„ ์ฐธ๊ณ ํ•˜๋‹ˆ ์ฐจ์ด์ ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

1) setUp() async throw๋Š” ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•จ, 2) setUpWithError()๋Š” ๋™๊ธฐ์  ์ฒ˜๋ฆฌ + ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ™์ด ํ•˜๊ธฐ ์œ„ํ•จ, 3) setUp()์€ ๋™๊ธฐ์  ์ฒ˜๋ฆฌ(์—๋Ÿฌ ํ•ธ๋“ค๋ง x)์šฉ์œผ๋กœ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 

async๋Š” WWDC 2021์— ์ƒˆ๋กญ๊ฒŒ ์†Œ๊ฐœ๋œ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ์•„์ง ๊ณต๋ถ€ ์ค‘์ธ๋ฐ ๋” ๊ณต๋ถ€ํ•˜๊ณ  ๊ธ€์„ ์จ๋ด์•ผ ํ• ๊ฑฐ ๊ฐ™๋‹ค.

์ฐธ๊ณ  : https://developer.apple.com/videos/play/wwdc2021/10132/

 

 

2. tearDown

ํ•ด์ฒด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ํ›„์— ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜

๋งŒ์•ฝ ์‚ฌ์šฉ์ž ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ์‹œ tearDown() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

tearDown(), tearDownWithError(), tearDown()

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ

1) tearDown() : ๋™๊ธฐ์  ์ฒ˜๋ฆฌ

2) tearDownWithError() : ๋™๊ธฐ + ์—๋Ÿฌ ํ•ธ๋“ค๋ง

3) tearDown() : ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ

๋งŒ์•ฝ ์‚ฌ์šฉ์ž ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„ ์ฆ‰์‹œ tearDown() ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

trearDown block ํ˜•์‹์œผ๋กœ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. block์€ last-in, first-out ๊ตฌ์กฐ๋กœ ๋งˆ์ง€๋ง‰์— ์ž‘์„ฑ๋œ ๋ธ”๋Ÿญ ๋จผ์ € ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ๋œ๋‹ค.

์‚ฌ์šฉ์ž ํ•จ์ˆ˜์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ, tearDown() ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ block์ด ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

3. ์‚ฌ์šฉ์ž ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ : testExample()

test.swift ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ๋„ฃ์–ด ํ…Œ์ŠคํŠธ ํ•œ๋‹ค.

testPerformanceExample() ํ•จ์ˆ˜๋Š” ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ์ฝ”๋“œ๋‹ค.

 


ํŒŒ์ผ์˜ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด์•˜๊ณ  ์ด์ œ ์‹ค์ œ ์ ์šฉํ•œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด์ž

์šฐ์„  ๊ฐ ํด๋ž˜์Šค๋“ค์„ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ์—ˆ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ DummyRepository๋ฅผ ๋”ฐ๋กœ ์„ค์ •ํ•ด ์ฃผ์—ˆ๋‹ค.

<DummyCovidRepository.swift>

๋‹ค์‹œ DataViewModelTests.swift ํŒŒ์ผ๋กœ ๋Œ์•„์™€์„œ 

error๊ฐ’์˜ nil์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์ธํ•ด์ค€๋‹ค.

unit test๋ฅผ ์œ„ํ•œ numble, quick ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์žˆ๋‹ค ํ•˜๋˜๋ฐ 

ํ”„๋กœ์ ํŠธ๊ฐ€ ์›Œ๋‚™ ๊ฐ„๋‹จํ•ด์„œ ์ ์šฉํ•˜์งˆ ๋ชปํ–ˆ๋‹ค (๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด 3๊ฐœ๋ฟ .. ) ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ๋‹ค์‹œ ์ ์šฉํ•ด๋ณผ ์ƒ๊ฐ์ด๊ณ 

async, await (concurrency)๋„ ๋‹ค์‹œ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค. ์ด์ƒ ๋๋

๋Œ“๊ธ€