단위 테스트
특정 유닛이 정상 동작하는지 체크하기 위한 테스트
F astI solatedR epeatableS elf-AutomationT imely테스트 목적의 상황 설명 ex) 3 을 받고 난수 생성
테스트 발생 시점 ex) 버튼 클릭 이벤트
예상결과, 결과 그 후이 처리

XCTAssertTrue(isEnabled)
XCTAssertFalse(items.isEmpty == false)
XCTAssertEqual(user.name, "Lee")
XCTAssertEqual(distance, 1.0, accuracy: 0.0001)
XCTAssertNil(cache["missing"])
XCTAssertNotNil(image)
XCTAssertGreaterThan(score, 80)
XCTAssertLessThan(latency, 100)
XCTAssertIdentical(a as AnyObject, b as AnyObject)
if unsupported { XCTFail("미지원 경로") }
let data = try XCTUnwrap(response.data)
import Foundation
protocol NumberService: Sendable {
func fetchNumbers() async throws -> [Int]
func sumEvenNumbers(_ numbers: [Int]) -> Int
}
extension NumberService {
func sumEvenNumbers(_ numbers: [Int]) -> Int {
numbers.filter { $0 % 2 == 0 }.reduce(0, +)
}
}
enum NumberServiceError: Error, LocalizedError {
case network
case malformed
var errorDescription: String? {
switch self {
case .network: return "네트워크 오류가 발생했습니다."
case .malformed: return "데이터 형식 오류가 발생했습니다."
}
}
}
final class TestableHelper: NumberService {
// 임의의 딜레이
private let delay: UInt64 = 700_000_000
func fetchNumbers() async throws -> [Int] {
try await Task.sleep(nanoseconds: delay)
return (1...10).map{ _ in Int.random(in: 1...30) }
}
}
테스트 하고자할 프로젝트나 모듈에
AddTarget을 진행후
아래와 같이 테스트 해보겠습니다.
import XCTest
@testable import Testable // 현재 프로젝트 ( 만약 Tuist 같은 멀티모듈 환경시 해당 모듈 ).
@MainActor
final class TestableTests: XCTestCase {
// Test 대상
private var service: NumberService!
// 테스트에 필요한 설정값
override func setUpWithError() throws {
// Put setup code here. This method is called before the invocation of each test method in the class.
try super.setUpWithError()
self.service = TestableHelper()
}
// Test 마치며 정리할 것들 정리 -> 격리성 보장
override func tearDownWithError() throws {
try super.tearDownWithError()
service = nil
}
/// func fetchNumbers() async throws -> [Int] Test Code
func testFetchNumber() async throws {
// given : 필요한 값 세팅
// -> 현재는 없음
// when : 테스트 코드 실행
let number = try await service.fetchNumbers()
// then : 결과 비교
XCTAssertEqual(number.count, 10, "The number Count should be 10")
}
// sumEvenNumbers(_ numbers: [Int]) -> Int TestCode
func testSumEvenNumbers() {
// given None
// when
let result = service.sumEvenNumbers([1,2,3,4,5,5,6,7,8,9,10,20])
// then
XCTAssertEqual(result, 50, "The sum of even numbers should be 50")
}
}
func testFetchCallBack() throws {
let manager = FakeNetworkManager(mode: .success([1,2,3,4,5,6]), delay: 100_000) // much smaller
let exp = expectation(description: "fetch Done") // 뭘 충족할지
manager.fetchNumbers { result in
let nums = try? result.get()
XCTAssertEqual(nums, [1,2,3,4,5,6])
exp.fulfill() // 충족함
}
wait(for: [exp], timeout: 2.0)
}
오랜만에 다시 글을 올립니다.
개인사정으로 인해... 몇일간 맥북을 못 만지는 상황이 발생해서..!
다음시간에는 UITest 로 찾아 뵙겠습니다. 감사합니다.