XCTest?

Xcode에서 테스트 작업 흐름을 원할하게 하는 프레임워크
단위 테스트 용도 등

특정 조건(여러가지 함수) 충족되었는지 확인하고 조건이 충족되지 않으면 테스트 실패를 기록





사용하기

기본적인 로직 구현하기

아래와 같이 계산기 class가 있고 +, - 메서드가 있습니다.
그리고 main에서는 그 계산기를 이용하는 코드를 작성했습니다.

Calculator class

main





XCTest 파일 만들기

TestNavigator -> + -> New Unit Test Target
으로 만들면 전체적인 폴더가 만들어짐.
따로 Class파일만 만들고 싶으면 아래 Test Class 만들기


아래와 같이 이름을 짓고 Finish를 누르면



아래와 같이 Test 파일이 생김





기본 동작 이해

기본값 생성할때 사용 (객체 인스턴스 생성, db 초기화, 규칙을 작성 등)

// 각각의 테스트 메서드가 실행되기 전에 setUp이 먼저 실행되어 값을 재설정 시켜줍니다.
override func setUp() {
    super.setUp()
}

초기 상태로 복원할 때 사용됩니다. (파일 닫기, 연결, 새로 만든 항목 제거, 트랜잭션 콜백 호출 등)

// 만약 테스트에서 어떤 값을 변경했을 경우 다음 테스트에서 문제가 발생할 수 있기 때문에 사용
// 각각의 유닛 테스트가 끝난 후 테스트 값을 처리합니다.
override class func tearDown() {
    super.tearDown()
}

XCTest에서 사용하는 전체 메서드들의 동작 순서






Calculator 연동하기

@testable import Calculator

으로 아래 사진과 같이 연동하기





가져오다가 No such module 등 연동 에러가 나는 경우


1. Target Dependencies 추가
project -> targets -> CalculatorTest -> Build Phases -> Target Dependencies



build 중 함수 등 못가져올 경우


2.Compile Sources 추가
project -> targets -> CalculatorTest -> Build Phases -> Compile Sources



최종 Test Target Build Phases








테스트 케이스 작성

처음에는 test접두사로 시작하기

  1. Equal을 통해 3+2 가 5로 일치하는지 확인
  2. True를 통해 3-2 가 1로 일치하는지 확인
class CalculatorTest: XCTestCase {
    let Cal = Calculator()
    func test_덧셈기가__작동하는지(){
        XCTAssertEqual(Cal.calAdd(a:3, b:2), 5)
    }
    
    func test_뺄셈기가__작동하는지(){
        XCTAssertTrue(Cal.calSub(a: 3, b: 2) == 1)
    }
}



+ 다른 부분의 코드

이번 유닛 테스트의 계기인 레이싱 게임 과정에서 나온 코드

아래 코드에서 이름이 5글자를 초과하면 에러가 나오도록 설정하여서
Testtss로 자동차 이름을 만들면 ThrowsError()를 이용하여
Error가 들어와 테스트케이스에 통과하는 부분을 확인

// 테스트 케이스
func test_자동차는_6글자_이상의_이름을_가지지_않음() throws{
  XCTAssertThrowsError(try Car(name: "Testtss"))
}
 
//-------------------------------------------------------
// Car의 init 함수
init(name: String) throws {
  self.name = name

  // 이름이 기준에서 넘거나 빈 문자열로 들어온 경우 예외처리
  if !(Car.minNameLength...Car.maxNameLength).contains(name.count) || name.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
      throw CarInputError.invalidArgumentException
  }
}






최종 동작 확인

아래 사진과 같이 각 부분이 잘 동작하는걸 확인 가능




하지만 하나라도 잘못 들어가서 오류가 반환되는 경우 아래와 같이
Test Target과 Class가 전부 False로 반환





여러가지 Assert 메서드들

// 두 값이 같은지 or 다른지 확인합니다.
XCTAssertEqual(expression1: T, expression2: T, message: String)
XCTAssertNotEqual(expression1: T, expression2: T, message: String)
// expression1 테스트 대상 실제 값
// expression2: 예상 값
// message: 실패 시 출력할 메시지

// 두 실수 값이 지정한 정확도 범위 내에 있는지 확인합니다.
XCTAssertEqual(expression1: T, expression2: T, accuracy: T, message: String)
XCTAssertNotEqual(expression1: T, expression2: T, accuracy: T, message: String)
// expression1 테스트 대상 실제 값
// expression2: 예상 값
// accuracy: 허용 오차 범위(expression1 과 expression2의 최대 차이)
// message: 실패 시 출력할 메시지

// 조건이 참인지 거짓인지 확인합니다.
XCTAssertTrue(expression: Bool, message: String)
XCTAssertFalse(expression: Bool, message: String)
// expression: 테스트 대상 조건
// message: 실패 시 출력할 메시지

// 값이 nil인지 아닌지 확인합니다.
XCTAssertNil(expression: Any?, message: String)
XCTAssertNotNil(expression: Any?, message: String)
// expression: 테스트 대상 값
// message: 실패 시 출력할 메시지






참고 사이트

Danny님 블로그
minni님 블로그

profile
개발을 배우는 대학생입니다!

0개의 댓글

Powered by GraphCDN, the GraphQL CDN