city함수는 딕셔너리에서 "New York"이라는 키 값이 있다면, 해당 City 구조체 값을 반환하고, 없다면 nil을 리턴하는 함수이다
func testCoordinatesOfNewYork() throws {
// 1) 객체 생성
let calculator = DistancaCaculator()
// 2) 테스트하고자하는 city 함수 호출해야함.
// 이슈 1 : city는 Optional을 리턴함. 하지만 여기선 not nil을 기준으로 test 필요. 따라서 XCTUnwrap 이용
// 이슈 2 : XCTUnwrap함수가 Error를 뱉지만, 그것에 대한 핸들을 따로 해주지 않음 -> 함수에 throws 추가
let city = try XCTUnwrap(calculator.city(forName: "NewYork"))
XCTAssertEqual(city.coordinates.latitude, 40.7128)
XCTAssertEqual(city.coordinates.longitude, -74.0060)
}
distanceInMiles 테스트
func testParisToNewYork() throws {
// 1) test를 실행할 때마다 Caculator 객체가 생성되는 것을 방지하기 위해 setUp에서 객체를 생성한다. (13, 16번째 줄)
// 2) 두 도시 사이 거리를 계산한다.
let distanceInMiles = try calculator.distanceInMiles(from: "Paris", to: "NewYork")
// 3) Equal은 아주 정확한 값을 비교해서, 원하는 테스트를 만들어내지 못함
// XCTAssertEqual(distanceInMiles, 3636)
// 4) accuracy를 이용해서 해결 - accuracy는 1만큼 오차를 허용한다는 의미
XCTAssertEqual(distanceInMiles, 3636, accuracy: 1)
}
정확한 에러를 반환하는지 확인하는 테스트
func testCupertinoNotRecognized() {
XCTAssertThrowsError(try calculator.distanceInMiles(from: "Cupertino", to: "NewYork")) { error in
XCTAssertEqual(error as? DistancaCaculator.Error, .unknownCity("Cupertino"))
}
}
UITest
참고: UI Test를 위해서는 보이스오버가 선행되어야합니다!\
스와이프가 제대로 수행되는지?
func testMilesToParis() {
// 1) TabBar가 있다면 (나는 없음) - 탭바로 이동
// app.tabBars.buttons["Discover"].tap()
// 2) image 스와이프 하는 방법
// 빈 곳에 break point를 설정하고, test diamond를 실행한다.
// po app, ui element에 대한 정보를 얻을 수 있다. (다만 image label 설정 필요)
// po app.images // images에 대한 정보만 얻을 수 잇다
let newYorkImage = app.images["New York Image"]
newYorkImage.swipeLeft()
XCTAssert(app.staticTexts["Paris"].isHittable)
}
Code Coverage
XCTest의 기능 중 하나로, 소스 코드의 행이 실행된 횟수를 측정하여 시각화된 형태로 보여준다.