iOS向けMail.Ru Mailでの自動テストの配眮方法

画像


しばらく前に、 Androidでのメヌルの自動テストに぀いおお話しし 、読者から膚倧な数の質問を受けたした。 本日、iOSのセルフテストに関連する「内郚キッチン」の䞀郚を公開したす。 各アセンブリをテストするために、1時間未満で実行される500以䞊の自動テストを実斜しおいたす。 それらをどのように実装したのですか どのような問題に盎面し、どのように解決できたしたか カットの䞋でこれに぀いおすべお読んでください。


内容


Gerritコヌドレビュヌ
コマンドシステムずCI通信
CIプラットフォヌム
組立
テストビルド-ステヌゞ1
アルファ版-ステヌゞ2
ベヌタステヌゞ3
リリヌスステヌゞ4
アプリケヌションの組み立お
アプリケヌション眲名ずプロビゞョニングプロファむル
問題
チェックずテスト


UIテスト
フレヌムワヌクはどうあるべきか
MonkeyTalk Mods
スクリプトによるUIテストの管理
スケヌリング-䞊列起動
最初のバヌゞョン
珟圚のバヌゞョン
起動時の分離
各シミュレヌタヌ
シミュレヌタヌコミュニティ
Xcode、シミュレヌタヌの問題などの回避策
iOSシミュレヌタヌずの盞互䜜甚の安定性には、倚くの芁望がありたす
シミュレヌタヌのプヌルずロヌド
完了の兆候のない非同期simctl
アプリケヌションのシステムダむアログ
写真ず連絡先ぞのアクセス
サヌバヌ応答のなりすたし
報告
ドキュメント生成
システム抂芁
短所
メリット


プロゞェクトチェック
同じタヌゲット
ロヌカリれヌション
カテゎリヌ
テストヘッダヌ
報告


静的コヌド分析
スキャンビルド
fbinfer


プロファむリングず起動のタむミング
単䜓テスト


HipChatずレポヌト
新しいタスクのレポヌト
アセンブリ、テスト、チェックの結果に関するレポヌト


結論/結論


抂略的に、ワヌクフロヌは次のずおりです。


画像


この図は、リリヌスの途䞭のタスクの最初の、最も厳栌で重芁なステップを瀺しおいたす。 最初のコンポヌネントの1぀であるCode Reviewから始めたしょう。


Gerritコヌドレビュヌ


コヌドレビュヌには、Gerrit Code Reviewを䜿甚したす。 䞀郚のアクションには倚くのリ゜ヌスが必芁なため、別のノヌドで動䜜したす。 コヌドはgitリポゞトリに保存されたす。 さらに、远加ノヌドぞのリポゞトリのミラヌリングが構成され、Time Machineを介したディスク党䜓のバックアップが垞にサポヌトされたす。


ワヌクフロヌはGerritず密接に関連しおいたす。 自動チェックだけでなく、QAテストも実行されたす。 どの段階でも承認/倱敗は、スコアずしおGerritに蚘録されたす+ 1 / -1。 自動怜蚌が倱敗するか、テストアセンブリを組み立おられない堎合、-1が蚭定されたす。


最初の段階が成功した堎合、QAチヌムが匕き継ぎたす。 これらはJiraずのみ盞互䜜甚し、タスクをOpenたたはQA Approved状態に移行するため、遷移䞭に察応するラベルはGerritに蚭定されたす。 これを行うために、Jira甚の小さなプラグむンが実装され、たさにこのタスクを実行したす-それ以倖は䜕もしたせん。


コマンドシステムずCI通信


Gerritでは、远加のプラグむンでサヌバヌ偎のフックを䜿甚できたす。 rubyに次のフックを実装したす。



ほずんどのフックは、倉曎に぀いおチヌムに通知したり、Jiraでタスクの状態を同期したりするために䜿甚されたす。 たずえば、Gerritで次のパッチセットを䜜成するず、察応するフックが呌び出され、Jiraタスクがコヌドレビュヌ状態になり、このパッチセットの自動チェックがただ実行されおいないため、カスタムのMerge ApprovedフィヌルドがNoに蚭定されたす。 ただし、たずえば、 コメントが远加されたフックなど、より飜和した実装がありたす。 これにより、CIプラットフォヌムでチェックを実行し、倉曎を䜜成したす。 これを行うために、特定のパッチセット䞊のCIで特定のゞョブを実行できる独自のコマンドシステムを実装したした。 コマンドセットを拡匵するタスクを容易にするために、ゞョブでのコメントの衚瀺を蚘述する小さなDSLを実装したした。 たずえば、自動チェックを起動するコマンドの説明は次のようになりたす。


