티스토리 뷰
개요
이번 글은 공유의 목적이라기보다 XCTest를 사용하며 개인적으로 놓쳤던 세세한 부분을 기록하는데 목적이 있어요.
가볍게 작성하는 내용이라 가볍게 읽으시면 좋을 것 같아요 :)
이 글은 Raywenderlich의 Testing in iOS를 기반으로 합니다!
위의 강의를 보면서 놓쳤던 부분을 기록한 연습장 정도로 보셔도 좋을 것 같아요!
XCTest INFO I missed
1. Test를 진행할 때 Scheme 설정
Test를 구현할 때(특히 TDD)를 할 때 중요한 것이 테스트의 속도예요.
테스트를 구현할 때 모든 구현이 끝난 후 마지막에만 실행시켜보는 것이 아니라 실패 테스트를 먼저 작성하고, 테스트를 구현하는 과정 중간중간에 지속적인 테스트가 필요해서 빠른 테스트 속도는 정말 중요해요.
기본적으로 큰 차이를 가져오진 않지만, 테스트 전에 우선 빌드를 하기 때문에 Scheme 설정을 Simulator로 하는 것보단 Mac으로 설정하는 것이 더 빠르다고 하네요!
테스트해보진 못했지만 가능하면 저도 이렇게 세팅하고 진행하려고 해요 :)
2. @testable annotation
프로젝트 코드를 테스트를 위해서는 import 하는 과정이 필요해요.
예를 들어, 테스트 대상의 프로젝트 이름이 AnimalFinder라고 해볼게요.
import AnimalFinder
일반적으로 import 하듯이 테스트 코드에서 프로젝트를 import <Project> 형식으로 한다면 <Project> 내의 object를 초기화(initialize)할 수 없어요.
Swift의 경우 Access Control을 선언해주지 않는다면 Internal로 설정이 되는데요, Test는 다른 module이기 때문에 init을 할 수 없어요.
이를 해결하기 위해서는 외부 module이 접근 가능하도록 프로젝트 내부 객체를 public으로 선언해주던가, @testable 마킹을 해줘야 해요.
라이브러리를 구현하는 중이라면 전자의 방법도 상관이 없지만 일반적인 앱을 구현 중이라면 후자의 방법이 필요해요.
@testable import AnimalFinder
3. Failure Test
TDD에 관한 책이나 글을 읽어보면 가장 중요한 것 중 하나가 실패 테스트를 먼저 해보는 것인데요, 설계를 잘못할 경우 테스트가 의도치 않게 성공하는 경우가 있어요.
그러면 테스트로서의 가치가 전혀 없을 거예요!
XCode에서 단순 compile은 test pass를 띄우기 때문에 성공이 테스트의 성공인지, 테스트 자체가 진행되지 않은 것인지 확인하기 위해서 반드시 failure test를 먼저 띄워볼 필요가 있어요.
4. test 실행 단축키
이건 정말 기본적인 정보이지만 제가 놓치고 있었던 부분이기 때문에 필기했어요.
Control + Option + Command + U를 하면 커서가 놓인 테스트 메서드만 실행할 수 있어요.
여기서 U는 unit test를 의미하며 저는 기존에 Command + U는 사용했었는데 전체 테스트를 실행해요.
5. XCTFail 사용하기
특히 Bool 값을 테스트할 때 좋은 방법이에요.
일반적으로는 Bool 값이 true냐, false냐로 테스트를 구현하기 쉬운데 경우에 따라서 특정 상황에서는 테스트가 fail이 되도록 설계할 필요가 있어요.
반드시 Bool과만 사용해야 하는 것은 아니지만 특정 조건에서 테스트가 Fail이 되도록 설계할 때 XCTFail은 좋은 도구가 될 수 있어요!
6. Optional 처리하기
XCTUnwrap을 통해 Optional을 처리할 수 있어요.
let unwrapedBool = try XCTUnwrap( someOptionalBool )
XCTAssertTrue(unwrapedBool) // unwrap 과정이 없이 이 테스트를 진행하면 문제 발생
그런데 저는 그냥 NotNil 테스트를 하고, 값 자체를 바로 비교해요.
XCTAssertEqual(someOptionalBool, true)
여기서는 unwrap이 중요한 개념이 아니고, 값 자체를 비교하는 로직이기 때문에 테스트에서는 이것으로 충분하다고 생각해요.
7. XCTAssert()
XCTAssert는 XCTAssertTrue와 완전히 같다고 하네요 :)
8. Test method 구현하기
XCTest를 진행하기 위해서 테스트 메서드를 구현할 때 항상 메서드 이름의 시작을 test로 해야 해요.
그래야 그 메서드가 테스트를 위한 메서드인지 XCode가 인지하기 때문이죠.
그동안 생각을 안 해본 부분인데 그 테스트 메서드에 argument(parameter)가 정의될 경우 이 역시 테스트 메서드로 인식하지 못해요.
생각해보면 당연한 것이 이 메서드를 정의하는 건 우리지만 직접 사용하는 것이 아닌데 컴파일러 입장에서 파라미터가 필요한 메서드일 경우 무엇을 넣어줄지 알 수 없어요.
그동안 생각해보지 않은 부분이라 필기했어요 :)
9. Tuple 값 비교하기
튜플을 테스트할 경우 equal을 사용할 때 조심해야 할 것이 있어요.
아래 값은 두 튜플을 단순 비교하는 로직이기 때문에 사용 가능하지만, 위의 Equal 테스트는 사용할 수 없어요.
Tuple은 named type이 아니라 compound type이기 때문인데, 혹시 두 type의 차이를 모르신다면 이번 기회에 알아보면 좋을 것 같아요!
10. Test를 추상화하기
이건 내용 자체보다 목적이 중요한 부분이에요.
예를 들어, 어떤 로직이 Int와 Double 모두에 적용되는지 확인해야하는 상황이 있다고 가정해볼게요.
가장 단순한 방법은 두 타입의 테스트를 모두 만드는 것이지만 이럴 경우 상황에 따라 무의미한 반복이 계속 2배로 생길 수 있어요.
그래서 두 타입의 상위 개념을 계속 타고 올라가다보면 Int, Double 모두 AdditiveArithmetic에서 나왔음을 알 수 있어요.
그래서 이것을 활용하면 두 테스트를 한 번에 할 수 있는 테스트를 설계할 수 있죠.
public extension Sequence where Element: AdditiveArithmetic { // 공통점을 활용
...
}
11. 소수점 비교하기
정수 타입이 아닌 Double, CGFloat 등의 타입 값을 비교할 때 같은 값임에도 불구하고 다르게 표현될 때가 있어요.
부동소수점 방식이기 때문에 발생할 수 있는 문제인데 XCTest에서는 이렇게 소수점 비교를 위해 설정을 할 수 있어요.
위처럼 accuracy를 등록하면 "소수점 12자리 까지만 같으면 같은 것으로 취급하여 테스트를 통과한다" 라고 선언하게 돼요.
소수점 테스트에서 유용하게 사용할 수 있을 것 같아요 :)
이것 외에도 Test Coverage 활용, TDD, Switch 문을 테스트에 더 잘 활용하기 위해 ~= 설정 등 여러 내용이 있지만 여기서는 너무 길어져서 작성하지 않도록 하겠습니다!
혹시 더 자세한 내용이 궁금하시면 도입부에 언급한 자료를 학습해보는 것도 좋을 것 같아요 :)
'iOS 앱개발 > iOS' 카테고리의 다른 글
[iOS] - Xcode 단축키 정리 (0) | 2023.01.14 |
---|---|
[iOS] 앱 테스트를 위해 네트워크 속도 조절하기(Mac & iPhone) (0) | 2022.10.06 |
[iOS] File System 이해하기 (0) | 2022.06.12 |
[iOS] - SwiftUI 이해하기(2) (0) | 2022.05.29 |
[iOS] - SwiftUI 이해하기(1) (0) | 2022.05.29 |
- Total
- Today
- Yesterday
- 쿼드트리#BOJ#분할정복#Python
- 종이자르기#분할정복#BOJ#Python
- Brackets#Stacks and Queues#Codility#Python
- django#slicing
- 반복수열#백준알고리즘#Python
- 미로 탐색#백준알고리즘#Python
- filter#isalnum#lower
- 리모컨#완전탐색#BOJ#Python
- 날짜 계산#BOJ#완전탐색#Python
- 배열합치기#분할정복#BOJ#Python
- NumberofDiscIntersections#Codility#Sort#Python
- 암호코드#dp#BOJ#Python
- Distinct#Codility#Python
- 백준 알고리즘#BackTracking
- 나무자르기#BOJ#이분탐색#Python
- API#lazy#
- PassingCars#Codility#Python
- Triangle#Sorting#Codility#Python
- 공유기 설치#BOJ#이분탐색#Python
- 랜선자르기#이분탐색#BOJ#Python
- 파이썬알고리즘인터뷰#4장
- 텀 프로젝트#백준알고리즘#Python
- Swift#Tuples#Range
- 순열사이클#BOJ#Python
- N으로 표현#DP#Programmers#Python
- 터틀비치#리콘#xbox#controller
- 섬의개수#백준알고리즘#Python
- 병든 나이트#BOJ#탐욕법#Python
- django
- 토마토#백준알고리즘#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 |