일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- DependencyInjection
- SwiftUI
- gitflow
- combine
- SeSAC
- DispatchQueue
- data_structure
- Realm
- SRP
- GIT
- leetcode
- 등굣길
- rxswift
- swift
- CoreBluetooth
- 오픈채팅방
- RaceCondition
- IOS
- 코테
- MethodSwilzzling
- MainScheduler.asyncInstance
- MainScheduler
- DiffableDataSource
- cleanarchitecture
- MainScheduler.Instance
- 명품cppProgramming c++
- DynamicMemberLookup
- 프로그래머스
- GCD
- 청년취업사관학교
- Today
- Total
Do.
Swift 단위테스트 자동화 xcresult를 junit.xml 변환하기 본문
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에 맞추어져 있었기 때문에 파싱 스크립트를 두벌을 만들지 않기 위해서 변환했습니다.
'General Dev' 카테고리의 다른 글
Thread - Semaphores vs Mutexes (0) | 2023.07.16 |
---|---|
Race Condition / Thread Safe (0) | 2023.06.26 |
iOS 개발자 부트캠프 - SeSAC(청년취업사관학교) (0) | 2023.05.03 |
UML(Unified Modeling Language) - feat. Class Diaphragm (0) | 2022.11.15 |
Architecture - Single Responsibility Principle(SRP) (2) | 2022.09.14 |