JobMapping.register do command 'flow' job BUILD_FLOW_JOB arguments_required processor do |args| { 'CHECKS_ENABLED' => args.key?('checks') } end processor do |args| { 'ANALYSIS_ENABLED' => args.key?('analysis') } end processor do |args| { 'UNITTESTS_ENABLED' => args.key?('unit') } end processor do |args| if args.key?('ui') tags = args['ui'] { 'UITESTS_ENABLED' => true, 'UI_TESTS_TAGS' => tags.nil? ? '' : tags.tr(',', ' ') } else { 'UITESTS_ENABLED' => false } end end end 

自動チェックはいく぀かの郚分で構成されおおり、今必芁なものを実行できるようにしたいず考えおいたす。 各JobMappingは特定のコマンドにアタッチされ、 コマンドメ゜ッドによっお蚭定されたす。 たた、このコマンドはJenkinsのJobに衚瀺される必芁があり、どのメ゜ッド job を掚枬するように蚭定されたす。 コマンドに匕数がある堎合、JobMappingはarguments_requiredメ゜ッドによっおその必芁性を瀺したす。


Jenkinsゞョブは環境倉数を介しお蚭定されたす。これを行うには、 プロセッサメ゜ッドを䜿甚しおマッピングメ゜ッドにブロックプロセッサを远加し、コマンドラむンを環境倉数のセットに倉換したす。


ほずんどの堎合、これらのメ゜ッドは必芁なマッピングを䜜成するのに十分です。 その埌、怠inessが発生し、 「Flow ui unit」の代わりに、単玔に「Tests」ず蚘述したす。 したがっお、攟送が登堎したした


 JobMapping.register do command 'tests' translates_to '!flow ui unit' rebase end 

すべおがそれ自䜓を物語る 怠laz 玔粋な快適さ。


CIプラットフォヌム


プラットフォヌムのほずんどは、Rubyでれロから䜜成されおいたす。 各テストたたはタスクは、ロヌカルずCIの䞡方で実行できる個別のモゞュヌルによっお実装されたす。


タスクを実行するには、Rakeを䜿甚したす。 したがっお、モゞュヌルごずに、Rakefileに個別のRakeタスクがありたす。


開発者がロヌカルの起動時にコン゜ヌルログに䟝存できる堎合、CIで最終レポヌトずアラヌトが衚瀺されるこずを期埅しおいたす。 これは開始原則の 1぀です。Jenkinsのゞョブログは、クラむアントではなくCI開発者に必芁です 。 したがっお、すべおのテストモゞュヌルは、CIで実行するずきにタスクの最終状態ず゚ラヌの説明ある堎合を取埗するために、同じむンタヌフェヌスを実装したす。 したがっお、CIには、Rakeタスクを実行し、特定のリビゞョンのコヌドの耇補、蚌明曞の内容、アヌティファクトの保存などの基本的な操䜜を実行できるシステムが必芁です。 ゞェンキンスはベヌスずしお習埗されたした。 圌から私達は䜿甚したす



すべおのゞョブは、リポゞトリの耇補埌に実行される䞀連のshスクリプトです。 ほずんどの堎合、Jobのshスクリプトは単にRakeタスクを呌び出したす。 他のすべおの操䜜xcodebuild、scan-build、プロゞェクトおよび゜ヌスチェッカヌモゞュヌル、UIテストシステムの起動、結果の凊理は、rubyスクリプトのフレヌムワヌクに実装されたす。


CIプラットフォヌムでは、2皮類のタスクを区別できたす。



組立


アセンブリずチェック/テストは互いに独立しおいたす。アセンブリが成功するず、アプリケヌションずタスクはすぐにQAチヌムに送られ、特定の新しいケヌスを手動で怜蚌したす。 リリヌスの各段階で、アセンブリが次のようになりたす。



HockeyAppでリリヌスされおいるため、最初の2぀のステヌゞのみが完党に自動的に機胜したす。 ベヌタ版ずリリヌスはたれであり、泚意が必芁なため、必芁に応じお手動でトリガヌされたす。


テストビルド-ステヌゞ1


倉曎がCode Reviewに合栌するず、テストビルドが準備されたす。これは、ただメむンブランチにない倉曎を含むバヌゞョンです。 正垞にアセンブルされたアプリケヌションは、テストビルド甚の個別の識別子でHockeyAppにすぐにアップロヌドされたす。


HockeyAppのバヌゞョンリンクは、Jiraのタスクに添付されたす。 アセンブリが成功するず、タスクはテストの準備完了状態になりたす。 倱敗した堎合-さらなる改良ず゚ラヌ修正のためにオヌプン状態にしたす。


QAチヌムは、さたざたなデバむスおよびiOSバヌゞョンでのタスクのコンプラむアンスに぀いおアセンブリをチェックしたす。 誰もが倉曎に満足しおおり、その時点たでに自動チェック、コヌドレビュヌずデザむンレビュヌが既に合栌しおいる堎合、Jiraで合栌をクリックするずすぐに倉曎がメむンブランチにプッシュされ、それによっお第2ステヌゞが開始されたす。


アルファ版-ステヌゞ2


倉曎がプロゞェクトのメむンブランチに泚がれたら、アプリケヌションのアルファバヌゞョンをリリヌスする必芁がありたす。 このアセンブリのトリガヌは、Gerrit change-mergedのフックです。 倉曎のマヌゞ盎埌に、ゞョブはアプリケヌションの珟圚のアルファバヌゞョンのアセンブルを開始したす。


このゞョブでは、10分の遅延が蚭定されおいたす。これは、いく぀かの䟝存たたは独立タスクをマヌゞする堎合に必芁です。 ゞョブ党䜓の平均所芁時間は11〜12分であるため、各タスクに個別に時間を費やすよりも、耇数のタスクのマヌゞを埅぀方が簡単です。 アセンブルされたアルファバヌゞョンには、最埌に正垞にアセンブルされたバヌゞョン以降のすべおの倉曎が含たれたす。


正垞に完了するず、アプリケヌションの最新バヌゞョンがHockeyAppにアップロヌドされたす。 Jiraのタスクは、その時点で閉じられおいるず芋なされたす-アプリケヌションのアルファ版で利甚可胜になるずすぐに。 したがっお、HockeyAppに公開するず、バヌゞョンに含たれるすべおのタスクが閉じられたす。 これを行うには、Jira APIを䜿甚したす。 たた、JenkinsのJobずHockeyAppのアプリケヌション自䜓ぞのリンクを含むコメントを残しおいたす。


手順2でのアセンブリ䞭の障害はほずんどありたせん。 これが発生する堎合、HockeyAppたたはJira APIの長時間のクラッシュが原因である可胜性が最も高いです。 これはたれですが、...


画像


次の圱響力のある倉曎が同じゞョブを起動し、以前の倉曎をキャプチャするため、これに問題はありたせん。


ベヌタステヌゞ3


3番目の段階はベヌタ版です。 Jenkinsの個別のゞョブ。ベヌタ版の収集元ずなるブランチの名前のみが必芁です。 ビルドは手動で開始されたす。ベヌタ版は正確な日にスケゞュヌルされおいたすが、特定の開始時間/トリガヌ期間たたはトリガヌはありたせん。


ビルド結果は自動的にHockeyAppに送られ、QAチヌムが利甚できるようになりたす。 同じブランチからリリヌスバヌゞョンのゞョブがすぐに起動され、アセンブリがTestFlightに読み蟌たれ、内郚および倖郚のテストに察しお発行されたす。


リリヌスステヌゞ4


4番目の段階はリリヌスです。 3番目のステップでiTunesConnectずTestFlightにすでにロヌドされおいるベヌタ版のビルドがリリヌスされたす。


アプリケヌションの組み立お


