Do.

Swift 단위테스트 자동화 xcresult를 junit.xml 변환하기 본문

General Dev

Swift 단위테스트 자동화 xcresult를 junit.xml 변환하기

Hey_Hen 2023. 9. 10. 17:34

xcresult 파일 생성

우선 junit.xml 포멧으로 변환하기 전에 xcresult 파일을 생성할 필요가 있습니다.

우선 xcresult는 xcode에서 바로 생성되기도 하는데요.

(xcode 14.3 기준) 심플하게 찾는 법은 Report Navigator 테스트 결과에서 Ctrl + click 하면 바로 Show in Finder를 볼 수 있습니다.

CLI

하지만 보통은 테스트 자동화는 CI/CD를 통해서 이루어 지기 때문에 CLI를 통해 test를 돌릴 필요가 있습니다.

xcodebuild -scheme PleaseAttendancePresentationLayer test -destination "platform=iOS Simulator,name=iPhone 14 Pro,OS=16.4" -resultBundlePath "./PresentationlayerTests.xcresult"

저는 PresentationLayer 단일 패키지 테스트 결과를 출력하려고 합니다.

그리고 테스트 결과가 바로 현재 디렉토리로 저장되도록 resultBundlePath를 지정합니다.

요 xcresult파일을 직접 열어보면 압축되어있어서 읽을 수는 없는데요,

xcrun xcresulttool get --format json --path <TESTFILE>.xcresult

위와 같이 xcrun과 xcresulttool(wwdc19에 소개됨)을 이용하면 json 형태로 자세한 내용을 얻을 수는 있지만 junit 형태는 아닙니다.

fastlane의 문서를 보면 xcpretty를 이용해서 junit.xml로 변환할 수 있다고 나오지만 xcpretty는 x86 cpu 기준의 gem 설치를 지원합니다. 빌드 머신의 터미널 설정 괜히 잘못건드리면 피를 볼 수 있으므로 arm architecture를 지원하는 parser 어플을 찾아봤습니다

GitHub - a7ex/xcresultparser: Parse the binary xcresult bundle from Xcode builds and testruns

xcresultparser 라는 프로그램으로 마침 최신 업데이트도 있고, 다양한 포맷팅 결과도 지원하고 있습니다

xcresultparser -o junit PrLayerTests.xcresult > ./junit_test.xml

요렇게 작성해주면

<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="2" failures="1" time="23.645">
    <testsuite name="PleaseAttendancePresentationLayerTests.xctest" tests="2" failures="1" time="0.027">
        <testcase name="test_리프레시동작시_버스리스트가져오기()" time="0.0013" classname="MyTransportationListViewModelTests"/>
        <testcase name="test_리프레시전에는_버스리스트비어있음()" time="0.025" classname="MyTransportationListViewModelTests">
            <failure message="short">XCTAssertEqual failed: ("[PleaseAttendanceDomainLayer.FavoriteBusItem(uniqueID: "E8379C4B-4692-4456-BB00-E085AC384EA9", id: "1245678", number: "5623", startLocation: "구로디지털단지역", currentLocation: "금천우체국", currentLocation2: "시흥유통센터", remainStation: 1, remainStation2: 2, remainTime: "60", remainTime2: "120", index: 0)]") is not equal to ("[]") (/Users/hoseunglee/Dev/PleaseAttendance/PleaseAttendancePresentationLayer/Tests/PleaseAttendancePresentationLayerTests/MyTransportationListViewModelTests.swift:36)</failure>
        </testcase>
    </testsuite>
</testsuites>

junit.xml과 같은 폼으로 출력되게 됩니다.

배경

xctest 를 굳이 junit으로 변환해야 할 일이 없을거라고 생각했지만, xcresultparser를 찾는 동안 생각보다 연관검색어와 비슷한 프로그램이 많다는 것에 놀랬습니다.

저는 jira에서 zephyr 를 자동으로 생성하기 위한 용도였는데 미리 구성되어 있는 스크립트가 안드로이드 팀의 테스트 결과인 junit에 맞추어져 있었기 때문에 파싱 스크립트를 두벌을 만들지 않기 위해서 변환했습니다.

Comments