꿈돌이랜드

[iOS] 앱 Test 하기 본문

Programming/iOS

[iOS] 앱 Test 하기

loinsir 2023. 7. 8. 11:26
반응형

Testing your apps in Xcode 애플 개발자 문서를 읽으면서, Xcode에서 테스트를 어떤식으로 하는지 알아봅시다.

Xcode에서 앱 테스트 하기

XCTest로 로직 실패 감지, UI 문제, 그리고 성능 회귀 측정하기.

개관

XCTest는 다양한 수준의 추상화에서 테스트를 작성하는 기능을 용이하게 합니다. 좋은 테스트 전략은 여러 유형의 테스트를 결합해서 각각의 이점을 극대화합니다.

앱의 로직을 다루기 위한 많은 빠르고 잘 분리된 단위 테스트, 그보다 더 적은, 제대로 연결되어 있음을 보여주기 위한 소수의 통합 테스트, 일반적인 사용 사례의 올바른 UI 동작을 확인하기 위한 UI Test를 포함한, 아래 그림과 같은 테스트의 “피라미드” 분포를 목표로 합니다.

UI 테스트는 앱이 예상대로 사용자에게 작동되는지를 나타내는 궁극적인 지표지만, 다른 테스트 종류들 보다는 실행 시간이 더 오래 걸립니다. 동일한 UI Test에서 실패를 일으킬 수 있는 다양한 앱 변수가 있습니다. 테스트 피라미드는 사용자가 작업을 완료할 수 있음을 보여주는 고충실도 테스트와 앱 논리의 정확성 및 변경 사항의 영향에 대한 빠른 피드백을 제공하는 집중 테스트 사이의 균형을 유지합니다.

단위 테스트 작성하기

각 단위 테스트는 프로젝트 내의 메서드나 함수의 단일 경로의 예상 동작을 가정(assert)해야 합니다. 여러 경로를 커버하려면, 각 시나리오마다 하나의 테스트를 작성해야 합니다.

예를 들어, 만약 함수가 옵셔널 파라미터를 받는다면, 파라미터가 nil일 때의 테스트와, nil이 아닐 때의 테스트를 각각 모두 작성해야 합니다. 경계값의 경우와, 논리적 분할일 케이스를 코드에 작성하고, 이런 각 경우의 조합을 모두 커버하는 단위 테스트를 작성해야 합니다.

테스트할 클래스나 함수를 선택하고, 그 클래스 혹은 함수를 포함하는 XCTestCase의 서브클래스를 생성하세요. XCTestCase 서브클래스에 “test”로 시작하는 이름으로 인자를 받지않고, Void를 리턴하는 메서드를 하나 추가하세요. Xcode에서 choose new File을 선택하고, Unit Test Case Class를 선택하면, 자동으로 적절한 템플릿 클래스가 추가됩니다.

테스트 메서드는 반드시 세 단계를 포함해야 합니다. 각 순서는 다음과 같습니다:

  1. Arrange. 마련하기: 테스트 중인 코드 경로에서 사용하는 객체 혹은 자료구조를 만듭니다. 복잡한 종속성을, 구성하기 쉬운 stub(다른 프로그래밍 기능을 대리하는 코드, mock 객체랑 유사한 개념)으로 교체해서 테스트가 신속하고 결정적으로 실행되도록 합니다. 프로토콜 지향 프로그래밍 POP를 채택하면 앱의 객체 간 관계가 충분히 유연하여 스텁에 대한 실제 구현을 대체할 수 있게 됩니다.
  1. Act. 행동: Arrange 단계에서 구성한 매개 변수 및 속성을 사용해서 테스트하려는 메서드나 함수를 실행합니다.
  1. Assert. 가정하기: XCTest 프레임워크의 Test Assertion을 사용해서 Act 단계에서 실행하는 코드의 동작을 발생해야 하는 예상과 비교합니다. 조건이 거짓인 Assert는 테스트를 실패하게 합니다.

결과 테스트 메서드 예시

class MyAPITests : XCTestCase {
  func testMyAPIWorks() {
    // Arrange: create the necessary dependencies.
    // Act: call my API, using the dependencies created above.
    XCTAssertTrue(/* … */, "The result wasn't what I expected")
  }
}

통합 테스트 작성하기

통합 테스트는 단위 테스트와 매우 유사하며 동일한 API를 사용하고, 동일한 Arrange-Act-Assert 패턴을 따릅니다. 차이점은 규모입니다. 단위 테스트는 앱 로직의 아주 작은 부분을 다루지만, 통합 테스트는 더 큰 하위 시스템 혹은 클래스와 함수의 조합의 동작을 검사합니다. 통합 테스트의 정렬 단계에서 더 적은 수의 스텁 객체를 사용해서 테스트 중인 실제 프로젝트 코드의 범위를 넓힙니다.

