본문 바로가기

iOS 개발/App 개발 관련

[iOS] WWDC 2019 Testing in Xcode

WWDC2019 Testing in Xcode

 

Introduction to XCTest

Test Pyramid 

피라미드 형태의 Test plan 을 통해 효율적이고 철저하게 검사하면서도 속도를 놓치지 않도록 균형을 잡을 수 있다. 

 

 

Unit test 는 Test 의 기본 단위이다. 

 

단일한 코드 조각 (보통은 function) 에 대해 특정 입력을 넣고 기대하는 출력이 나오는지 확인한다.

 

Unit test 짧고 단순하며 빠르다. 또한, 모든 Test 의 기반이 되므로 최대한 대부분의 functions 이 Test 될 수 있도록 하는 것이 좋다.

 

Integration test 는 좀 더 넓은 범위에 적용된다.

 

앱의 여러 부분들 혹은 class 들이 모여 서로 올바르게 상호작용하고 동작하는지 확인한다. Unit test 를 통해 단일한 동작들이 문제 없는지 확인한 후 이들의 Integration 이 잘 이루어 지는지 확인하는 순서가 바람직하다.

 

UI test 를 통해 사용자와 앱의 상호작용을 확인한다.

 

UI test 는 상대적으로 시간이 더 걸리지만 앱이 제작된 의도대로 동작하는지 확인하기 위해 필수적이다.

 

 

이후 기본적인 XCTest 사용 방법에 대한 프레젠테이션은 기록하지 않음.

setUP(), tearDown()

try XCTUnwrap()

XCTAssertEqual()

test function 작성 방법 (제대로 동작할 때, 잘못된 입력을 받았을 때)

XCTAssertThrowsError()

UI test 작성 방법

.isHittable

Debugger 의 명령줄을 통해 실행된 UI elements 확인하기

po app

po app.images 를 통해 앱에서 사용된 image 확인

Code coverage

Test plans

Getting The Most Out of Your Tests

앱에 실질적인 변화가 없더라도 Xcode 의 테스트 옵션에 따라 여러번 테스트를 수행하는 것은 큰 도움이 될 것이다. 아래에서 몇 가지 테스트 방식을 소개하겠다.

Different localizations

개발 당시 UI에 사용된 언어와 다른 언어를 사용하는 경우에 추가적인 버그를 발견할 수 있다.

Random order

테스트 순서에 변화를 주면 숨어있는 테스트 메서드 간의 의존성을 발견하게 될 수 있다.

Sanitizer 사용하기

여러개의 Sanitizer 를 동시에 사용하는 것도 좋은 방법이다. (Address sanitizer & Thread sanitizer)

Arguments 혹은 환경 변수에 변화를 주기

모의 객체나 데이터를 작성해 테스트에 사용하는 경우 유용한 결과를 줄 수 있다.

Test Plans

위의 옵션들은 Test Scheme 에서 설정할 수 있다. 하지만 각 테스트에 대해 매번 scheme 을 설정해야 하는 번거로움이 있다. 우리는 손쉽게 다양한 옵션으로 여러번 테스트를 진행하고 싶기 때문에 Xcode 11 에서 Test Plans 이라는 새로운 기능을 도입했다. 

 

Test Plans 은 다양한 세팅 값을 가진 여러번의 테스트 진행을 돕는다. 테스트의 여러 변수를 한 자리에서 설정한다. 그리고 이를 여러 scheme 들  간에 공유할 수 있다. xcode 와 CI / xcode server 를 위한 xcodebuild 에서 지원된다. 기존의 프로젝트에 도입하기 쉽다.

 

Test Plan File 은.xctestplan 확장자를 가진 JSON 파일이다. 실행할 테스트, Test configuration 에 대한 정보를 가진다. 해당 프로젝트에 포함되는 파일이며, 하나 이상의 Scheme 에 의해 참조될 수 있다.

 

Test Configuration 은 Plan 의 테스트에서 한 번의 수행에 대한 설정이다. 각 configuration 마다 고유한 이름을 작성할 수 있다. Configuration 들 간에 공유되는 속성을 상속할 수 있다. 즉, 매번 똑같이 설정해야 할 것이 있다면 반복하지 말고 공통 속성을 설정하면 된다.

Continuous integration workflows

CI 는 test building & running 을 자동화하는 것이다. custom CI 를 작성하는 방법을 알아보자.

Build Your Own CI

1. Building machine 에서 test build 하기

 

2. 여러 종류의 device 에서 test 실행하기

 

1, 2 과정의 Test building & Running 은 xcodebuild 를 통해 진행할 수 있다. xcodebuild 는 xcode 의 command line interface 이다.

 

다음의 명령으로 test 를 진행할 수 있다.

 

$ xcodebuild test

-project projectName.xcodeproj

-scheme MyScheme

-destination 'platform=iOS,name=My iPhone'

 

$ xcodebuild bulid-for-testing

$xcodebuild test-without-building

$ xcresulttool

 

다양한 장치에서 검사 진행하기

 

$xcodebuild test

-destination 'platform=iOS,name=My iPad',

-destination 'platform=iOS,name=My iPad mini',

-destination 'platform=iOS,name=My iPhone'

 

Result Bundle

테스트 building, running 의 결과가 기록된 파일 

$ xcodebuild test

-resultBundlePath /path/to/ResultBundle.xcresult

 

xcresulttool

result bundle 의 내용에 programmatic 하게 접근하는 방법.

 

3. Issue tracker

 

다음 명령으로 test 결과를 가져와 Issue tracker 에 feed 하기 

$ xcrun xcresulttool get --path ResultBundle.xcresult --format json

$ xcrun xcresulttool formatDescription get

 

4. Code coverage 추적하기

 

code coverage 에 대해 programmatic 하게 접근하는 방법.

 

$ xcrun xccov view --report ResultBundle.xcresult

 

두 개의 code coverage report 를 비교하기

 

$ xcrun xccov diff --json Before.xcresult After.xcresult