ํฐ์คํ ๋ฆฌ ๋ทฐ
๐น Unit Test(์ ๋ ํ ์คํธ)
๐ Unit Test(์ ๋ ํ ์คํธ)๋?
TDD๋ผ๋ ๋ง์ ๋ง์ด ์ฌ์ฉํ์ง๋ง ์ง๊ธ๊น์ง ํ ์คํธ ๋ค์ด ํ ์คํธ๋ฅผ ํด๋ณธ ์ ์ด ์์์ต๋๋ค. ํ์ง๋ง ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์์๋ถํฐ ํ ์คํธ๋ฅผ ๊ณ ๋ คํ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ค๊ณ ํ๊ณ , ๊ทธ์ ๋ฐ๋ผ Xcode์ Unit Test์ ๋ํด ํ์ตํ๊ฒ ๋์์ต๋๋ค. ์ฌ๊ธฐ์ ๋งํ๋ Unit Test๋ ๋ฌด์์ผ๊น์?
"์ ๋ ํ ์คํธ(unit test)๋ ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ์์ ์์ค ์ฝ๋์ ํน์ ๋ชจ๋์ด ์๋๋ ๋๋ก ์ ํํ ์๋ํ๋์ง ๊ฒ์ฆํ๋ ์ ์ฐจ๋ค. ์ฆ, ๋ชจ๋ ํจ์์ ๋ฉ์๋์ ๋ํ ํ ์คํธ ์ผ์ด์ค(Test case)๋ฅผ ์์ฑํ๋ ์ ์ฐจ๋ฅผ ๋งํ๋ค."
๊ธฐ์กด์๋ ์ฝ๋ฉ์ ํ๋ฉฐ ๊ฐ ๊ธฐ๋ฅ์ด ์ ๋์ํ๋์ง ํ์ธํด๋ณด๊ธฐ ์ํด ์์ฑ ํ ์๋์์ผ๋ณด๊ณ , ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด print()๋ฌธ์ ์ฌ์ฉํ์ฌ ํ๋ฆฐ ์ง์ ๋ค์ ์ถ์ ํด๋๊ฐ์ต๋๋ค. ์ด ๋ฐฉ์์ ๋น์ฐํ ๊ฐํธํ๊ณ ์ง๊ด์ ์ด์ง๋ง ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก, ํ๋ก๊ทธ๋จ์ ๋ณต์ก์ฑ์ด ๋์ด๋ ์๋ก ์ฌ์ฉํ๊ธฐ ํ๋ ๋ฐฉ์์ ๋๋ค. ๊ทธ๋์ ์ ๋ ํ ์คํธ๋ผ๋ ์ ๋ ๋จ์์ ํ ์คํธ, ์ฆ ํ๋์ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์๋๋ผ ์์ ๊ธฐ๋ฅ ๋จ์์ ํ ์คํธ๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์คํํด๋ณผ ํ์๊ฐ ์๊ณ , ์ด๋ฅผ Xcode์์๋ Unit Test ๊ธฐ๋ฅ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
๐ป ์ด๋ฏธ ์กด์ฌํ๋ Xcode ํ๋ก์ ํธ์ Unit Test ๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
๋ง์ฝ ์๋กญ๊ฒ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๋จ๊ณ๋ผ๋ฉด ์๋์ ๊ฐ์ด ์ต์ ์ ์ฒดํฌํ์ฌ ๊ฐ๋จํ ์ ๋ ํ ์คํธ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ด๋ฏธ ์์ฑ๋ ํ๋ก์ ํธ๋ผ๊ณ Unit Test๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ฒ์ ์๋๋๋ค! ์ฐ์ ์๋์ ๊ฒฝ๋ก๋ก ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
File -> New -> Target -> Unit Testing Bundle
์์์ Next๋ฅผ ํด๋ฆญํ๋ฉด ์๋์ ๊ฐ์ด ์ค์ ํ๋ฉด์ด ๋์ค๊ณ ์ฌ๊ธฐ์์ Finish๋ฅผ ๋๋ฌ์ฃผ๋ฉด ํ ์คํธ์ฉ ์๋ก์ด ํด๋๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.
์ด์ ํ ์คํธํ์ผ ์์ ์๋์ผ๋ก ์์ฑ๋ ๋ฉ์๋๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐ ํ ์คํธ ํ์ผ ์์ ์๋ ์์ฑ ๋ฉ์๋
setUp()
override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. }
์น์ ํ๊ฒ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ์ ๋ฉ์๋ ์ญํ ์ด ์ ํ์์ต๋๋ค. override๋๊ณ ์๋ ๊ฒ์ ๋ณด๋ ์ฐ์ ํด๋น ํด๋์ค์ ์ํผํด๋์ค์ธ XCTestCase์์ ์ด๋ฏธ ์ ์๋์ด์๋ ๋ฉ์๋์์ ์ ์ ์์ต๋๋ค.
ํด์ํด๋ณด๋ฉด setUpWithError์ ์ญํ ์ ์๋์ ๊ฐ์ต๋๋ค.
์ด ๋ฉ์๋๋ ์ด ํ ์คํธ ํด๋์ค ๋ด๋ถ์ ์๋ ๊ฐ๊ฐ์ ํ ์คํธ ๋ฉ์๋๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ ์ ํธ์ถ๋ฉ๋๋ค.
๋ค์๋งํ๋ฉด, ํ ์คํธ ๋ฉ์๋๋ค์ด ํธ์ถ๋๊ธฐ ์ ์ํ๋ฅผ ์ฌ์ค์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ํ ์คํธ๋ฅผ ์ํ ํ๊ฒฝ ์ด๊ธฐํ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
tearDown()
override func tearDownWithError() throws { // Put teardown code here. This method is called after the invocation of each test method in the class. }
setUpWithError()๋ฉ์๋์ ๋ค๋ฅธ ์ ์ ๋จ ํ๋, ํ ์คํธ ๋ฉ์๋๋ค์ด ์คํ๋ ํ ๋ถ๋ฌ์ง๋ ๋ฉ์๋์ ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ์ด '๋ฉ์๋๋ค์ด ์คํ๋ ํ'๋ผ๋ ์กฐ๊ฑด์ด ์๋ฏธ์ ๋๋ค. ์ค์์ ์ผ๋ก ํด์๋ ์ฌ์ง๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๋ชจ๋ ํ ์คํธ ์ผ์ด์ค๋ค์ ์คํํ ํ ๋ง์ง๋ง์ ํ ๋ฒ ์คํ๋๋ ๋ฉ์๋
- ๊ฐ๊ฐ์ ํ ์คํธ์ผ์ด์ค๋ค์ด ๋๋ ๋๋ง๋ค ์คํ๋๋ ๋ฉ์๋
setUp ๋ฉ์๋์ฒ๋ผ tearDown ์ญ์ ๊ฐ๊ฐ์ ํ ์คํธ ๋ฉ์๋๊ฐ ์ข ๋ฃ๋ ํ ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋๋ ๋ฉ์๋์ ๋๋ค.
์๋ฅผ ๋ค์ด, Mock ๊ฐ์ฒด๊ฐ ์์ ๋ ํ๋์ ํ ์คํธ๊ฐ Mock์ ์ํ ๋ณํ๋ฅผ ์ผ์ผ์ผ ๋ค๋ฅธ ํ ์คํธ ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ์ํฉ์ด ์์ ์ ์์ต๋๋ค. ์์ ๋ ๋ฉ์๋๋ ๊ฐ๊ฐ์ ํ ์คํธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ํ๋ ์ ์๊ฒ ๋์์ค๋๋ค.
testExample(), testPerformanceExample()
func testExample() throws { // This is an example of a functional test case. // Use XCTAssert and related functions to verify your tests produce the correct results. } func testPerformanceExample() throws { // This is an example of a performance test case. measure { // Put the code you want to measure the time of here. } }
์ด๋ฆ ๊ทธ๋๋ก, ๋ ๋ฉ์๋๋ Example(์์)์ ๋๋ค. ์์ ๋ฉ์๋๋ ํ ์คํธ ๋ฉ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์์ด๊ณ , ์๋ ๋ฉ์๋๋ Performance ๋ฉ์๋์ด๋ฏ๋ก measure์ด๋ผ๋ ๋ฉ์๋๊ฐ ์์ต๋๋ค. ํ๋ผ๋ฏธํฐ๊ฐ Closure Trailing์ผ๋ก ๋์ด์์ด์ ํท๊ฐ๋ฆด ์ ์์ต๋๋ค.
๐ Test Assertions
Test Assertions์ ์๋ฏธ๋ฅผ ์๊ธฐ ์ํด assert ๋ผ๋ ๋จ์ด ๋ป์ ์ฌ์ ์์ ์ฐพ์๋ณด๊ฒ ์ต๋๋ค.
.[assert๏ผใ๋ชฉใ/assert๏ผthat์ ] โฆ์ ์ฃผ์ฅํ๋ค,๋จ์ธ[์ญ์ค]ํ๋ค, ์ฐ๊ธฐ๋ค; [assert๏ผใ๋ชฉใ๏ผ(to be)ใ๋ณดใ] โฆ์ด ๏ผโฆ์ด๋ผ๊ณ ๏ผ ๋จ์ธํ๋ค
์ข ํฉํด๋ณด๋ฉด, Test Assertions๋ 'ํ ์คํธ ์ฃผ์ฅ'(?) ์ด๋ผ๋ ์๊ธฐ ์ด๋ ค์ด ์๋ฏธ๊ฐ ๋ฉ๋๋ค. ๊ตณ์ด ์ถ๊ฐํ๋ค๋ฉด 'ํ ์คํธ ์ฃผ์ฅ๋ฌธ' ์ ๋๊ฐ ๋ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฐ ๋ช ๋ช ์ด ๋ถ์ ์ด์ ๋ ์ฌ๊ธฐ์ ์ํ ๋๊ตฌ๋ค์ ํ์ธํด๋ณด๋ฉด ์๊ธฐ ์ฝ์ต๋๋ค.
Assertions์ ์ข ๋ฅ๋ ์๋์ ๊ฐ์ต๋๋ค. ์ ์๋ ์ ํ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ต๋๋ค.
Boolean Assertions: ์กฐ๊ฑด์ด ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง๋ฅผ ํ ์คํธํฉ๋๋ค(Test a condition that generates a true or false result).
- XCTAssert()
- XCTAssertTrue() -> XCTAssert()์ ๊ฑฐ์ ๊ฐ์
- XCTAssertFalse()
Nil and Non-Nil Assertions: ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ ๊ฐ๋์ง ์๊ฐ๋์ง๋ฅผ ํ ์คํธํฉ๋๋ค(Check whether a test condition has, or doesnโt have, a value). ๋ค์๋งํ๋ฉด Nil์ธ์ง๋ฅผ ํ์ธํฉ๋๋ค.
- XCTAssertNil()
- XCTAssertNotNil()
- XCTUnwrap()
Equality and Inequality Assertions: ๋๊ฐ์ ๊ฐ์ด ๊ฐ์์ง ๋ค๋ฅธ์ง๋ฅผ ํ๋จํฉ๋๋ค(Check whether two values are equal or unequal.).
- XCTAssertEqual()
- XCTAssertNotEqual()
- XCTAssertIdentical()
- XCTAssertNotIdentical()
- ...
Comparable Value Assertions: ๊ฐ์ ๋น๊ตํ์ฌ ์ด๋ค ํ๋์ ๊ฐ์ด ๋๋จธ์ง๋ณด๋ค ๋ ํฐ์ง ์์์ง๋ฅผ ํ๋จํฉ๋๋ค(Compare two values to determine whether one is larger or smaller than the other).
- XCTAssertGreaterThan()
- XCTAssertGreaterThanOrEqual()
- XCTAssertLessThan()
- XCTAssertLessThanOrEqual()
Error Assertions: ํจ์๊ฐ error๋ฅผ ๋์ง๋์ง ์๋์ง๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค(Check whether a function call throws, or doesnโt throw, an error).
- XCTAssertThrowsError()
- XCTAssertNoThrow()
Unconditional Test Failures: ๋ฌด์กฐ๊ฑด ์ฆ์ ์คํจํ๊ฒ ๋ง๋ญ๋๋ค(Generate a failure immediately and unconditionally).
- XCFail()
Expected Failures: failing test๊ฐ ์์ ์ ์ํฅ์ ๋ฏธ์น์ง ์๊ฒํ๊ธฐ ์ํด ํ ์คํธ ์คํจ๋ฅผ ๋ฏธ๋ฆฌ ์์ํฉ๋๋ค. ์ฆ, ๋ก์ง์ ๋น์ฐํ ์์ง์ ์คํจํด์ผํ ์์ ์ ๋ํ ์ค์ ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
- XCTExpectFailure()
Methods for Skipping Tests: ํน์ ์กฐ๊ฑด์ ์ง์ ํ๊ธฐ ์ํด ํ ์คํธ๋ฅผ ์คํตํฉ๋๋ค(Skip tests when meeting specified conditions).
- XCTSkipIf()
- XCTSkipUnless()
'iOS ์ฑ๊ฐ๋ฐ > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- ์์ด์ฌ์ดํด#BOJ#Python
- django#slicing
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
- Distinct#Codility#Python
- PassingCars#Codility#Python
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- Swift#Tuples#Range
- ์ํธ์ฝ๋#dp#BOJ#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
- django
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
- Triangle#Sorting#Codility#Python
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- API#lazy#
- Brackets#Stacks and Queues#Codility#Python
- NumberofDiscIntersections#Codility#Sort#Python
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- filter#isalnum#lower
- N์ผ๋ก ํํ#DP#Programmers#Python
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |