2018幎ãAppleã¯æ¬¡åïŒ3åç®ïŒã«ããã¹ãå®è¡ã«é¢ããæ å ±ãçºè¡ããã圢åŒãæŽæ°ããŸããã以åã¯å€§ããªxmlã§ãã£ãplistãã¡ã€ã«ã§ããããçŸåšã¯xcresultæ¡åŒµåãæã€å€§ããªãã¡ã€ã«ã§ãããXcodeãä»ããŠéãããã°ãã¹ã¯ãªãŒã³ã·ã§ãããå«ããã¹ãçµæããå§ãŸããã¿ãŒã²ããã«ãã¬ããžã§çµããå€ãã®æçšãªæ å ±ãå«ãŸããŠããŸãã ãã¢ã»ã³ããªã«é¢ãã蚺ææ å ±ãªã©ãã»ãšãã©ã®éçºè ã¯ãããæ¯æ¥äœ¿çšããŠããŸãããããã®èšäºã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãã«ããŒã¯äœã䟿å©ãªãã®ãèŠã€ãããããããŸããã
ãã©ãŒããããæŽæ°ããããšã®é·æãšçæãå解ããŠã¿ãŸããã
ãã©ãŒããããæŽæ°ããããšã®æ¬ ç¹ã¯äœã§ããïŒ
- éåžžã«éããããCIãµãŒããŒãšã®ãã®ãããªãã¡ã€ã«ã®äº€æã«ã¯æéããããå¯èœæ§ããããŸãã
- Xcodeããªãå ŽåãXcodeã¯éããŸããïŒãã¹ã¿ãŒãŸãã¯éçºè ãXcodeãæã£ãŠããªããã©ããã¯çãããã§ãããããã§ãïŒã
- æ¢åã®çµ±åããŒã«ã®èããããå èš³ãåã³äœãæ°ãããã®ãæ±ãããšãåŠã¶ã
æ°ããxcresultã¯ã©ã®ããã«äŸ¿å©ã§ããïŒ
- Xcodeãä»ããŠãã€ãã£ãã«éããŸãã
- ããŒã«ã«ãããžã§ã¯ãããªãå Žåã§ããQAããã³éçºããååã«è»¢éã§ããŸãããã¹ãŠãéããå¿ èŠãªæ å ±ã衚瀺ãããŸãã
- ãã¹ãã®å®è¡ã«é¢ããå æ¬çãªæ å ±ãå«ãŸããŠããŸãã
- Xcodeã ãã§ãªãèªã¿åãããšãã§ããŸãã
ãã®èšäºã®æåŸã®ãã€ã³ãã«ã€ããŠã話ããŸãã
Xcodeã®å€éšã§XCResultãèªã¿åãã®ã¯ãªãã§ããïŒ
äŒç€Ÿã§CIïŒCDããã»ã¹ãèšå®ãããŠããå Žåã¯ããããžã§ã¯ããã«ããå®å®æ§ããã¹ãæ°ããããŠãã¡ãããã¹ãã«ãã¬ããžããŒã¿ã«é¢ããã¡ããªãã¯ãåéããå¯èœæ§ããããŸããã»ãšãã©ã®å ŽåãBambooãJenkinsãGithubã®ã©ããã§ããã¹ããCIã¹ããŒã¿ã¹ããŸãã¯ã«ãã¬ããžçãèœãšããŠããŸãããã®ãããªæäœãèªååããéã®ãªãæ©æ¢°ã«ç¿»åŒãããã®ãéäŸã§ããããã«ã¯ã©ã®ãããªããŒã«ããããŸããïŒ
Appleã¯ãæ°ãããã©ãŒãããã®ãªãªãŒã¹ãšãšãã«ãã¿ãŒããã«ããæäœã§ããxcresulttoolããã³xccovããŒã«ããªãªãŒã¹ããŸããã
xccovã䜿çšããŠäœãåŸãããšãã§ããŸããïŒ
xcrun xccov view --report --json /path/to/your/TestScheme.xcresult
ãªã¯ãšã¹ãã¯ããã¹ãŠã®ã¿ãŒã²ãããæã€ã«ãã¬ããžãã«ããŒãããã¡ãœãããšã¯ã©ã¹ãããããå®è¡ãããåæ°ãããã³å®è¡ãããè¡ã«é¢ããå æ¬çãªæ å ±ãè¿ããŸãããªããžã§ã¯ãã¯åæ§ã®æ§é ãæã£ãŠããŸããã«ãŒããã¿ãŒã²ããããã¡ã€ã«ãé¢æ°ã®åèš4ã€ã®ã¬ãã«ããããŸããã«ãŒããé€ããã¹ãŠã®ã¬ãã«ã«ååãã£ãŒã«ãããããŸãããã¹ãŠã®ã¬ãã«ã«coveredLinesãã£ãŒã«ããšlineCoverageãã£ãŒã«ãããããŸãããªããžã§ã¯ãã«ã¯ç¬èªã®ã³ã³ããã¹ããããããšã«æ³šæããããšãéèŠã§ããæ§é å šäœã¯ãããã€ãã®ãããã³ã«ã§èšè¿°ã§ããŸãã
ãããã³ã«ã«å ããŠã次ã®æ§é ã匷調ããŸããCoverageReport-ãã¹ãŠã®ã¢ã°ãªã²ãŒã¿ãŒãšã«ãŒãã Targetãªããžã§ã¯ãã®é åãå«ãŸããŠããŸããåã¿ãŒã²ããã«ã¯ãã¡ã€ã«ã®é åãå«ãŸãããã¡ã€ã«ã®é åã«ã¯é¢æ°ã®é åãå«ãŸããŸãããããã®ãªããžã§ã¯ãã¯ãäžèšã®ãããã³ã«ãå®è£ ããŸãã
lineCoverageãã£ãŒã«ãã«é¢å¿ããããŸããïŒfastlaneã®ããã«ïŒçŸããã¬ããŒããäœæããã«ã¯ãlineCoverageãã£ãŒã«ãã«ç§»åããåçŽãªé¢æ°ã§ãã¹ãŠã®ãªããžã§ã¯ãã調ã¹ãŸãã次ã®
ãããªãã®ãåŸãããŸãã
Coverage Report Summary: ⢠Utils.framework: 51,04 % ⢠NavigationAssistantKit.framework: 0,0 % ⢠NavigationKit.framework: 35,85 % ⢠Logger.framework: 20,32 % ⢠FTCCardData.framework: 78,21 % ⢠FTCFeeSDK.framework: 25,25 % ⢠ErrorPresenter.framework: 2,8 % ⢠MTUIKit.framework: 0,24 % ⢠AnalyticsKit.framework: 47,52 % ⢠EdaSDK.framework: 1,18 % ⢠Alerts.framework: 85,19 % ⢠Resources.framework: 39,16 % ⢠QpayApiTests.xctest: 88,37 % ⢠FTCFeeSDKTests.xctest: 97,91 %
PSã«ãã¬ããžãåéããã«ã¯ããã¹ãããŒã ã«-enableCodeCoverage YESãã©ã¡ãŒã¿ãŒãè¿œå ããããXcodeã®ã¹ããŒã èšå®ã§æå¹ã«ããå¿ èŠããããŸãã
xcresulttoolã¯ã©ã®ãããªæ©äŒãæäŸããŸããïŒ
å®éãxcresulttoolã«ã¯ããã»ã©å€§ããªã€ã³ã¿ãŒãã§ãŒã¹ã¯ãããŸããããxcresultã®æ§é ãç¥ã£ãŠããã°ãããããå€ãã®æ å ±ãåŸãããšãã§ããŸãããããŠãããã¯ã¯ãšãªãå®è¡ã§ããããŒã¿ããŒã¹å šäœã§ãã
ã€ã³ã¿ãŒãã§ã€ã¹èªäœã䜿ãå§ããããšããå§ãããŸãã
xcrun xcresulttool --help OVERVIEW: Xcode Result Bundle Tool (version 16015) USAGE: xcresulttool subcommand [options] ... SUBCOMMANDS: export Export File or Directory from Result Bundle formatDescription Result Bundle Format Description get Get Result Bundle Object graph Print Result Bundle Object Graph merge Merge Result Bundles metadata Result Bundle Metadata version XCResultKit Version
æ§é ãèªã¿åãã«ã¯ã次ã®ã³ãã³ããåŒã³åºãå¿ èŠããããŸãã
xcrun xcresulttool get --path /path/to/your/res.xcresult --format json
ããã§ãxcresultãã³ãã«ã®ãç®æ¬¡ããååŸããŸããäœãèµ·ãã£ãŠããããã©ã®ãã¹ããå®è¡ãããããã©ã®ãããã®æéãããã£ãããã¹ã¯ãªãŒã³ã·ã§ãããšãã°ã¯ã©ãã«ãããã³ã³ãã€ã©ã®èŠåã¯äœã§ããããç§ãã¡ã«ãšã£ãŠã®äž»ãªããšã¯ããã¹ãã«é¢ããæ å ±ãå«ããã¡ã€ã«èå¥åãååŸããããšã§ãã
xcrun xcresulttool get --path /path/to/your/res.xcresult --format json --id {id}
次ã«ããã¹ãã¿ãŒã²ããããã¹ãã®çš®é¡ãå«ããªããžã§ã¯ããååŸããŸãããããã¯ããã¹ãã¯ã©ã¹ãšãåãã¹ãã®ãã°ãã¹ã¯ãªãŒã³ã·ã§ãããå®è¡æéããã®ä»ã®æ å ±ãå«ãã¬ããŒããå«ããã¹ãã¹ãŒãã«åããããŸãã
æ®å¿µãªãããèµ€ããã¹ãã倱æããçç±ãç°¡åã«åŒãåºãããšã¯ã§ããŸããããã®ããã倱æãããã¹ãããšã«å¥ã®ãªã¯ãšã¹ããè¡ãå¿ èŠããããŸãïŒå®éã1ã€ã§ããããŸããïŒïŒ
倱æã®æŠèŠã§ã¯ãåããªã¯ãšã¹ãã䜿çšãããŸãã ïŒ
xcrun xcresulttool get --path /path/to/your/res.xcresult --format json --id {id}
ãã ããã¯ã©ãã·ã¥ãã°ã®å Žåã¯ããªã¯ãšã¹ããã--format jsonãåé€ããå¿ èŠããããŸããããã¯ãæååãããªãããããã©ãŒããã¿ãŒãæž¡ããšãã«ããŒã«ããšã©ãŒãçæããããã§ãã
次ã«ããã®èæ¯ç¥èãã©ããããïŒ
ãã¡ãããèªååããŠãã ããïŒãããã®ã³ãã³ããè©ŠããŠã¿ããšãçãã巚倧ã§èªã¿ã«ããããšãããããŸããèªååããæ¹æ³ã¯ïŒ RubyãPython ...ãŸãã¯SwiftïŒ
ãã¡ãããè¿ éã§ããçŸä»£ã®iOSéçºè ãªã誰ã§ããããç¥ã£ãŠããŸãããããžã§ã¯ãã¯Xcodeã§éãããããã°ãæ§æã®åŒ·èª¿è¡šç€ºã匷ãåä»ããå©çšå¯èœã§ããèŠããã«ã倢ïŒç¹ã«Swiftããã±ãŒãžãããŒãžã£ãŒã®ç»å Žã§ã
è¿ éã«ããã»ã¹ãèµ·åãããšã©ãŒããªãã¹ã³ããåºåãååŸã§ããããšã¯åšç¥ã®äºå®ã§ããæãåçŽãªã±ãŒã¹ã§ã¯ããã®ãããªæ§é ã§
ããŸãããããšãã§ããŸãã ããã§ããã§ã«äœ¿ãæ £ããxcrunxcovããã³xcrunxcresulttoolã䜿çšããŠXCResult圢åŒã調ã¹ãã ãã§æžã¿ãŸããããšãã°ããã¹ãã«ãã¬ããžãèªã¿åãã«ã¯ã次ã䜿çšããŸãã
ãããŠãXCResultã®ç®æ¬¡ãååŸããã«ã¯ãå®è¡ããå¿ èŠããããŸãã
ãããã倧åãªCoverageReportæ§é ãšXCResultæ§é ãååŸããã«ã¯ã©ãããã°ããã§ããããã
DataããæååãååŸããŸããããã¯ãæåã®Shellã³ãã³ãããè¿ãããã³ã³ãã³ããããã«é 眮ããŸãïŒ quicktype.ioã
ãã®ãµãŒãã¹ã¯ãå¿ èŠãªè¿ éãªæ§é ã«äŒŒããã®ãçæããŸãã確ãã«ãçµæãããã®ãŸãŸã䜿çšããããšã¯ã§ããŸãããçãã®æ§é ããã£ãšè©³ãã調ã¹ãŠãéè€ãæšãŠãå¿ èŠããããŸããããã«ããããããããã®ãããªäœæ¥ã¯é£ãããããŸãããäžèŠãªéšåãç Žæ£ãããã調æ»ãè¡ã£ãŠããã€ãã®åºæ¬çãªæ§æèŠçŽ ã匷調ããããšãã§ããŸãã
ããã«åºã¥ããŠãæ®ãã®æ§é ã説æããŸãã次ã«äŸã瀺ããŸãã
ãŸãã¯ãå®è¡ãå®è¡ãããã³ã³ãã¥ãŒã¿ãŒã«é¢ãããã®ãããªæ å ±ã§ããã次ã®ããã«ãªããŸãã
ããŠããããã©ã®ããã«äœ¿çšããã®ã§ããïŒ
ã¹ã¯ã¬ãŒããŒã®äœ¿çšæ¹æ³ã¯2ã€ãããŸãã1ã€ç®ã¯å®è¡å¯èœãã¡ã€ã«ã§ãããããã§Appleã®swift-argument-parserã©ã€ãã©ãªã圹ç«ã¡ãŸãããã®åã«ãåŒæ°ã®åŠçãèªåã§äœæãããã¹ãã§ã«ããŒãããµããŒãããå¿ èŠããããŸãããçŸåšããã®äœæ¥ã¯ãã¡ã³ãããä¿¡é Œã§ãã人æ°ã®ããå³æžé€šã«åŒãç¶ãããŠããŸãã
2ã€ã®ã³ãã³ãããããŸãããã¹ãã«ãã¬ããžã¬ããŒããååŸããããšãšãjunitãã¹ãã¬ããŒããçæããããšã§ãããããžã§ã¯ãããã«ãããŠãã€ããªãå®è¡ããå¿ èŠãªåŒæ°ãæž¡ãå¿ èŠããããŸãã
2çªç®ã®æ¹æ³ã¯ããã®ãããžã§ã¯ããã©ã€ãã©ãªãšããŠäœ¿çšããããšã§ãã KoronaPay補åã®çµã¿ç«ãŠããã¹ããåºè·ãæ åœãã倧èŠæš¡ãªCIãããžã§ã¯ãããããŸããããšãã°ãåæ Œãããã¹ãã®çµæã«åºã¥ããŠã次ã®ãããªãã¹ãã§ãã¹ãŠã®ã¢ãµãŒã·ã§ã³ã®å€±æãšã¯ã©ãã·ã¥ãæœåºã§ããŸãã
ãŸãã¯ãèµ€ããã¹ããååŸãããã©ã¹ã³ãåæããŠããããã®ã¿ãåèµ·åããŸãã
åæããæ¹æ³ã¯ïŒãã¹ãŠãåçŽã§ãããšåæã«ç°¡åã§ã¯ãããŸããããã¹ãã®å€±æã®çç±ã®è©³çŽ°ãååŸããã«ã¯ã倱æã®èŠçŽèå¥åã䜿çšããŠxcresultã«è¿œå ã®èŠæ±ãè¡ãå¿ èŠããããŸãã次ã«ãé害ã®æŠèŠããæ å ±ãæœåºããŸããçŸæç¹ã§ã¯ããã¹ãã§ã¯ã©ãã·ã¥ãæ¥ç¶ã倱ãããå Žåãæ¢ãæ¹æ³ãšãçç±ãåŒãåºãæ¹æ³ãåŠã³ãŸãããã¯ã©ãã·ã¥ãçºçããããšãç解ããã®ã¯é£ãããããŸãããããªãã¯ãã failureSummariesã§å¢èœãã倧åãªèšèãèŠã€ããå¿ èŠããããŸãã
ã¯ã©ãã·ã¥ã®åå ãèŠã€ããã®ã¯å°ãé£ããã§ãã
ããã§ãswiftã®åå°ã¡ã«ããºã ã圹ç«ã¡ãŸããããã¯ãå€å°å¶éã¯ãããŸããããã®åé¡ã解決ããã®ã«æé©ã§ãã kXCTAttachmentLegacyDiagnosticReportDataãšããååã®ãã¹ãŠã®Attachmentãªããžã§ã¯ããæ€çŽ¢ããŸãã
ReflectPropertiesã¡ãœããã«ã¯éæ³ã¯ãããŸãããããã¯Mirrorã®åçŽãªæ¡åŒµã§ã
ãèµ€ããã¹ãã®ãã1ã€ã®ã«ããŽãªã¯assertã§ããã¯ã©ãã·ã¥ãšã¯ç°ãªããããã§ãã¯ã©ãã·ã¥ã€ã³ããšããæååãåçŽã«æ€çŽ¢ããããšã¯ã§ããŸããããã®ãããªãã¹ãã¯ãæ¥ç¶ã倱ãããå Žåãè£ ãããšãã§ããŸããçç±ã
çªãæ¢ããã«ã¯ã次ã®ããã«TestCaseãªããžã§ã¯ãå ã®ããã€ãã®é åã調ã¹ãå¿ èŠããããŸãã ãã®ãããªæäœã®ããã«ãã©ã€ãã©ãªã«ã¯ãèµ€ããã¹ãã®æŠèŠãæäŸã§ããTestsInspectorãšã³ãã£ãã£ããããŸãããããã£ãŠãèµ€ããã¹ãã¯ã¬ããŒãã®ç¹æ§ããšã«ã°ã«ãŒãåãããŸãã
çµè«ã®ä»£ããã«
ãã®åéã®æ¢åã®ãã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ãšåæ§ã«ãåœç€Ÿã®ã¹ã¯ã¬ãŒããŒã¯xcresultãåæããããã®ç¶²çŸ çãªããŒã«ã§ã¯ãããŸããããã¹ãŠã®æ å ±ãååŸããŠã¹ã¯ãªãŒã³ã·ã§ããã衚瀺ããã«ã¯ãXcodeãä»ããŠxcresultãéãå¿ èŠããããŸãããã ããCIãæ§æããŠããŠããã¹ãçµæããã°ãã確èªãããå Žåã¯ãjunitãšxcscrapperã®çµã¿åãããçã®äŸ¡å€ã§è©äŸ¡ã§ããå¯èœæ§ããããŸãã