단위 테스트 처럼 모든 케이스나 경계 케이스를 다루려고 하기 보다는 통합 테스트를 사용해서 중요한 상황에서 구성 요소들이 함께 동작해서 앱 동작이 원활하게 작동하는지 확인합니다. 예를 들어 컨트롤러에서 전달 받은 값이 Model에 올바르게 저장되는지, 네트워크 요청에 의해 발생한 에러가 UI에 올바르게 전달되고 표시되는지 테스트하는 것이 포함됩니다.

UI 테스트 작성하기

UI 테스트는 단위, 통합 테스트와 다른 방식으로 작동되지만, 여전히 XCTestCase의 서브클래스의 메서드로써 Xcode의 Create New File 클래스 템플릿이 존재하며, UI 테스트의 공통 시작점이 포함되어 있습니다. 앱의 코드를 직접 실행하는 대신에, 실제 사용자 처럼 앱의 UI 컨트롤을 사용해서 사용자가 앱을 사용해서 특정 작업을 완료할 수 있는지 그 여부를 결정합니다.

중요한 사용자 동작이 앱에서 완료될 수 있는지, UI 컨트롤의 동작을 방해하는 버그가 있는지 확인하기 위해 UI 테스트를 만듭니다. 실제 사용자 활동을 복사한 UI 테스트는 앱이 의도한 작업에 사용될 수 있다는 확신을 제공합니다. 예를 들어서, 문서 기반 앱에 대한 UI 테스트는 사용자가 새 문서를 만들고, 해당 콘텐츠를 편집한 다음, 문서를 삭제할 수 있는지 확인할 수 있습니다.

XCTestCase 하위 클래스의 메서드에서 UI 테스트를 만들려면, Xcode의 Record UI Test 기능을 사용해서 앱과의 상호 작용을 기록합니다. 중단될 경우 사용자에게 가장 큰 영향을 미칠 수 있는 가장 중요한 workflow를 복제하고 회귀를 방지 할 수 있도록 보고된 버그를 재생하도록 UI 테스트를 설계합니다.

테스트 하기 위한 함수를 실행하는 workflow를 기록한 경우에 Test Assert 함수를 사용해서 기록된 상호 작용중에 수행된 작업을 고려해서 UI의 최종 상태가 예상했던 것인지 확인합니다.

UI 테스트가 여러 나눠진 단계로 구성된 복잡한 workflow를 모방하는 경우, XCTActivity를 사용해서 공유 단계를 구성하고 이름을 지정할 수 있습니다. 여러 테스트에서 사용되는 활동들의 구현을 공유하기 위한 helper 메서드를 생성합니다.

성능 테스트 작성하기

코드 영역을 실행하는 동안 소요된 시간, 사용된 메모리, 기록된 데이터에 대한 정보들을 수집하는 성능 테스트를 작성합니다. XCTest는 코드를 여러 번 실행해서 요청된 지표를 측정합니다. 메트릭에 대한 기준선 기대치를 설정할 수 있으며, 측정된 값이 그 기준보다 나쁜 경우에 XCTest는 테스트 실패를 보고합니다.

코드에 걸리는 시간을 테스트하려면 measure(_:) 이라는 테스트 메서드를 실행하고, 블록 인자에 앱의 코드를 실행합니다. 메모리 사용 및 디스크에 기록된 데이터 양을 비롯한 다른 메트릭을 사용해서 성능을 측정하려면 measure(metrics: block:) 을 호출하세요.

class PerformanceTests : XCTestCase {
  func testCodeIsFastEnough() {
    self.measure() {
      // performance-sensitive code here
    }
  }
}

간단 정리

  • Xcode에서 앱을 테스트하기 위해서는 XCTest 프레임워크를 사용한다.
  • 각 테스트는 피라미드 계층으로 아래부터 각각 단위 테스트, 통합 테스트, UI 테스트로 구분된다.
  • 테스트 하기 위한 클래스는 XCTestCase를 서브클래싱 해서 만들고, 각 테스트 케이스는 메서드로 “test”를 접두사로 붙여 만든다.
  • 단위 테스트, 통합 테스트는 Arrange, Act, Assert 3단계로 구성한다.
  • 단위 테스트는 앱의 로직의 가장 작은 클래스, 메서드, 함수를 테스트하며, 경계값 등을 모두 포함하는 테스트 케이스를 작성해야 한다.
  • 통합 테스트는 단위테스트와 비슷하지만, 경계값 같은 케이스를 모두 커버하려 하기 보다는 각 구성 요소들이 원활하게 조합하여 동작하는지를 테스트하는 것이 목표이다.
  • UI Test는 실제 사용자들이 앱을 사용하는 시나리오를 테스트하여 적절한 UI가 동작하는지를 테스트하는 것이다.

참조: 애플 개발자 문서, Testing your apps in Xcode


Uploaded by N2T

반응형

'Programming > iOS' 카테고리의 다른 글

코코아 인터널스 - 2장 메모리 관리  (0) 2023.08.07
코코아 인터널스 - 1장  (0) 2023.07.23
[iOS] hitTest 이해하기  (0) 2023.06.14
[iOS] Responder와 Responder Chain 이해하기  (0) 2023.06.13
N2T 테스트 페이지  (0) 2023.05.01