-
[iOS] Unit Test에 대해 간단하게 알아보자iOS/iOS 2020. 9. 25. 16:15
안녕하세요 :)
오늘은 Unit Test에 대해 간단하게 알아보겠습니다.
Unit Test란?
유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확하게 작동되는지 검증하는 절차입니다.
즉, 모든 함수와 메서드에 대한 테스트 케이스를 작성하는 절차를 말합니다.
유닛 테스트의 목적은 프로그램의 각 부분이 정확하게 동작하는지 확인하는 것입니다.
프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하고 문제 발생 시 정확하게 어느 부분이 잘못되었는지를 빠르게 확인할 수 있게 해 줍니다.
따라서 유닛 테스트를 하게 되면 프로그램의 안정성이 높아집니다.
위키백과에서 유닛 테스트를 위와 같이 말하고 있는데요.
저는 간단하게 "기능이 개발자의 의도에 맞게 동작하는지 테스트한다."라고 이해했습니다.
개발을 할 때 테스팅을 하는 습관을 들이면 좋다는 말을 들어보셨을 텐데요.
XCode에서 간단한 Unit Test를 진행해보겠습니다.
XCode 초기 설정
XCode에서는 프로젝트 생성 시에 하단의 Include Tests를 체크하고 생성하게 되면 자동으로 기본 테스트 코드들을 만들어줍니다.
저는 위와 같이 테스트 코드들이 만들어졌습니다.
LeapTests.swift를 들어가 보면 아래와 같은 코드들이 자동으로 생성되어있습니다.testExample(), testPerformanceExample()와 같은 함수들은 직관적으로 예제를 테스팅하는 함수라고 이해하실 수 있을 것입니다.
그러면 setUpWithError()과 tearDownWithError()는 무엇일까요?
위의 설명들을 간단하게 해석해보면 setUpWithError()는 reset state and throw errors라는 것을 보니 상태를 초기화해주고 에러를 던져주는 함수인 것 같아요.
또 before calling each test method라는 것을 보니 테스트 케이스의 첫 번째 테스트가 실행되기 전에 한 번 호출된다는 것을 알 수 있네요.
tearDownWithError()는 perform cleanup and throw errors라는 것을 보니 기능을 제거하고 에러를 던져주는 함수인 것 같죠?
또 after each test method라는 것을 보니 테스트 케이스가 끝날 때 한 번 호출되는 것을 알 수 있습니다.
즉, setUPWithError()과 tearDownWithError()는 테스트 코드를 깨끗하고 유연하게 유지하는 데 도움이 되는 메서드입니다.
간단하게 setUpWithError()는 초기화, tearDownWithError()는 해체 기능을 하는 함수라고 이해했습니다.
보통 setUp에는 인스턴스 만들기, db 초기화 등을 수행하고, tearDown에는 테스트가 진행되었던 초기 상태로 복원하는 일 (파일 닫기, 연결, 테스트에서 새롭게 만든 항목들 제거)을 수행한다고 합니다!
Unit Test 맛보기
그럼 간단한 테스트를 해보겠습니다.
제가 곧 캘린더를 구현해야 하기 때문에 윤년을 테스트하는 Leap 프로젝트를 만들겠습니다.
func testVanillaLeapYear() { let year = Year(calendarYear: 1996) XCTAssertTrue(year.isLeapYear) } func testAnyOldYear() { let year = Year(calendarYear: 1997) XCTAssertTrue(!year.isLeapYear) } func testCentury() { let year = Year(calendarYear: 1900) XCTAssertTrue(!year.isLeapYear) } func testExceptionalCentury() { let year = Year(calendarYear: 2400) XCTAssertTrue(year.isLeapYear) }
테스트 파일에 위의 코드들을 작성해주었습니다.
이렇게 추가해주면
함수들 옆에 작은 마름모 버튼이 생기는데 저게 바로 테스트 버튼입니다!
그리고 아직 Year 구조체를 만들어주지 않았기 때문에 오류도 뜰 건데요.
그럼 이제 Year.swift 파일을 프로젝트에 만들어주고 코드를 구현해보겠습니다.
import Foundation struct Year { let calendarYear: Int var isLeapYear: Bool { get { return calendarYear % 4 == 0 && ( calendarYear % 100 != 0 || calendarYear % 400 == 0 ) } } }
위와 같이 간단하게 윤년을 비교하는 부분만 추가해주었습니다.
윤년은 4와 400의 배수이되 100의 배수가 아닌 년도를 윤년이라고 하는데요.
간단하게 400과 4로 나누어 떨어지는 해는 윤년이고, 100으로 나누어 떨어지지는 않지만 4로 나누어 떨어지는 해도 윤년입니다.
그래서 위와 같이 return 부분을 만들어주었습니다.
그러면 이제 아까 함수 옆의 마름모 부분을 체크해주면 테스트가 진행될 겁니다!
자 이렇게 초록색으로 색칠되고 체크 표시가 뜨면 테스트가 통과되었다는 뜻입니다.
테스트에 실패했을 때는 빨간색으로 색칠되고 엑스 표시가 뜨는데요.
XCTAssertTure는 안의 매개변수가 True면 테스트 통과, False면 테스트 실패가 되는 함수인 것 같아요!
그래서 1900년도는 윤년이 아니기 때문에 앞의 부정을 뜻하는 '!'를 붙여주지 않아서 False가 반환되었습니다.
마무리
간단하게 Unit Test에 대해 알아보았는데요.
기능들이 잘 작동되는지 확인할 때 아주 유용할 것 같습니다!
앞으로라도 테스트하는 습관을 들여야겠어요 :)
오늘도 포스팅 봐주셔서 감사합니다! 🤗
참고 : http://zeddios.tistory.com/48
'iOS > iOS' 카테고리의 다른 글
[iOS] 앱의 상태 변화에 따른 AppDelegate (0) 2020.11.06 [iOS] "공유하기" 기능 (Share Extension) (0) 2020.10.30 [iOS] UI 개발 시 Code Base로 개발하기 (0) 2020.09.18 [iOS] Cell LifeCycle (UITableView, UICollectionView) (1) 2020.08.28 iOS의 데이터베이스 비교 (SQLite, Core Data, Realm) (0) 2020.08.07