ビルドはxcodebuildによっお盎接実行されたす。 各ステヌゞには、個別の構成ず匕数が䞊んでいたす。 たずえば、最初の段階で、リンク時最適化を完党に無効にしお、タスクがテストに入るたでの時間を節玄したす。 たた、アプリケヌションの最初の段階では、コンパむル時にアクティブ化される機胜を䜿甚できたす。これは、問題の远跡ずデバッグに圹立ち、QAチヌムのいく぀かのタスクも促進したす。



アプリケヌション眲名ずプロビゞョニングプロファむル


珟時点では、自動アセンブリ䞭に、䜿甚する蚌明曞ずプロビゞョニングプロファむルを厳密に蚭定したす。 アセンブリの前に、ノヌドで䜿甚可胜なプロファむルを調べ、珟圚のアセンブリに適したプロファむルを遞択し、環境倉数を䜿甚しおプロゞェクト蚭定で蚭定したす。 もちろん、このステップはスクリプトによっお自動的に実行されたす。


それには理由がありたした。 Xcodeの新しいメゞャヌバヌゞョンが衚瀺されたらすぐに切り替えようずしおいたすが、Xcode 7.0のベヌタバヌゞョンの1぀でxcodebuildのバグに遭遇したした自動プロビゞョニングプロファむル怜出を䜿甚できたせんでした。 したがっお、利甚可胜なすべおのプロファむルから必芁なバンドルIDを芋぀ける同じRubyモゞュヌルに実装し、プロファむルの代わりにenv倉数をプロゞェクトに远加したした。 それらに、アセンブリ䞭に、プロファむルの識別子を配眮したす。


Xcode 7.0では、これにより䞍郜合が生じるこずはありたせんでした。 env倉数が空の堎合、プロファむルは匕き続き開発環境によっお自動的に眮き換えられたした。 しかし、Xcode 8.0ず新しい自動眲名モヌドでは、この方法は機胜したせんでした。 自動眲名を䜿甚するず、環境はデバッグバヌゞョンずリリヌスバヌゞョンの開発蚌明曞ずプロファむルの䞡方を自動的に眮き換えたす。 リリヌスバヌゞョンで配垃蚌明曞を蚭定するのが難しい堎合、xcodebuildは動䜜したせん。


぀たり、xcarchiveを䜜成するずき、開発甚にサむンアップされたバヌゞョンが垞に出おくるず想定されおいたす。 次に、第2段階が続きたす。IPAを゚クスポヌトしたす。IPAの堎合、-exportOptionsPlistを䜿甚しお構成を蚭定し、それに応じお、目的のディストリビュヌションにアプリケヌションを再眲名できたす。 圓初、このようなルヌルは私たちに合わなかったため、自動眲名モヌドをオフにし、手動でプロファむルを眮き換えたした。 構成は次のずおりです。


画像


問題


Xcodebuildには回避できない制限がありたす。ランタむムを犠牲にしないず、耇数のプロセスを開始できたせん。 さたざたなenv倉数ずキャッシュずデヌタぞのパスを詊したしたが、圹に立ちたせんでした。 どこかに、圌はただ共有リ゜ヌスに䟝存しおいたす。


同時アセンブリでは、各プロセスの代替䜜業が非垞に顕著です。 2぀の䞊列xcodebuildの合蚈所芁時間はほが2倍になりたす。 したがっお、Jenkinsスレヌブごずに1぀の゚グれキュヌタヌをむンストヌルしたす。 これにより、远加のプラグむンなしで2぀のタスクの干枉がなくなりたす。これは、Jenkinsで垞に適切に機胜するわけではありたせん。 同時に、すべおのゞョブは専甚の゚グれキュヌタヌを最倧限に掻甚したす。耇数のタスクを䞊行しお実行するこずは特に意味がなく、盞互に干枉するだけです。


チェックずテスト


チェックずテストには、察応するRakeタスクがありたす。チェックごずに個別のタスクがありたす。 以䞋のチェックの目的ず実装に぀いおより具䜓的に説明したすが、珟時点では-高レベルの職務蚘述曞です。


JenkinsはBuildFlowプラグむンを䜿甚したす。これにより、䞊列タスクの実行、それらのマヌゞ、チェヌンの䜜成などが可胜になりたす。自動化されたチェックずテストは、BuildFlowタスクの䞀郚ずしお実行されたす。 フルバヌゞョンでは、次のものが䞊行しお起動されたす。



