Test๋ผ๋ ๊ณผ์ ์ ์ฌ์ค ๊ณตํ ์ด๋์์๋ ๋ฑ์ฅํ๋ ๊ฐ๋ ์ด๋ค. ์์ ์ ์์กด๋๊ฐ ์๊ณ , ๋ณต์กํ ๊ณผ์ ์ผ๋ก ๋์ด๊ฐ ์๋ก ์ด์ ๋จ๊ณ์ ์ค๋ฅ๋ ์น๋ช ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด Test๋ผ ํ ์ ์๋ค. ์ํํธ์จ์ด์์ ์ญ์ ์ด๋ฌํ ๊ฐ๋ ์ด ์ ์ฉ๋๋ค. ์ด๋ค ๊ฒ์ธ์ง, ์ ํ์ํ์ง, ์ด๋ป๊ฒ ํ ์ ์๋์ง ์์๋ณด์.
Unit Test ์์
- URLRequest ์ค๋น
- Task ์์ฑ
- ์๋ฒ์ ํต์
- Response parsing
- View Update
์ผ๋ฐ์ ์ธ ์ด๋ฌํ ์๋๋ฆฌ์ค์์ Unit test๊ฐ ๊ฐ๋ฅํ ๋ชจ๋์ request๋ฅผ ์ค๋นํ๋ ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ response๋ฅผ ํ์ฑํ๋ ๊ณผ์ ์ด๋ค.
Integration Test์ ๊ฒฝ์ฐ, ์ผ๋ จ์ ๊ณผ์ ์ ํ๊บผ๋ฒ์ ํ์ธํ๋ ๊ฒ์ ๋งํ๋ค.
๋ง์ง๋ง์ผ๋ก End-to-End Test(UI Test)๋ ์ค์ UI๊น์ง ์ ์ฒด์ ์ผ๋ก ๋ณด๋ ๊ฒ์ ๋งํ๋ค.
์ ํ์ํ ๊น?
์ฌ๋์ ์ค์ํ๋๊น
- ์ฌ๋์ ์ค์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฒ๋ค
- Swift Compiler: Language Type์ ์ํด
- SwiftLint: Validation์ ์ํด
- Code Review: code quality๋ฅผ ์ํด
- Test: ์ ์ง๋ณด์๋ฅผ ์ํด
- ์๋ํ๋ Test์ ๊ฐ์
- ์์ค์ฝ๋์ ๊ธฐ๋ณธ ๋์ ๊ฒ์ฆ
- ๋ฆฌํฉํ ๋ง์ ์ ๋ฆฌ
- Usecase๋ฅผ ํ์ธํ ์ ์์ (Documentation ๋์ฒด)
- Interface ์ค๊ณ๋ฅผ ๊ฐ์ํจ
- Testability ํ๋ณดํ๊ธฐ ์ํด ์ค๊ณ๋ฅผ ๊ณ ๋ฏผํด์ผ ํจ
- ํ์ง๋ง 100% ๋ฒ๊ทธ ์๋ ์ฝ๋๋ฅผ ๋ณด์ฅํด์ฃผ์ง๋ ์๋๋ค. ๋ณด์ํ ๋ฟ.
XCTestCase
- ํ๋์ Test Target์ XCTestCase๋ฅผ ์์๋ฐ์ ์ฌ๋ฌ๊ฐ์ Test Class๊ฐ ์กด์ฌํ๋ค.
- Test Class ๋ณ ์ฌ๋ฌ Test Case method๊ฐ ์๋ค.
์ฒ์ Target์ ๋ง๋ค๊ณ ์ ์ฉํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ํด๋์ค๊ฐ ํ๋ ๋ง๋ค์ด์ง๋ค.
setUpWithError()
,tearDownWithError()
: ๊ฐ test case์คํ ์ ํ ๊ฐ๊ฐ ์คํ๋๋ค.setUpWithError()
โtestA()
โtearDownWithError()
setUpWithError()
์tearDownWithError()
๋ Xcode12์์ ์๋ก ์๊ฐ๋จ.- ๊ธฐ์กด ๋ฒ์ Xcode์์ ์ฌ์ฉํ๋
setUp()
,tearDown()
๋ ์ฌ์ฉ๊ฐ๋ฅ
test*()
: test ๋ก ์์ํ๋ ๋ฉ์๋๊ฐ test case๊ฐ ๋๋ค.- ํ๋์ Test Case์๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋์
XCTAssert*
๊ฐ ์กด์ฌํด์ผ ํ๋ค. XCTAssert*
๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ํด๋น Test case๋ ์ฑ๊ณต์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
- ํ๋์ Test Case์๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋์
@testable import
- import๋ ๋ชจ๋์ internal ์ ๊ทผ์ด ๊ฐ๋ฅํด ์ง๋ค. (์ผ๋ฐ์ ์ธ import์์๋ public ๋ง ๊ฐ๋ฅ)
- fileprivate, private ์ ์ฌ์ ํ ์ ๊ทผํ ์ ์๋ค.
Assertion
๋ชจ๋ Test case๋ ํน์ ์กฐ๊ฑด(condition)์ผ๋ก ์์ฝํ ์ ์๋ค.
๋ค์ํ Assertion
ํจ์๊ฐ ์กด์ฌํ๋ค. ์คํจ์ ์ด๋ค ์ด์ ๋ก ์คํจํ๋์ง ์ข๋ ๋ช
ํํ๊ฒ ์ ์ ์๋ค. ์ ์์์ฒ๋ผ message๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด๋ค.
category | function name |
---|---|
Equality | XCTAssertEqual , XCTAssertNotEqual |
Truthiness | XCTAssertTrue , XCTAssertFalse |
Nullability | XCTAssertNil , XCTAssertNotNil |
Comparison | XCTAssertLessThan , XCTAssertGreaterThan , |
XCTAssertLessThanOrEqual , XCTAssertGreaterThanOrEqual | |
Erroring | XCTAssertThrowsError , XCTAssertNoThrow |
Speacial | XCTFail : ํญ์ ์คํจ |
XCTUnwrap : expression์ด nil์ด๋ฉด ์คํจ, nil์ด ์๋๋ฉด unwrapped value ๋ฐํ |
์์ฑ ๋ฐฉ๋ฒ
- Given
- ์ด๋ ํ ์ํฉ์์
- When
- ์ด๋ค ํ๋์ ์ทจํ ๋
- Then
- Assertion
- ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ผ
Expectation
๋น๋๊ธฐ ๋์์ ํ ์คํธ ์์ฑ
ํน์ ํจ์ ์คํ์, global queue์์ ๋์ ์คํ ํ, main์์ ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋ค๊ณ ๊ฐ์ ํ completion code๋ฅผ ์คํ์ํจ๋ค๊ณ ์๊ฐํด๋ณด์. ์ด๋ป๊ฒ ํ ์คํธํ ์ ์์๊น?
์ด๋ ๊ฒ ์์ฑํ๋ค๋ฉด, ์คํจํ๋ค. @escaping closure
์ ์คํ ์์ ์ ํธ์ถ ์์ ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. completion์ด ํธ์ถ๋๊ธฐ ์ ํ
์คํธ๊ฐ ์ข
๋ฃ๋๋ค.
XCTestExpectation
XCTestExpectation
์ ์ฃผ์์ฌํ์ ์๋๋ฐ, ํ์ฌ์ ๊ฐ์ ํ๋ฆ์ผ๋ก ์ง๋ ๊ฒ์ด best practice์ด๋ค. ์ฆ, ๋น๋๊ธฐ task์์์ fullfill
ํธ์ถํ๊ณ , wait
๋ก ๊ธฐ๋ค๋ ค์ฃผ๊ณ , XCTAssert
๋ก error, condition ํ์ธํ๋ ์์๋ก ํ๋ ๊ฒ์ด ์ข๋ค.
๋ ์ํ์๊ฐ ์์ฒด๋ฅผ ํ ์คํธํ๋ ๋ชฉ์ ์ด๋ผ๋ฉด timeout์ test ์คํจ ์ ํธ๋ก ์ก๋ ๊ฒ์ ๊ด์ฐฎ์ง๋ง, ์ด ์์ฒด๋ฅผ ํด๋น test case์ ์คํจ ์ ํธ๋ก ์ก๋ ๊ฒ์ ์ข์ง ๋ชปํ๋ค. ํด๋น ํจ์๋ ํจ์์ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ๊ธฐ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
Other Expectations
XCTKVOExpectation
- Observingํ๋ keyPath์ ๊ฐ์ด
expectedValue
๊ฐ ๊ฐ์์ง ๊ฒฝ์ฐ - ๋ฑ๋กํ Handler๋ฅผ ๋ง์กฑํ๋ฉด ์๋์ผ๋ก fulfill
- Observingํ๋ keyPath์ ๊ฐ์ด
XCTNSPredicateExpectation
- Predicate ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ์๋์ผ๋ก fulfill
XCTNSNotificationExpectation
- ํน์ Notification์ด post๋๋ฉด ์๋์ผ๋ก fulfill
Test Double (๋์ญ)
์๋ํ๋ ํ ์คํธ์์ Production ๊ฐ์ฒด ๋์ ํ ์คํธ๋ฅผ ์ํด ๋ ๊ฐ๋จํ๊ฒ ๋์ํ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
์ด๋ฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ณต์ก๋๋ฅผ ์ค์ด๊ณ , ๋ ๋ฆฝ์ ์ผ๋ก ์ฝ๋ ๊ฒ์ฆ์ด ๊ฐ๋ฅํ๊ฒ ํ๋ค.
Fake
Production ์ฉ์ ์๋๋ ๋์์ด ๊ตฌํ๋ ๊ฐ์ฒด
๋ณดํต Production ์ฝ๋์ ๊ฐ๋ตํ๋ ๋ฒ์ ์ผ๋ก ๋์ด ์๋ค.
- In-memory๋ก ๊ตฌํํ database
- ์ค์ database์ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์, ์์ฒญ ์๋ต ์๊ฐ ๋ฑ์ ์ธ๋ถ์ ์์์ ์ํฅ ์์ด ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค.
Stub
๋ฏธ๋ฆฌ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๊ณ ์๋ค๊ฐ ํ ์คํธ ์ค ์์ฒญ์ ๋ฐ๋ผ ๊ทธ ๊ฐ์ ์๋ตํ๋ ๊ฐ์ฒด
์ค์ DB๋ ๋คํธ์ํฌ์ ์ ๊ทผํ์ง ์๊ณ , ์ํฉ์ ๋ง๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
Mock
์์ ๋ ์์ฒญ์ ๊ธฐ๋กํ๋ ๊ฐ์ฒด
Mock์ ์์๋ action์ด ์ํ๋์๋์ง ๊ฒ์ฆํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด ํจ์ ํธ์ถ์ count๋๋ flag๋ฅผ ๋ฌ์์, ํด๋น flag๊ฐ์ ํ์ธํ ๊ฒ.
์ค์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ซ๊ฑฐ๋ ์๋๋ ์ฝ๋๊ฐ ์ค์ ์ํ๋์๋์ง ๊ฒ์ฆํ ๋ ์ฌ์ฉํ๋ค. ์ค์ ์ด๋ฉ์ผ์ด ๋ฐ์ก๋์๋์ง ํ์ธํ๋ ๊ฒ์ ์ด๋ ต๊ธฐ ๋๋ฌธ์, ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋์๋์ง (count)ํ์ธํ๋ ์ ๋๋ก ์ฌ์ฉํ๋ค.
Command Query Separation
Logic๊ณผ Effect๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ตฌํํด์ผ ํ๋ค. (Bertrand Meyer โObject Oriented Software Constructionโ)
์์คํ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ method๋ฅผ Query๋ผ ํ๋ค. ํด๋น ๋ฉ์๋๋ ์ฌ์ด๋ ์ดํํธ๊ฐ ์์ด ๊ฐ์ ๋ฆฌํดํ๋ค. ์ด์ ๊ฐ์ Query ํํ์ ๋ฉ์๋๋ฅผ Stub์ ์ฌ์ฉํ์ฌ Test Doubleํ ์ ์๋ค. ์ฆ, ๊ฐ์ ๋ค๊ณ ์๋ค๊ฐ ์๋ตํ์ฌ testํ ์ ์๋ค.
Command๋ ์ด๋ค action์ ์ํํ์ฌ ์์คํ ์ ์ํ๋ฅผ ๋ฐ๊พธ๋ฉด์, ๊ฐ์ ๋ฆฌํดํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ์์ ์์์ ๊ฒฝ์ฐ ๋ฆฌํดํ์ง ์๊ณ , ์์คํ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ Mock์ ์ฌ์ฉํ์ฌ ํ ์คํธํ ์ ์๋ค.
Tips
-
์ด๊ธฐํ๋ฅผ ์ํ๋ค.
setUp()
,tearDown()
์์ ์ด๊ธฐํ๋ฅผ ์ํด์ฃผ์ด์ผ ํ๋ค.- class level์ ์ํ๋ ๊ณผ์ ์ค์ ๊ณ์ ์ ์ง๋๊ธฐ ๋๋ฌธ์ ์์น์์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ค.
- ์คํ ์์์ ์์กด์ ์ธ ๊ฒฝ์ฐ, ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์์ ์ ์๋ค. TC๋ ๋ ๋ฆฝ์ ์ด์ด์ผ ํ๋ค.
-
๋๋ฒ๊น ์ํ๊ธฐ
- Given์ ๊ฐ์ ์ ์ ํ์ธํ๋ค.
- Then์์ ์๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ ํํ ๋ฐ์ํ๊ณ ์๋์ง ํ์ธํ๋ค.
- Test BreakPointer Break poiunt๋ฅผ ๋ฌ ์ ์๋๋ฐ, ์ฌ๊ธฐ์ test Failure Breakpoint๋ฅผ ์ ํํ๋ค.
- ํ ์คํธ ์คํจ ์ง์ ์ ์๋์ผ๋ก breakpoint๋ฅผ ๊ฑธ์ด์ค๋ค.
-
์์ ํ ์คํธ (Pragmatic Programming)
- ๋๋ฒ๊น ํ๋ฉด์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค์ด์ ํด๋ณด๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- ์ด๋ฐ ๊ฒฝ์ฐ ์ ์ ํ ์คํธ ์ฝ๋๋ก ๋ง๋ค์ด ๋์ด์ผ ํ๋ค.
-
ํ ์คํธ ์ฝ๋ ์กฐ์งํ
- ์์
Test Target โฃ Cases โฃ Group 1 โฃ Tests 1 โฃ Tests 2 โฃ Group 2 โฃ Tests โฃ Mocks โฃ Helper Classes โฃ Helper Extension
-
Xcode
- ์คํ ์์ randomize ์ต์
์ด ์๋ค.
- Xcode > Edit Scheme > Test > Info > Options > Randomize execution order
- Code Coverage
- ํ ์คํธ ์ฝ๋๊ฐ ๊ฒ์ฆํ ์ฝ๋ ๋ฒ์๋ฅผ reporting ํด์ค๋ค.
- Xcode > Edit Scheme > Test > Optinos > Code Coverage
- ์คํ ์์ randomize ์ต์
์ด ์๋ค.