-
단위테스트와 TDDiOS 2020. 12. 15. 10:47
안녕하세요. 그린입니다!
이번 포스팅에서는 코드에 대한 단위테스트와 TDD에 대해 알아보겠습니다.
우선 단위테스트와 TDD의 개념은 모든 언어를 통해 개발을 진행하며 나올 수 있는 개념입니다.
그렇지만 저희는 iOS를 학습하고 있기에 기본적으로 단위테스트와 TDD가 어떤것인지 먼저 파악한다음
Xcode에서 어떻게 생성하고 어떤 코드를 써서 테스트를 진행하는지 알아보겠습니다~!
[단위테스트]
단위테스트는 말 그대로 코드의 테스트를 단위별로 쪼개 테스트를 작게 진행하는 방법론 중 하나입니다.
효율적인 테스트를 하기 위해서는 5가지의 조건이 있습니다. 앞글자를 따서 FIRST라고 합니다.
1) Fast: 빠름, 테스트는 빨라야한다.
2) Independent: 독립적, 테스트 코드는 독립적이여야한다.
3) Repeatable: 반복, 항상 테스트 결과가 어떤 상황에서든 동일해야 한다.
4) Self-Validating: 자가검증, 테스트가 완벽히 검증되어 자동화가 되어야 한다.
5) Timely: 적시, 테스트 코드는 실제 코드 구현 전 작성되어야 이상적이다.
Xcode에서 테스트를 진행 해볼 수 있는 3가지 테스트가 있습니다.
-> UITest, UnitTest, PerformanceTest
또한, Xcode에서 테스트 파일을 생성하고 테스트할 모듈을 인스펙터에서 타켓 멤버쉽 체크를 해주어야
정상적인 테스트가 적용되어 테스트가 가능합니다. 이부분은 밑에 Xcode에서 테스트 생성시 다시 보겠습니다.
[TDD]
Test-Driven Development, 테스트 주도 개발이라는 방법론이며 아래와 같이 3단계로 이뤄집니다.
1) RED: 실패하는 테스트 코드 작성
2) GREEN: 통과(성공)하는 테스트 코드 작성
3) REFACTOR(YELLOW): 위 단계를 보완한 리팩토링 코드 작성
위의 3단계를 순서대로 순환하며 테스트를 거칩니다.
-. TDD의 장점: 소스코드 품질 향상, 디버깅 시간 절약
-. TDD의 단점: 오래걸리는 시간
TDD가 개발을 할때 이상적인것은 알지만 개발 상황에 따라 스킵이 되는 경우도 많고 해당 3단계의 절차대로
딱 정해져서 개발되는 경우가 없을 수 있습니다. 그러나 TDD를 지킴으로 가장 좋은 점이 있습니다.
바로, 테스트 코드를 실제 코드 작성 전에 구현을 해봄으로써 미리 프로젝트의 전체적인 흐름을 파악해볼 수 있고,
또한 무작정 코딩부터 진행하는것보다 테스트 코드를 통해 추후 실제 코드 작성 시 더 깔끔하고 오류가 적은 코드를
빠르게 구현해낼 수 있습니다.
-. 그럼 왜 실패하는 테스트 코드를 작성할까요???
: GREEN에서 성공하는 테스트 코드만 작성하고 테스트를 해보면서 판별하면 되는데 왜 굳이 RED 실패하는 테스트
코드의 작성이 우선이 될까요..? 조금 생각해보면 그 이유는 실패하는 테스트 코드를 작성함으로 실제 코드를 작성하면서
예상치 못하는 사용자 인터페이스에 따른 여러 입력값을 먼저 생각해 볼 수 있습니다.
해당 케이스들을 먼저 생각해보고 리팩토링을 거치며 추후 실제 코드를 작성할때 더욱 가독성이 좋고 오류가 나지 않는
코드를 구현할 수 있습니다.
강의를 들으며 와닿은 말이 있습니다.
"테스트를 하지 않으면 코드를 수정(리팩토링)하기 어렵고 두려워진다." 이말이 테스트의 중요성을 한번에 나타내준다고
생각합니다. 시간이 더 걸리더라도 토대부터 확실히 다지고 가야합니다.
[iOS에서 생성된 테스트 파일 살펴보기]
import XCTest @testable import singleApp class singleAppTests: XCTestCase { override func setUpWithError() throws { // Put setup code here. This method is called before the invocation of each test method in the class. } override func tearDownWithError() throws { // Put teardown code here. This method is called after the invocation of each test method in the class. } 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. self.measure { // Put the code you want to measure the time of here. } } }
우선 Xcode에서 테스트를 하기 위해서는 XCTest라는 테스트 프레임워크를 사용해야합니다.
위에서 말한것처럼 해당 프레임워크에는 UnitTest, UITest, PerformanceTest 등 여러가지 테스트 케이스가 있습니다.
-. UnitTest: 코드의 모듈이 코딩한 의도대로 잘 작동하는지 테스트하는 절차입니다.
테스트를 생성 시 기본적으로 생성되는 메서드가 있습니다. (모두 한번씩만 호출됩니다.)
[테스트 기본 생성 메서드]
-. SetUpWithError(): 테스트 실행되기 전에 생성되며 인스턴스 생성 및 초기화 시 구현할 것들을 코딩하여 실행하도록 합니다.
-. tearDownWithError(): 테스트 종료 후 초기로 돌아가는 작업을 합니다.
(Xcode 11.4 버전 이전에는 setUp(), tearDown() 으로 생성되는데 이후 버전에서는 위 표기로 자동 생성됩니다. 해당 메서드를 사용하지 못하는것이 아니고 메서드 에러처리 기능에 차이가 있습니다.)
++ 테스트 메서드는 test라는 접두어를 붙여줘야 테스트로 인식하여 실행됩니다.
[iOS에서 테스트 생성]
네비게이터에서 테스트 네비게이터로 들어간 후 아래 + 표시를 클릭합니다.
그 후 원하는 테스트 파일을 생성합니다.
물론 아래처럼 처음 프로젝트 생성 시 include Tests에 체크를 하여 테스트를 생성할 수 잇습니다.
생성하면 위와 같이 테스트 생성 파일이 보입니다.
위와같이 테스트를 하고싶은 파일에서 파일 인스펙터 메뉴로 들어갑니다.
보이는 바와 같이 타겟 멤버쉽에서 원하는 테스트에 체크를 합니다.
이렇게 이번 포스팅에서 테스트에 대한 간단한 이론과 Xcode에서 테스트 파일을 생성하고
기본적으로 구현된 테스트 메서드는 어떤것이 있는지를 간단하게 살펴보았습니다.
별거 아닌것 처럼 보이지만 사실 코드보다 더 오래 걸리는 과정으로 몸에 익혀둔다면 분명 좋은 기회가 있을겁니다.
수정할 사항이나 더 보강해야될 내용이 있으면 알려주시면 감사하겠습니다!
감사합니다:D
'iOS' 카테고리의 다른 글
Collection View (0) 2021.01.25 Application Life Cycle (0) 2021.01.14 AppDelegate & SceneDelegate (0) 2020.12.07 Gesture Recognizer (0) 2020.12.02 UML (0) 2020.12.02