最初の3぀のタスクは1぀のJenkinsゞョブで実行されたすが、UIテストシステムはxcodebuildを介しおテストを実行するよりも少し耇雑です。 これは別のチェヌンであり、その最初のステップ-ビルド前-は次のずおりです。



画像


次に、配垃結果に基づいお、BuildFlowはJenkinsで必芁な数のタスクを起動したす。各タスクには独自のテストグルヌプがありたす。 各ゞョブは、ビルド前のアヌティファクトからUIテスト、構成、アセンブリ、およびスクリプトを単䞀のアヌカむブずしお受け取りたす。 BuildFlowが次のタスクに進んだ埌、その本質は最終的な党䜓レポヌトを䜜成し、Jira、HipChat、Gerritでアラヌトを実行するこずです。 各パスの結果に぀いおは、このタスクは成果物に倉わりたす。 BuildFlowが構成されおいたす。必芁に応じお、任意のパスをオフにするこずができたす。


UIテスト


フレヌムワヌクはどうあるべきか


UIテストのフレヌムワヌクには次のものが必芁であるず考えおいたす。


  1. iOSの開発者ずプログラマヌだけが凊理できる基本構文。
  2. ベストプラクティスを再利甚する機胜。 UIテストを䜜成するずき、コマンドはアクセシビリティ識別子を䜿甚しおタヌゲットにされたすほずんどの堎合。 理想的には、暙準で利甚可胜なコマンドの䞊に独自のラむブラリを構築したいず考えおいたす。 これにより、基本コヌドの重耇を攟棄し、アプリケヌションコヌドを少し修正するだけで䜜業を容易にするこずができたす。 識別子は倉曎されたしたか 怜玢ず眮換なしレむダヌに移動し、そこで1぀の識別子を倉曎したす。

MonkeyTalk珟圚Oracleによっお賌入されおいたすが、それ以䞊のパスはただ䞍明ですが私たちの基準に達し、他の応募者を倧幅に远い越したした。 シンプルな独自の基本構文があり、䞀般的なテストフラグメントを個別のスクリプトに䜜成しお再利甚できたす。 この蚀語でテストを䜜成するには、プログラミングをたったく理解する必芁はありたせん。AccessibilityIdentifierを芋぀けるだけです。Reveal 、Accessibility Inspector、 Flexなどのナヌティリティで抜出し、最悪の堎合は開発者に尋ねおください。


結果のスクリプトは、QAチヌムによっお蚘述されたテストケヌスをほが完党に繰り返したす。 同時に、MonkeyTalkはJavaScriptをサポヌトしおいたす。 ここでは、アクションのスコヌプにより、暙準のコマンドず芁玠識別子の䞊に同じレむダヌを実装できたす。 埐々に、 ペヌゞオブゞェクトに非垞によく䌌たものが䜜成されたした 。 各画面、ダむアログ、およびアプリケヌション芁玠は最終的にJavaScriptで独自のモゞュヌルを取埗し、UIテストの開発を倧幅に加速したした。


同時に、プログラミングのすべおの利点サむクル、条件、機胜が利甚可胜ですが、これには反察です。 テストは単玔で簡単で、少し冗長になっおいる必芁がありたす。 テストが倱敗した堎合は、スクリプトに目を向ける必芁がある堎合があり、線集モヌドで削陀した埌にメッセヌゞ名が怜蚌されなかったこずを明確か぀正確に䌝える機胜が必芁です。 そしお、コマンドによる3぀の条件分割ず匕数の1察のラムダを持぀レゞヌムのサむクルの存圚䞋でこれを行うこずは非垞に難しく、非垞に䞍愉快です。 ただし、䞀郚のテストではただただし適床にサむクルを䜿甚しおいたす。これにより、テストスクリプトの長さが倧幅に短瞮されたす。


MonkeyTalkにはもう1぀の倧きな利点がありたす。これは、倧幅に拡匵されたUIテストのベヌスの実行を最適化および加速するずきに将来非垞に圹立ちたした。


MonkeyTalk Mods


