Swift Testing이 뭐야?
애플이 Object-C를 대체할 Swift를 발표한 이후로 Swift 언어의 기능을 적극 활용하는 새로운 API들을 출시하고 있습니다. SwiftUI나 SwiftData는 기존의 UIKit이나 CoreData에 비하면 쓰기가 매우 편하고 깔끔해서 확실하게 생산성이 올라갔습니다.
Swift Testing도 비슷하게 XCTest를 대체하기 위한 Swift에 최적화된 API입니다.
하지만 솔직히 SwiftUI나 Swift Data 정도로 다르지는 않고 그냥 더 깔끔하고 빠르다 정도이긴 하지만, 그래도 XCTest 보다는 나으니 사용했습니다.
잔소리: 테스트를 작성해야 할까?
솔직히 말하면 저도 테스트를 많이 작성하는 개발자는 아닙니다. 그리고 사실 테스트를 많이 작성할 필요도 없다고 생각합니다. 하지만! 중요한 로직에 대해서는 반드시 테스트를 작성해야 합니다. 테스트를 작성하지 않으면...
- 그 로직이 맞는지 확신을 가질 수 없음
- 그에 따라 리팩토링도 적극적으로 할 수 없게 됨
- 코드가 복잡해 짐에 따라 부수효과가 늘어나는데 다른 곳을 수정해 로직이 잘못돼도 이를 감지할 수 없음
사실 테스트는 실용성이 중요합니다. 중요하지 않거나 자주 변경되는 로직에 대해 테스트를 철저히 작성하는 건 분명 시간 낭비가 맞습니다. 하지만 시간을 많이 쓰는 것보다 정확성이 더 중요할 경우 중요하지 않은 로직에 대해 테스트를 작성할 수도 있습니다. 분명한 건, 중요한 로직에 대해서는 테스트를 작성해야 한다는 겁니다.
기본적인 사용법
일단 import를 해야겠죠?
import testing
import SwiftTesting이 아니라 testing입니다. 개인적으로 정말 이해가 안 가는 결정입니다. 도대체 왜 이렇게 한 건지...
Swift Testing은 Macro를 적극적으로 활용합니다. XCTest의 경우 class에서 XCTest를 상속 받은 뒤 함수 이름의 prefix가 test이면 테스트로 인식했습니다. Swit Testing은 @Test를 사용하기 때문에 그런게 필요 없고 자유롭게 함수 이름을 지을 수 있습니다.
// Swift Testing
class ExampleTesting {
@Test
func example() async throws {}
}
// XCTest
class ExampleTesting: XCTestCase {
func test_example() {}
}
XCTAssertEqual은 마찬가지로 #expect라는 Macro로 대체 됐습니다.
// Swift Testing
#expect(expense.daysLeft(from: today) == 0)
// XCTest
XCTAssertEqual(expense.daysLeft(from: today), 0)
#expect는 throws를 Parameter로 줘서 에러가 나오는지도 테스트할 수 있습니다.
#expect(throws: (any Error).self) { try example() }
Swift Testing의 특징
- Test가 기본적으로 병렬로 동시에 돌아가서 더 빠르다. (실제 체감이 됨)
- Macro 기반이라 편리한게 많다. (함수 이름 prefix 꼭 test로 안 지어도 됨)
- async throws를 지원한다.
효과적인 테스트 작성을 위한 문법 설탕 (Syntax Sugar)
간단하게 여러 UseCase를 Swift Testing으로 표시하는 법을 알려 드리겠습니다. 솔직히 이거 전까지는 굳이 Swift Testing을 써야 할까 싶었지만 여기서 아 쓰긴 해야 하겠구나 설득이 됐습니다.
🐜 시간 제한
@Test(.timeLimit(.minutes(3)))
🐜 병렬이 아닌 1개씩 실행하게 하기
@Test(.serialized)
🐜 비활성화하기
@Test(.disabled("REASON"))
🐜 특정 버전에서만 테스트 실행하기
@available(iOS 17.0, *)
@Test
🐜 Argument만 바꿔서 테스트 여러 번 돌리기
@Test(arguments: [1, 2, 3, 4, 5])
func example(number: Int) {}
참고
'👨💻 프로그래밍 > 🍎 iOS 개발' 카테고리의 다른 글
🍎 Stanford iOS 강의 (CS193P) 수강 후기 (6) | 2024.09.14 |
---|---|
🍎 Swift의 mutating 알아보기 (feat. Cannot assign to property: 'self' is immutable) (0) | 2024.09.01 |
🍎 Swift Package에서 Localization 처리하기 (0) | 2024.08.10 |
🍎 나만의 Swift Package 만들기! - 개인 프로젝트에서 중복되는 코드 없애기 (0) | 2024.08.08 |
🍎 Swift UI에서 홈 화면 Context Menu 추가하기 (0) | 2024.08.05 |