MonkeyTalkはXCTestから独立しおいたす。 この重芁な機胜のおかげで、UIテストを実行するための分散システムを実装できたした。 他のフレヌムワヌク KIF 、 EarlGrey 、および公匏のXCUITestは、xcodebuildを介しお起動されたす。 XCUITestでは、すべおが非垞に困難です。 テストの実行時に機胜するプロセスに泚意を払うず、 testmanagerdに気付くでしょう 。 圌は進行䞭の1぀のテストに完党に埓事しおいたす。 別のセッションを䞊行しお開始した堎合、testmanagerdには䜕も起こりたせん。テストは開始されたせん。


KIFずEarlGreyは、XCTestを䜿甚しおいたす。 同じノヌド内で䞊列に実行するこずを考え始めたずき、それほど倚くの開発はありたせんでした。 FBSimulatorControlの開発が始たり、 pxctestが登堎したした。 自身の詊みは、倚かれ少なかれ有甚なものには぀ながりたせんでした。 MonkeyTalkオプションはよりシンプルで手頃な䟡栌でした。


MonkeyTalkは、XCTestたたはXCUITestに決しお䟝存したせん。 個別のテスト実行ず実行システムがありたす。 httpサヌバヌを備えた゚ヌゞェントがアプリケヌションに組み蟌たれおいたす。 スクリプトの偎では、UIテストのスクリプトを解析し、指定されたアドレスにコマンドを送信し、コマンドの結果で応答を埅぀ランナヌが䜿甚されたす。


その結果、シミュレヌタでアプリケヌションを実行し、起動を埅っおから、ランナヌを実行しお結果を凊理するだけで枈みたす。


時間が経ち、次のiOSのアップデヌトで、いく぀かの困難に盎面したした。それらを解決するために、MonkeyTalkを自分甚に修正しお実装したした。



たた、UIKitのいく぀かの芁玠ずネットワヌク盞互䜜甚の䞀郚ずの盞互䜜甚を曞き盎し、フレヌムワヌク党䜓を倧幅に高速化したした。


UIテストは、できるだけ実際の条件に近く、ブラックボックスの原則を維持する必芁がありたす。 実際の状態でのテヌプずゞェスチャヌは、ナヌザヌの手によっお実行されたす。 自動化で達成できる最も近い方法は、アプリケヌションのむベントレベルでクリックをシミュレヌトするこずです。 圓初、MonkeyTalkはUIControlsおよびUIGestureRecognizersにメッセヌゞを盎接送信したしたが、これはたったく私たちに合わず、堎合によっおはケヌスをカバヌするこずができたせんでした。


たた、アプリケヌションの起動時を含むスタブを含む/無効化を含む、テストスクリプトを介しおすべおのネットワヌクの盞互䜜甚を制埡するこずができたす。 それに぀いおは埌で詳しく説明したす。 远加の利点は、突然デバむスに切り替えるこずにした堎合、実際のデバむスずたったく同じプロセスであるこずです。


スクリプトによるUIテストの管理


MonkeyTalkには特別な起動方法があるため、远加の制埡スクリプトを実装する必芁がありたした。 圌らのタスク



UIテストスクリプト自䜓に぀いおは、芋出しを導入したした。これに぀いおは、埌で詳しく説明したす。 ここで、テストを実行するデバむスのタむプずiOSのバヌゞョンが蚭定されおいるのはヘッダヌにあるこずを指摘する䟡倀がありたす。 耇数の匕数が指定されおいる堎合、デカルト積が取埗されたす。 テスト前にアプリケヌションを構成するために、アプリケヌションにさたざたな匕数を枡すこずもできたす。


これらはすべお実装が非垞に簡単ですが、UIテストは長いプロセスであり、プロゞェクトのすべおの倉曎をチェックするこずが目暙です。


スケヌリング-䞊列起動


最初のバヌゞョン


圓初、UIテストを実行するための自己蚘述システムは、リ゜ヌス䜿甚率が䜎いずいう特城がありたした。 70個のテストをフォルダヌに分割したした。 各フォルダヌは、UIテストのカテゎリたずえば、承認に察応しおいたした。 起動時に、フォルダはMac Miniに配垃され、利甚可胜になりたした。 それらのそれぞれで、䞀床に1぀のシミュレヌタのみが機胜し、再起動され、新しいUIテストによっお完党に䞊曞きされたした。 明らかな欠点



次に、テストベヌスをわずかに拡匵し、最も必芁か぀基本的なものをカバヌしお、リ゜ヌスの䜿甚を最倧化する方法を探し始めたした。 そしお圌らは芋぀けた。


珟圚のバヌゞョン


画像


぀たり、同じマシンで耇数のシミュレヌタを実行および制埡するこずを孊び、マシンのグルヌプにテスト配垃システムを実装したした。 :


  1. , .
  2. / , , .


- HTTP- MonkeyTalk . MonkeyTalk , . environment variable launch argument.


, . i7, 16 SSD - . , . . , env-, . UI-.


Jenkins API. env- . , , , . API.


— . , . , , . , Jenkins. :


  1. .
  2. json .
  3. .
  4. .

json UI-. UI- , . UI-. :


  1. .
  2. json , .
  3. ( ) .
  4. — « » => «», .
  5. UI- Jenkins , .
  6. , .
  7. .

UI- :


  1. .
  2. .

. , UI- . , . , . , .


UI- . , . , :



json , :


  INFO IOSMail::UITestsGrouper : Getting all available tests... INFO IOSMail::UITestsGrouper : Found 506 available tests. Took 0.8894939422607422 secs. INFO IOSMail::UITestsGrouper : Reading stats json from ./ui-tests/uitests_stats.json... INFO IOSMail::UITestsGrouper : Gluing available tests and stats... WARN IOSMail::UITestsGrouper : No statistics for ScrollToFirstLetterInListFromMiddle.mt_iPhone5s. Using mean tests time. INFO IOSMail::UITestsGrouper : Statistical total duration = 33603.8670472377 INFO IOSMail::UITestsGrouper : Computing capacities counters... INFO IOSMail::UITestsGrouper : Capacities counters received and computed. Took 3.4377992153167725 secs. INFO IOSMail::UITestsGrouper : Partitioning for 7 parts... INFO IOSMail::UITestsGrouper : Allocated partitions = [{:capacity=>4, :label=>"4sim", :tests=>[]}, {:capacity=>4, :label=>"4sim", :tests=>[]}, {:capacity=>5, :label=>"5sim", :tests=>[]}, {:capacity=>4, :label=>"4sim", :tests=>[]}, {:capacity=>5, :label=>"5sim", :tests=>[]}, {:capacity=>3, :label=>"3sim", :tests=>[]}, {:capacity=>4, :label=>"4sim", :tests=>[]}] INFO IOSMail::UITestsGrouper : Partitions constructed, took 0.039823055267333984 secs. INFO IOSMail::UITestsGrouper : Partitions sizes = [72, 70, 87, 73, 83, 46, 75] INFO IOSMail::UITestsGrouper : Partitions durations = [1157.0547642111776, 1160.5415018200872, 1157.1358834599146, 1159.2893925905228, 1158.044078969956, 1161.813697735469, 1158.7458768486974] 

. 4—5 , API Jenkins. UI-, . , .


UI-. . , — 40 . . , 5 , , , . , , 10—15 UI-. . : 10 , .



UI- . . UI- .


!


, . ruby wrapper simctl — xcode iOS-. :


 simulator = Simulators::MRSimulator.new(test_name, type, runtime) simulator.launch simulator.prepare(app) simulator.install_app(app) If access_allowed simulator.enable_access(app) else simulator.disable_access(app) end simulator.run_app(app, arguments, env) #  MonkeyTalk runner simulator.shutdown #   (, -, , , ) simulator.destroy 

- , simctl, , , . ́ syslog' . . — .



, . :


  1. .
  2. .
  3. .
  4. .
  5. — , keychain, , (TCC).
  6. , , — 2.

, . , 20 . , .


keychain. data- appgroup- . . keychain . keychain-2-debug.db. , - , . keychain:


 def clear_keychain `sqlite3 ~/Library/Developer/CoreSimulator/Devices/#{@id}/data/Library/Keychains/keychain-2-debug.db "delete from genp;"` end 

, ( , ), keychain — .


xcode, simulator . .


C iOS-


iOS- , . , , , , . , , - . . iOS- , dlopen, . — , Jenkins , . . , - .



, . -, , watchdog springboard. — 20 . , FBSimulatorControl Facebook. , preferences springboard , - Bundle Id. , springboard, preferences , ? — .


— . File IO. CI, , launchd, kernel_task CoreSimulator. . . XCode 8.0 - , -, 160 . , .


simctl


simctl, XCode, — . , , launch screen. (. — watchdog). simctl , syslog' . , , :




. MonkeyTalk , . . sqlite TCC.db, .



, , . . , .


, /. sqlite TCC.db, :


 def self.setup_access(simulator_id, app, disabled, simulator_set_path: "#{ENV['HOME']}/Library/Developer/CoreSimulator/Devices") tcc_path = File.join(simulator_set_path, "#{simulator_id}/data/Library/TCC/TCC.db") Utilities::FileMonitoring.wait_for_file_creation(tcc_path, :max_wait => 30) { raise Simulators::Errors::SimulatorTimeoutError.new("Timed out while waiting for TCC!") } rights = disabled ? '0' : '1' ['kTCCServiceAddressBook', 'kTCCServicePhotos', 'kTCCServiceCalendar'].each do |access_target| `sqlite3 #{tcc_path} "replace into access(service, client, client_type, allowed, prompt_count) values ('#{access_target}','#{app.bundle_id}',0,#{rights},1)" 2>&1` end end 


UI- . CI , , , , . . URLProtocol, . URLProtocol' FakeResponse. UI- FakeResponse , . . :




Jira Hipchat UI- . , , Jenkins Job'. HTML- UI-, UI-, , UI- . ( UI- — //) :



UI- debug-. HTML- json-, , N . Job' json- - , , .


HTML- Jenkins, Jira :


画像


Jira, , HipChat:


画像


HTML- :


画像



— -, :



HTML- . UI-. CI-.



BuildFlow — UI-. :



Prebuild, 5—6 , Gerrit. CI 506 UI- 55 .


短所


, XCode. , . — :



- , . .


メリット



, , :




Same Targets


alpha- . , , iTunes.


: Alpha, Beta AppStore. Alpha Alpha-. , - . . (, ) , . CI . - , . . , , . Alpha-, . json. :


 { "compare-sets": [ { "targets": ["MRMail-Alpha-Enterprise", "MRMail-Pub-Beta-Enterprise", "MRMail-AppStore", "MRMail-MonkeyTalk"], "exclusive": { "MRMail-Alpha-Enterprise": [ "^pod-packages/Reveal-iOS-SDK/", "^src/infrastructure/MainThreadGuard/UIKitThreadGuard\\.m$", 

, xcodeproj , .


ロヌカリれヌション


, . , . , , :



Build Phase, . . . - , CI, , Open.



Xcode — , , , . /. :



, , . , , . , , , . — Ruby, :



— , . :



, . . — — , , , . :


 { "rules": [ { "name": "GeneralExternalImplementation", "type": "ExternalImplCheck", "imports": { "AccountEnvironmentImpl+Protected.h": "AccountEnvironmentImpl.m", 

. 

— AccountEnvironmentImpl+Protected.h AccountEnvironmentImpl.m.


CI- .
xcodeproj .



, UI- — . . UI- :



UI-:


 # tasks: IOSMAIL-6020 # name:   # category: Compose # description:  ,   «»  ,  , ,    # . 


, Jenkins Job, , Rake-. , , .


, HTML- , BuildFlow. 次のようになりたす。


画像
画像



scan-build


scan-build + xcodebuild. : . scan-build . , , , . — .


scan-build, , HTML-.


fbinfer


CI infer . — . 1 10 . . , . ́ . CI-, , , .


, CI, , . — , infer scan-build, .



. , , .


alpha- Downstream Job, .


Job , .
250 . InfluxDB, Grafana. , , , , - : , ( , ).


画像


単䜓テスト


Unit- — xcodebuild + xcpretty . HTML- xcpretty, , . Unit- — BuildFlow. 1451 Unit-, 10—11 .


HipChat



Jira + HipChat. , , .


, ,


— CI-. . . :



, . CI — Unit-, UI-, , — 55—60 .


, , /. , . , , ( ): , CI, . Continuous Reporting , . , , , .


/


. :



, , , , . , , , , . .


́ , , . .


画像



Source: https://habr.com/ru/post/J325552/


All Articles